mixtools/0000755000175100001440000000000014763003312012145 5ustar hornikusersmixtools/MD50000644000175100001440000002777314763003312012475 0ustar hornikuserse2e3779fff68712932816cd71f051e15 *DESCRIPTION 9966bf4ceb520ccd6daf862c72d27578 *NAMESPACE 42d2dea1ac3c0b7ed39c7fe3e1d7caac *NEWS b5e2b87ba9803aa4f1f8770641aa301c *R/FDR_spEM.R 96eb008edd1ebc2806b5434abec323b8 *R/WeibullRMMSEM.R 13dd98fd3d2a18d733dc7c1bb00cbd4a *R/augx.R f18b7cd3707169418f6cd7be7583425d *R/bootcomp.R 30953093ca9c5aaf02e0e8102230a94d *R/bootse.R 99dbcce1ed200436d59d035818a844da *R/compcdf.R e2442e00a19de3f3c7d1b2938e61bc2f *R/ddirichlet.R 059b14e5defb7a753aa97dad8c53606d *R/density.npEM.R dda8c96267a045f0ee6517786c06aaa2 *R/density.spEM.R c5ee44461e73caf8c367228400d7b102 *R/depth.R 7b34ff227996abf53f08d4d56935e340 *R/dmvnorm.R 5af58056044f75475f0e3f863457e04b *R/ellipse.R c6208248803f53a4da829615db3d66b4 *R/expReliabilityMixEM.R c5f3c7e90d2a3179dfbecdd4b6478e25 *R/flaremixEM.R 1699b871b012d5d18651764f7bba238b *R/flaremixinit.R 2cd9f3978d6ea6e563f96a282277b68e *R/gammamixEM.R a056a87a053c20e07e96f00163294a98 *R/gammamixinit.R 6e2e3de7fab7712a39e4a8b119c5e3d7 *R/hmeEM.R 7d443f685764995488abbb46a0ea0b98 *R/ise.npEM.R ae96a525e363c5cf8bb2050f3804f02e *R/kernB.R 17f792c11412089cec2137163f3ad16b *R/kernC.R faadc75b1c05a357cf1a5521a552721b *R/kernG.R 80ee6842adac9ecdada0a80616145082 *R/kernO.R ed42f2f65c534b3934113cf175ed2cae *R/kernT.R d008157391d459c1ebd97e0b6d63df21 *R/lambda.R e45fb22e39852793e902b2aaec245f49 *R/lambdapert.R 363ca040ab258621547b87f9fd483c52 *R/ldc.R 032531819ccbcbded68c198e157d0464 *R/ldmult.R 3595e4fe4208d8ab0f1ba337a2df7dd0 *R/logisregmixEM.R 928f44fefe43811ebcd2ec09e8f2ac16 *R/logisregmixinit.R 61e764f3c76493bee0965415c85356bc *R/logitfns.R 56a2d4a1563e033194716ed2ead44308 *R/makemultdata.R 25c1dcebc2d339b6721c90f1223d4ad0 *R/matsqrt.R d93b3c1d434ff057cc6ed8198732c777 *R/mixturegram.R b00067bef145c26a1e80ef7a4a5d1042 *R/multmixEM.R d1ab4a3d41015ace82f2874b08d58e6d *R/multmixinit.R 6fe03186e33348035370558fb73975ad *R/multmixmodelsel.R 6cb9ac591955760d8cc031a1d6bacf0a *R/mvnormalmixEM.R 937dd2fa6ddb32592fe9f296bc450d58 *R/mvnormalmixinit.R d313ae47d8d9ff8c642c6dd3b7da5076 *R/mvnpEM.R 50a070a1b9af8bf763c158747b3fd346 *R/normalmixEM.R 087fc04146099dce86123509dea45fb1 *R/normalmixEM2comp.R f1e37c4001808412a10e1513bfe6666d *R/normalmixMMlc.R b3adb02fdb94f3d915bbe1699ef1813e *R/normalmixinit.R 000879d20a17f9129a56faf28a891cee *R/npEM.R 8f642b28048d551bb24509e0d4e90f79 *R/npMSL.R 972d8b4ade9a0fdd4ce7ad4da9579e7c *R/parse.constraints.R 45082d45819fb4d9d14f870baca9579f *R/perm.R 00ec0a98fc4eb484aaf623de0a431223 *R/plot.mixEM.R 1e424fc76c439f80a975b9095797054e *R/plot.npEM.R 4e085b2843070c797f907a5f088a6b51 *R/plotMCMC.R 3ade33c71dee9ac952f2949d8622209e *R/plotly_FDR.R 0d89d3c55d2c0fb6663adf01189c8454 *R/plotly_compCDF.R 6cb8369a043a8ac22e3d69642b8496ee *R/plotly_ellipse.R 5c9e9a357d5414a57a76fb0867a4e0fb *R/plotly_expRMM.R 311b725308623155126851a18282c469 *R/plotly_ise.npEM.R 43dd8a0d7fb55d8d23447772e78b66a4 *R/plotly_mixEM.R 763051064302cef9b0b629945df13918 *R/plotly_mixMCMC.R b2efe39596238d0532a7d7fd46c36f9b *R/plotly_mixturegram.R 32da8b02b4d7a73183cc07c3d4cfdd3f *R/plotly_npEM.R e984429af9cc0f4b8fe07ce51d79889a *R/plotly_post.beta.R 2a91487b315e3c946ba31b7093915658 *R/plotly_seq.npEM.R 8839aa836a0feefcd74c510cd85453ef *R/plotly_spEMN01.R d11b3c0a848a662660dcb511b3526f9c *R/plotly_spRMM.R 20f0780577911aefa2a69b4038ed6078 *R/plotly_weibullRMM.R 7fbf03a9406b6ced9e35c9e5bf8bb02d *R/plotseq.npEM.R 02faa99327eace5b409b3481032ea014 *R/poisregmixEM.R e49fc7b49dbec159926f01b6514fe4d0 *R/poisregmixinit.R 7e016ef4d058c1e94e4ddd6f881d4c1e *R/postbeta.R b2174e4aa4a36657d81e50beffb90d64 *R/print.npEM.R 462a5c8f309b2ba25707f3f66eb4a3af *R/regcr.R 8d72c639d2daf98ec0e91e2f7a7199fc *R/regmix.init.R c4d7c8180c138d466589b2addf1c9ecb *R/regmixEM.R ce39ec2a845d99c195d8b7d70176f4e9 *R/regmixEMlambda.R 7b44dde5886cebc9084378e89a256ca5 *R/regmixEMlambdainit.R 4cf188ef80c5e5cd4e60fa4b60412710 *R/regmixEMloc.R 3b25992254faebdb30ef0f0b04e7181a *R/regmixEMmixed.R f991619a3c3286205cd7969efb3cd1e3 *R/regmixMH.R 9d88ad51b155591c16a371cc5b107597 *R/regmixmixedinit.R c6d490d169fe3b56c5edc36f3936525a *R/regmixmodelsel.R 6f785fed55c31fe9b268ed7d77f34315 *R/repnormmixEM.R 8af2d7c7f46753fafe07fe4520e18a17 *R/repnormmixinit.R 1995eae3b993f508a9807631aaa21c92 *R/repnormmixmodelsel.R dfc1778aa1914d929c52d63f1cbb6a5e *R/rmvnorm.R 80d0ffe6d790c8a7234126271d5ecdf7 *R/rmvnormmix.R fb34d52c691679b6d56d25b1057e79e0 *R/rnormmix.R ee0c2b4e3d590a27c5f0af8820470c4e *R/segregmixEM.R 355032dae4f99792fb201ed841021458 *R/segregmixinit.R 2f0b7f0a574080f57c84a4d59e65f0e5 *R/spEM.R 718d2662e5e77f92b2c3f6f8617276ab *R/spEMsymloc.R 9337850b826fb5d15f89aee4de794252 *R/spRMMSEM.R 1c6a0b23bfa6b2dd4eaacf71b6c639c1 *R/spregmix.R b7ddb8a2c734d3e8c082a3379ef6a814 *R/summary.mixEM.R ad53a43af0b057d55b7c9a72dbf432d9 *R/summary.npEM.R a875916a07049e1ff3c4c46748d7ce3b *R/tauequivnormalmixEM.R e55cc3fc2dbcd3077af3e40b5e8222ba *R/testequality.R c1846ff0b297a74949447e5345dfadcc *R/testmixedequality.R dcbc0eec3af7fa19cc0924d46912dbdc *R/tryflare.R a445dc664ab054482ecf95121a835d10 *R/wkde.R 129b83daade32c300c7465773b82c8be *R/wquantile.R ca9bcd6b4fe5232a308a77a04632e651 *R/zzz.R c45376a904e4f4f567ae7116a02f2b61 *build/vignette.rds ecf85dc2d437ca444ee6cb5a94f0cd57 *data/CO2data.RData 88dbdafacb02f21c5d64c3c2eb82d101 *data/Habituationdata.RData b9ddfcc5a2e878a9252379122c7da97a *data/NOdata.RData 03b9d72335abc984a122dcf945e425da *data/RTdata.RData a8007b2c863d773458984d62dd90928e *data/RTdata2.RData 084346ccb4f9407baf0f3e4a4f705aaa *data/RanEffdata.RData 3275db554e5a52e3da3aabe75fce47be *data/RodFramedata.RData 6e0af753fec23f860e6147a7340c4cdb *data/Waterdata.RData 66ec961078a7fca599c303c5018dc173 *data/WaterdataFull.RData c6e45b0dca5169e7a016f289cf24ef21 *data/tonedata.RData 965a897972d77ceeaa29b3d269e7da54 *inst/CITATION b58bf32f450e3fdcc9aa29338d7f6998 *inst/doc/mixtools.R ce6bcd94bf0e0449f80ef9cfa2eae7ed *inst/doc/mixtools.Rnw 204106e2720e8a2e0ebf8dce2554c530 *inst/doc/mixtools.pdf b505fe8011b828a2a4f51e0c073eda92 *man/CO2data.Rd a07ffa6092f579070260a585852c0667 *man/Habituationdata.Rd 88c72b592b3dc9b06ed0ee8fb641bc8e *man/NOdata.Rd c2b5d7d2b58a312d15cca3263f4bd5c4 *man/RTdata.Rd c367751bfca4c22f02149eb7a1ad1f35 *man/RTdata2.Rd df8335c4cb858ea55bd452b10e0fae1b *man/RanEffdata.Rd b7a2fe3dcbde5ffc71c2b5df4bc84213 *man/RodFramedata.Rd 2ccee00d91e3de60c2f062b90db012ed *man/Waterdata.Rd c16678ff4ff5c955ee6f6f68b6371747 *man/aug.x.Rd e43e359a47b16f3ec38548d247fbc640 *man/boot.comp.Rd 35e1cee20f255158dc438eed5db2b3ba *man/boot.se.Rd fca8ab892f2d864299a841d65d405a61 *man/compCDF.Rd 5423f1bb26fc39b61d7fb52afe5aa421 *man/ddirichlet.Rd 1dff44003e07659287e1a04ecbf7f6c5 *man/density.npEM.Rd 2860ecbcf63169201eeae7f5181e1d12 *man/density.spEM.Rd d13316f4df7c11794c4da96f820068cd *man/depth.Rd 859cc432c2c0014974ff2f43c0d78bea *man/dmvnorm.Rd 896bb2e222f9c7a8f651f001e008a692 *man/ellipse.Rd bb4590d9e01ffc138b754e4861245f84 *man/expRMM_EM.Rd c17c3c82e281deb849a6537a8f9e9543 *man/figures/mixtools.png b45a859f647026e0834449afbd42295c *man/flaremixEM.Rd d417e710fa3d920d8636ab881381e798 *man/gammamixEM.Rd e92713741a6a900170ef59ec6b0db06f *man/hmeEM.Rd a8d92274b4c4134c57d276d48392b77c *man/initializations.Rd 75eef340021a87cb95c03bc8190f15dd *man/ise.npEM.Rd 5915b4e20695e52e1b37c9b237da30cf *man/lambda.Rd fd08fe01bc6e4156ab9f37fcd163f745 *man/lambda.pert.Rd 806f084784aaa77ba3de702a195fc1ab *man/ldmult.Rd 7dcc255e3db475950d0d5a60c7559478 *man/logisregmixEM.Rd 6f3a941d9400dc69d0b7b750f792bc77 *man/makemultdata.Rd 1a1a5b5c6f7c8c3a243d42a8b276a9dd *man/matsqrt.Rd d56a91188bc37775224ba198d1e6a133 *man/mixtools-internal.Rd 532f9457de1a130009a124c137025c0f *man/mixturegram.Rd be018feb5aed488f15c3af11e9dc4065 *man/multmixEM.Rd 94954f75aa38ceb4e494b271fec94692 *man/multmixmodel.sel.Rd 3e61ae93fe655651342c08486be77628 *man/mvnormalmixEM.Rd f58b07f2ac6d69534dcc5a53c53a6b8b *man/mvnpEM.Rd 6eeb8a223504b799e659156a4e346eda *man/normalmixEM.Rd 36d3b68022633008a49fbc9e8dff7cbc *man/normalmixEM2comp.Rd 383f1c090b2291ff029936ab827b87b4 *man/normalmixMMlc.Rd 496b6701ec27721345bc76b79e2e542b *man/npEM.Rd 72e434f64ee18058b710cf74108320e0 *man/npMSL.Rd ae258c402a2b46b3579e7777d846d91b *man/parseconstraint.Rd caeb3e81a3967f6f24546ad91f9c0dc8 *man/perm.Rd 7fb42e765af12a7796b818e6b03fca49 *man/plot.MCMC.Rd 8a05e74457672324e42dc2fc4920b928 *man/plot.mixEM.Rd 661ee1767e1e59f633fd51dd692a6bfe *man/plot.mvnpEM.Rd a468309483c4ae6d9bc4101dfa7c3167 *man/plot.npEM.Rd b2209409d6529e0676e462c94d4bff11 *man/plot.spEMN01.Rd e87708441e3e8c61f828208e47ef5bec *man/plotFDR.Rd 52d810df891b59019b294d4fae691e84 *man/plotexpRMM.Rd bcd35283ddcfc1969c89ef3397345ff6 *man/plotly_FDR.Rd 8b00e2dfd27624f7a5262be457545f7c *man/plotly_compCDF.Rd ebe1df032b470fe8c61af90b7427b319 *man/plotly_ellipse.Rd 3582d8ce9272e7249fc3946477e842b2 *man/plotly_expRMM.Rd e45a4c95908ca08d93abf45defb3d5ca *man/plotly_ise.npEM.Rd 798bc28934eb8f51e9ece8beaee17a1a *man/plotly_mixEM.Rd 91d58d81a3b5155b966715ff7db2085e *man/plotly_mixMCMC.Rd 43b04e54a8951e8937b2303e45058f6c *man/plotly_mixturegram.Rd f11c66e9c5a0b949f6f8a78bcc39ce04 *man/plotly_npEM.Rd 0ddd508c6f872350ff6f8758ef47ea4d *man/plotly_post.beta.Rd 7f83f3448af5cf602cd3d7d76fdde0a1 *man/plotly_seq.npEM.Rd 79dd1089818727bea9e6b40cf89cbbef *man/plotly_spEMN01.Rd 855911977c604d40a0132620d1a02c35 *man/plotly_spRMM.Rd 8dcf17721537615d8cfa7ad781e93a15 *man/plotly_weibullRMM.Rd 53be9f3a2b96df2eab8a22500e9df420 *man/plotseq.npEM.Rd 9a03b2361e83b275c78064e8b139fa68 *man/plotspRMM.Rd f59fdf287538d1c02bf2ef18afd6cf3e *man/plotweibullRMM.Rd aad7cd694685bbab7d5c6bb49d71cb84 *man/poisregmixEM.Rd 14ce097edb0e1646eb06d63f53e5e73f *man/post.beta.Rd 547221c68209edc9b6a94998f5d3ed94 *man/print.mvnpEM.Rd 002a8ea6ad9a392548889c4b40603408 *man/print.npEM.Rd 48f62a2a5edbc51a548ffd152c3ceb68 *man/regcr.Rd cd86eb069e82f5e4b75608264e74e5d7 *man/regmixEM.Rd 66f380bcbc7b3acce2295bc2cc958fac *man/regmixEM.lambda.Rd 34be77565bbcea7d45aa1a12afb6466a *man/regmixEM.loc.Rd 5912a91ec4c8eae883c131f7b0c45a24 *man/regmixEM.mixed.Rd 59c53259489056358fff325dc0d5625a *man/regmixMH.Rd cac402f4d34ba2a2e72c42e63a4b2b04 *man/regmixmodel.sel.Rd e5c39657c9e6fb25a70ac513f9a94327 *man/repnormmixEM.Rd 1b28aa913a7e3f2bec0129da9f534090 *man/repnormmixmodel.sel.Rd 4ecea92b3ab4ec6fda9c61aaa83d2d9e *man/rexpmix.Rd 283ccd2e22e6bc187d3b412eb3aa1859 *man/rmvnorm.Rd 91e761f99f003c6298cec7885060a56c *man/rmvnormmix.Rd 6c10958f200a83428bb5648c3454e2ef *man/rnormmix.Rd 759629421e7b9dafeb9c4af939b27d2d *man/rweibullmix.Rd c13dd8b7b8df7f76f61ed4bd76a96f22 *man/segregmixEM.Rd 61f993cbb217ef0ba2f36c258852e83d *man/spEM.Rd 2f1f7c0458163ea6070384373ee38576 *man/spEMsymloc.Rd f53a191d7396316355de08958bf1bb87 *man/spEMsymlocN01.Rd 80090e0ddf2e2a2e97ee2f95642720f7 *man/spRMM_SEM.Rd 8cdfd07205c82a7a7ff15dbdfa16f830 *man/spregmix.Rd d2f4f5d0a553b8dd5bb3e251a1cf91de *man/summary.mixEM.Rd 036fe2bf6f47befedd93728755656f07 *man/summary.mvnpEM.Rd fb2df20e6f0077e279fee305e1859040 *man/summary.npEM.Rd e82e6a9b40ee75508d729e8f442b9457 *man/summary.spRMM.Rd dc7fae07ee408ba28c53960a7ee54ff0 *man/tauequivnormalmixEM.Rd ac7659fe36cde61769fb5c8fb1a2c102 *man/test.equality.Rd bc5650d17b0df897af8568a8adbcdc08 *man/test.equality.mixed.Rd 99018278282ba70a64ac736aa1e8e5e7 *man/tonedata.Rd ec184a30d24e76b13c021e9ddbf47b9c *man/try.flare.Rd 8dd2fb956178f9f80b5d69c9f2de9843 *man/weibullRMM_SEM.Rd fb40e0bf60b0bbd717f1408dcb5791e8 *man/wkde.Rd 6c35d1136da65dbd2f2583e19a7ece69 *man/wquantile.Rd 1512fde5c77cc87a513bf0bc0c7ec7d8 *src/KDEloc2.c e9ddda60cf37bb1b91a564c31bb26b9d *src/KDElocscale.c 6141ac8718537ecc30d5d768e55c74d2 *src/KDErepeated.c 418488e632cfbf9ec0383c8e2a6b4d68 *src/KDErepeatedbw.c d998563ef2b3b533ae43bcc756bc6953 *src/KDEsymloc.c 0b31b6a360443624d117d3d0c4e8edef *src/KDEsymloc1comp.c 3031711e3958323aa555081e7819333d *src/KDEsymloc2.c 4e866de60a0ecf51dd1962ef3d6f3c00 *src/init.c f2a2b6580952c87546e89ba91d8144dd *src/multinompost.c 92c56f68808db44df1269a4d18a23ade *src/mvwkde.c 949319e5b60fd36c2ed398ee94b8bc34 *src/new_svalues.c c0841c25090c2cc258b4974369238512 *src/normpost.c b6a84b03c05c76bcc76da25eff787f11 *src/npMSL.c 98faec8e3b8a3f838f510800b2166bb0 *src/sd.c 9f56ca76cc30332bda95b27f8ece61bd *src/z.c ce6bcd94bf0e0449f80ef9cfa2eae7ed *vignettes/mixtools.Rnw b509b00eda098a844800f8ade63048eb *vignettes/mixtools.bib mixtools/R/0000755000175100001440000000000014343400152012343 5ustar hornikusersmixtools/R/hmeEM.R0000755000175100001440000001164214342153463013501 0ustar hornikusershmeEM <- function (y, x, lambda=NULL, beta = NULL, sigma = NULL, w = NULL, k = 2, addintercept = TRUE, epsilon = 1e-08, maxit = 10000, verb=FALSE) { NR <- function (w, x, z) { A = (inv.logit(x %*% w)/(1 + exp(x %*% w)))^-1 B = z[,1]-inv.logit(x %*% w) C = matrix(c(sum(B),sum(x[,2]*B)),2,1) D = matrix(nrow=2,ncol=nrow(x)) D = solve(matrix(c(sum(A),sum(A * x[,2]),sum(A * x[,2]),sum(A * x[,2]^2)),nrow=2,ncol=2)) E = w + apply(D %*% C, 1, sum) list(w.new = E) } if (k != 2) cat("This algorithm currently only works for a 2-component mixture-of-experts model!") s=sigma if (addintercept) { x = cbind(1, x) } n <- length(y) p <- ncol(x) if (is.null(w)) { w = rep(0,p*(k-1)) } tmp <- regmix.init(y = y, x = x, beta = beta, s = s, k = k, addintercept = addintercept) beta = tmp$beta s = tmp$s k = tmp$k if(is.null(lambda)) lambda = inv.logit(x %*% w) diff <- 1 iter <- 0 nlogroot2pi = n * log(sqrt(2 * pi)) xbeta <- x %*% beta tmp <- t(-1/2/s[2]^2 * t(y - xbeta[, -1])^2) + 1/2/s[1]^2 * (y - xbeta[, 1])^2 tmp2 <- (1-lambda)/s[2] * s[1]/lambda tmp3 <- log(1 + (tmp2 * exp(tmp))) obsloglik <- sum(log(lambda)) - nlogroot2pi - n * log(s[1]) - 1/2/s[1]^2 * sum((y - xbeta[, 1])^2) + sum(tmp3) ll <- obsloglik z = matrix(nrow = n, ncol = k) restarts <- 0 while (diff > epsilon & iter < maxit) { lambda.mat <- cbind(lambda,1-lambda) res <- (y - xbeta)^2 for (i in 1:n) { for (j in 1:k) { z.denom = c() for (h in 1:k) { z.denom = c(z.denom, (lambda.mat[i,h]/lambda.mat[i,j]) * (s[j]/s[h]) * exp(-0.5 * ((1/s[h]^2) * res[i, h] - (1/s[j]^2) * res[i, j]))) } z[i, j] = 1/sum(z.denom) } } # z[, k] = 1 - apply(as.matrix(z[, (1:(k - 1))]), 1, sum) z = z/apply(z,1,sum) if (addintercept) { lm.out <- lapply(1:k, function(i) lm(y ~ x[, -1], weights = z[, i])) } else lm.out <- lapply(1:k, function(i) lm(y ~ x - 1, weights = z[, i])) beta.new <- sapply(lm.out, coef) w.diff=10 while(sum(abs(w.diff))>(p*.001)){ w.temp <- NR(w,x,z)$w.new w.diff <- w-w.temp w <- w.temp } w.new <- w lambda.new <- inv.logit(x %*% w.new) xbeta.new <- x %*% beta.new res <- (y - xbeta.new)^2 s.new <- sqrt(sapply(1:k, function(i) sum(z[,i] * (res[, i]))/sum(z[, i]))) sing <- sum(s.new < 1e-08) lambda <- lambda.new beta <- beta.new s <- s.new w <- w.new xbeta <- xbeta.new tmp <- t(-1/2/s[2]^2 * t(y - xbeta[, -1])^2) + 1/2/s[1]^2 * (y - xbeta[, 1])^2 tmp2 <- (1-lambda)/s[2] * s[1]/lambda tmp3 <- log(1 + (tmp2 * exp(tmp))) newobsloglik <- sum(log(lambda)) - nlogroot2pi - n * log(s[1]) - 1/2/s[1]^2 * sum((y - xbeta[, 1])^2) + sum(tmp3) if (sing > 0 || is.na(newobsloglik) || newobsloglik < obsloglik || abs(newobsloglik) == Inf){# || sum(z) != n) { cat("Need new starting values due to singularity...", "\n") restarts <- restarts + 1 if (restarts > 15) stop("Too many tries!") tmp <- regmix.init(y = y, x = x, k = k, addintercept = addintercept) beta = tmp$beta s = tmp$s k = tmp$k w = rep(0,p*(k-1)) lambda = inv.logit(x %*% w) diff <- 1 iter <- 0 xbeta <- x %*% beta tmp <- t(-1/2/s[2]^2 * t(y - xbeta[, -1])^2) + 1/2/s[1]^2 * (y - xbeta[, 1])^2 tmp2 <- (1-lambda)/s[2] * s[1]/lambda tmp3 <- log(1 + (tmp2 * exp(tmp))) obsloglik <- sum(log(lambda)) - nlogroot2pi - n * log(s[1]) - 1/2/s[1]^2 * sum((y - xbeta[, 1])^2) + sum(tmp3) ll <- obsloglik } else{ diff <- newobsloglik - obsloglik obsloglik <- newobsloglik ll <- c(ll, obsloglik) iter <- iter + 1 if (verb) { cat("iteration=", iter, "diff=", diff, "log-likelihood", obsloglik, "\n")} } } if (iter == maxit) { cat("WARNING! NOT CONVERGENT!", "\n") } cat("number of iterations=", iter, "\n") rownames(beta) <- c(paste("beta", ".", 0:(p - 1), sep = "")) colnames(beta) <- c(paste("comp", ".", 1:k, sep = "")) colnames(z) <- c(paste("comp", ".", 1:k, sep = "")) a = list(x = x, y = y, w=w, lambda = cbind(lambda,1-lambda), beta = beta, sigma = s, loglik = obsloglik, posterior = z, all.loglik = ll, restarts = restarts, ft = "regmixEM") class(a) = "mixEM" a } mixtools/R/plotly_FDR.R0000644000175100001440000000647414342641745014535 0ustar hornikusersplotly_FDR <- function(post1, post2=NULL, lg1="FDR 1", lg2=NULL, compH0=1, alpha=0.1, complete.data =NULL, pctfdr=0.3, col = NULL, width = 3 , title = NULL , title.size = 15 , title.x = 0.5 , title.y = 0.95, xlab = "Index" , xlab.size = 15 , xtick.size = 15, ylab = "Probability" , ylab.size = 15 , ytick.size = 15, legend.text = "" , legend.text.size = 15 , legend.size = 15 ){ hline <- function(y = 0, color = '#1f77b4') { list( type = "line", y0 = y, y1 = y, xref = "paper", x0 = 0, x1 = 1, line = list(color = '#1f77b4', dash = "dash", width = 1) ) } if(is.null(col)){ col <- hue_pal()(3) } if(length(col) != 3){ print("Please specify 3 colors in 'col'.") } n <- dim(post1)[1] cs1 <- cumsum(post1[,compH0]) # local FDR(p_i)'s fdr1 <- cs1/(1:n) # FDR(p_i)'s if (is.null(title)) title <- paste("FDR estimate(s), n=",n) if (!is.null(post2)) { cs2 <- cumsum(post2[,compH0]) # local FDR(p_i)'s fdr2 <- cs2/(1:n) if (is.null(lg2)) {lg2 <- "FDR 2"} } i1 <- sum(fdr1 pctfdr # cat("index",i1) plot <- plot_ly()%>% add_trace(x=seq(from = 1 , to = i1 , by = 1) , y=fdr1[1:i1] , type = 'scatter' , mode = 'lines', line = list(width = width , color = col[1]), name = lg1, showlegend = TRUE)%>% plotly::layout( legend = list(title=list(text=legend.text, font=list(size=legend.text.size)), font = list(size=legend.size)), title = list(text = title, x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = xlab, font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = ylab, font = list(size = ylab.size)), tickfont = list(size = ytick.size) ), shapes = list(type = "line", y0 = alpha, y1 = alpha, xref = "paper", x0 = 0, x1 = 1, line = list(color = '#1f77b4', dash = "dash", width = 1) ) ) if (!is.null(post2)){ plot <- plot%>% add_trace(x=seq(from = 1 , to = i1 , by = 1) , y=fdr2[1:i1] , type = 'scatter' , mode = 'lines', line = list(width = width , color = col[2]), name = lg2, showlegend = TRUE) } if (!is.null(complete.data)){ V <- cumsum(complete.data[,1]==1) # cumulative nb of items under H0 trueFDR <- V/(1:n) plot <- plot%>% add_trace(x=seq(from = 1 , to = i1 , by = 1) , y=trueFDR[1:i1] , type = 'scatter' , mode = 'lines', line = list(width = width , color = col[3] , dash = "dash"), name = "True FDR", showlegend = TRUE) } print(plot) } mixtools/R/expReliabilityMixEM.R0000644000175100001440000001231214342153463016364 0ustar hornikusers# code for Reliability Mixture Models (RMM) with Censored data # D. Chauveau # ref: Bordes L. and Chauveau D. Computational Statistics (2016) # Simulate from an exponential mixture. # lambda = vector of component probabilities # rate = vector of component rates rexpmix <- function(n,lambda=1,rate=1) { m <- length(lambda) # nb of components z <- sample(m, n, replace = TRUE, prob = lambda) # component indicator rexp(n, rate = rate[z]) } # pdf of exponential mixture dexpmixt <- function(t,lam,rate){ m <- length(lam) f <- 0 for (j in 1:m) f <- f + lam[j]*dexp(t,rate=rate[j]) f } ############################################## ## EM algorithm for Reliability Mixture Models (RMM) with Censoring ## Parametric model, for ## univariate finite mixture of exponentials with right censoring # x = lifetime data, censored by random c if d is not NULL, in which case # x= min(x,c) and d = I(x <= c) # complete data may be (t,d,z) or (x,z), see option complete expRMM_EM <- function (x, d=NULL, lambda = NULL, rate = NULL, k = 2, complete="tdz", epsilon = 1e-08, maxit = 1000, verb = FALSE) { # warn <- options(warn=-1) # Turn off warnings # x <- as.vector(x) n <- length(x) if (!is.null(lambda)) k=length(lambda) if (!is.null(rate)) k=length(rate) # either should be define !!! if (is.null(d)) d <- rep(1,n) # simple EM for noncensored case xx <- matrix(x, nrow=n, ncol=k) # x repeated k times, used in E-steps dd <- matrix(d, nrow=n, ncol=k) # idem for d # init function call to do later, in case lambda = rate = NULL if (is.null(lambda)) lambda <- rep(1/k,k) if (is.null(rate)) rate <- rep(1,k) # to do : init.rate(k) # handle the 2 complete data models if (complete=="tdz") comptdz=TRUE else comptdz=FALSE # sequences for storing along iterations lambda_seq <- rate_seq <- matrix(0, nrow = maxit, ncol = k) lambda_seq[1,] <- lambda rate_seq[1,] <- rate loglik_seq <- NULL oldloglik <- -Inf # notdone <- TRUE # while(notdone) { # Initialize everything notdone <- FALSE dll <- epsilon+1 iter <- 1 post <- matrix(nrow = n, ncol = k) restarts <- 0 while (dll > epsilon && iter < maxit) { # EM iterations ### E-step ### rr <- matrix(rate, n, k, byrow=T) ll <- matrix(lambda, n, k, byrow=T) # handling censored & non-censored cases post <- ((ll*dexp(xx,rr))^dd)*((ll*(1-pexp(xx,rr)))^(1-dd)) rs <- rowSums(post) loglik <- sum(log(rs)) # loglik without the constant term # post normalized per row post <- sweep(post, 1, rs, "/") # posteriors p_{ij}^t 's ### M-step ### lambda <- colMeans(post) lambda_seq[iter+1, ] <- lambda if (comptdz) rate <- colSums(post*dd)/colSums(post*xx) # complete=(t,d,z) # rate <- colSums(post*d)/colSums(post*x) # gives same answer # cf automatic recycling if (!comptdz) { # complete data = (x,z) mean_xi <- matrix(1/rate, n, k, byrow=T) rate <- colSums(post)/colSums(post*(xx + (1-dd)*mean_xi)) # rate <- colSums(post)/colSums(post*(x + (1-d)*mean_xi)) # same answer } rate_seq[iter+1, ] <- rate dll <- loglik - oldloglik # = Inf for iter=0 1st time oldloglik <- loglik loglik_seq <- c(loglik_seq, loglik) if (verb) { cat("iteration", iter, " log-lik diff =", dll, " log-lik =", loglik, "\n") } iter <- iter + 1 } # end of EM loops over iterations if (iter == maxit) cat("WARNING! NOT CONVERGENT!", "\n") cat("number of iterations =", iter - 1, "\n") colnames(post) <- c(paste("comp", ".", 1:k, sep = "")) a=list(x=x, d=d, lambda = lambda, rate = rate, loglik = loglik, posterior = post, all.loglik=loglik_seq, all.lambda = lambda_seq[1:iter,], all.rate = rate_seq[1:iter,], # restarts=restarts, ft="expRMM_EM") class(a) = "mixEM" a } ################################################## # plot EM sequences from expRMM_EM: # color by components, one plot per parameter type # commented-out abline() usages are for true values for rate and lambda if available plotexpRMM <- function(a, title=NULL, rowstyle=TRUE, subtitle=NULL, ...) { n <- length(a$x); m <- dim(a$all.lambda)[2] pcc <- round(100*(1-mean(a$d)),2) sizes <- paste("n=",n,", ", pcc, "% censored", sep="") if (is.null(subtitle)) { subtitle <- paste("n=",n,", ", pcc, "% censored", sep="")} if (is.null(title)) { tt1 <- "Rate parameters" tt2 <- "Weight parameters" } else tt1 <- tt2 <- title lwdset <- 2 if (rowstyle) par(mfrow=c(1,2)) else par(mfrow=c(2,1)) plot(a$all.rate[,1], type="l", ylim=c(0,max(a$all.rate)), xlab="iterations", ylab="estimates", main=tt1, ...) title(sub=subtitle,cex.sub = 0.75) lgd <- expression(xi[1]); lcol <- 1 for (j in 2:m) { lines(a$all.rate[,j], col=j, ...) # abline(rate[j],0,col=j,lty=3) lgd <- c(lgd,substitute(xi[j])); lcol <- c(lcol,j) } legend("topright",lgd,col=lcol,lty=1,...) plot(a$all.lambda[,1], type="l", ylim=c(0,1), xlab="iterations", ylab="estimates", main=tt2, ...) title(sub=subtitle,cex.sub = 0.75) lgd <- expression(lambda[1]); lcol <- 1 if (m>2) { for (j in 2:m) { lines(a$all.lambda[,j], col=j, ...) lgd <- c(lgd,substitute(lambda[j])) lcol <- c(lcol,j) } } legend("topright",lgd,col=lcol,lty=1,...) } mixtools/R/logisregmixEM.R0000755000175100001440000000772014342153463015263 0ustar hornikuserslogisregmixEM=function (y, x, N = NULL, lambda = NULL, beta = NULL, k = 2, addintercept = TRUE, epsilon = 1e-08, maxit = 10000, verb = FALSE) { if (addintercept) { x = cbind(1, x) } else x = as.matrix(x) n <- length(y) p <- ncol(x) if (is.null(N)) { N = rep(1, n) } tmp <- logisregmix.init(y = y, x = x, N = N, lambda = lambda, beta = beta, k = k) lambda <- tmp$lambda beta <- tmp$beta k <- tmp$k xbeta <- x %*% beta z <- matrix(0, n, k) diff <- 1 iter <- 0 comp <- t(t(dbinom(y, size = N, prob = inv.logit(xbeta))) * lambda) compsum <- apply(comp, 1, sum) obsloglik <- sum(log(compsum)) ll <- obsloglik restarts <- 0 while (diff > epsilon && iter < maxit) { j.star = apply(xbeta, 1, which.max) for (i in 1:n) { for (j in 1:k) { z[i, j] = lambda[j]/lambda[j.star[i]] * (inv.logit(xbeta[i, j])/inv.logit(xbeta[i, j.star[i]]))^y[i] * ((1 - inv.logit(xbeta[i, j]))/(1 - inv.logit(xbeta[i, j.star[i]])))^(N[i] - y[i]) } } z = z/apply(z, 1, sum) z[,k]=1-apply(as.matrix(z[,(1:(k-1))]),1,sum) if (sum(is.na(z)) > 0) { cat("Need new starting values due to underflow...", "\n") restarts <- restarts + 1 if(restarts>15) stop("Too many tries!") tmp <- logisregmix.init(y = y, x = x, N = N, k = k) lambda <- tmp$lambda beta <- tmp$beta k <- tmp$k diff <- 1 iter <- 0 xbeta <- x %*% beta comp <- t(t(dbinom(y, size = N, prob = inv.logit(xbeta))) * lambda) compsum <- apply(comp, 1, sum) obsloglik <- sum(log(compsum)) ll <- obsloglik } else { lambda <- apply(z, 2, mean) lm.out = lapply(1:k, function(j) try(glm.fit(x, cbind(y, N - y), weights = z[, j], family = binomial()), silent = TRUE)) beta = sapply(lm.out, coef) xbeta <- x %*% beta comp <- t(t(dbinom(y, size = N, prob = inv.logit(xbeta))) * lambda) compsum <- apply(comp, 1, sum) newobsloglik <- sum(log(compsum)) if (abs(newobsloglik) == Inf || is.na(newobsloglik) || newobsloglik < obsloglik){# || sum(z) != n) { cat("Need new starting values due to singularity...", "\n") restarts <- restarts + 1 if(restarts>15) stop("Too many tries!") tmp <- logisregmix.init(y = y, x = x, N = N, k = k) lambda <- tmp$lambda beta <- tmp$beta k <- tmp$k diff <- 1 iter <- 0 xbeta <- x %*% beta comp <- t(t(dbinom(y, size = N, prob = inv.logit(xbeta))) * lambda) compsum <- apply(comp, 1, sum) obsloglik <- sum(log(compsum)) ll <- obsloglik } else { diff <- newobsloglik - obsloglik obsloglik <- newobsloglik ll <- c(ll, obsloglik) iter <- iter + 1 if (verb) { cat("iteration=", iter, "diff=", diff, "log-likelihood", obsloglik, "\n") } } } } if (iter == maxit) { cat("WARNING! NOT CONVERGENT!", "\n") } beta <- matrix(beta,ncol=k) rownames(beta) <- c(paste("beta", ".", 0:(p - 1), sep = "")) colnames(beta) <- c(paste("comp", ".", 1:k, sep = "")) colnames(z) <- c(paste("comp", ".", 1:k, sep = "")) cat("number of iterations=", iter, "\n") a = list(x = x, y = y, lambda = lambda, beta = beta, loglik = obsloglik, posterior = z, all.loglik = ll, restarts=restarts, ft = "logisregmixEM") class(a) = "mixEM" a } mixtools/R/gammamixinit.R0000755000175100001440000000151614342153463015171 0ustar hornikusersgammamix.init <- function (x, lambda = NULL, alpha = NULL, beta = NULL, k = 2) { n <- length(x) if (is.null(lambda)) { cond = TRUE while(cond){ lambda = runif(k) lambda = lambda/sum(lambda) if(min(lambda)<0.05) cond=TRUE else cond=FALSE } } else k = length(lambda) if (k == 1) { x.bar = mean(x) x2.bar = mean(x^2) } else { x.sort = sort(x) ind = floor(n * cumsum(lambda)) x.part = list() x.part[[1]] = x.sort[1:(ind[1] + 1)] for (j in 2:k) { x.part[[j]] = x.sort[ind[j - 1]:ind[j]] } x.bar = sapply(x.part, mean) x2.bar = sapply(lapply(x.part, "^", 2), mean) } if (is.null(alpha)) { alpha = x.bar^2/(x2.bar - x.bar^2) } if (is.null(beta)) { beta = (x2.bar - x.bar^2)/x.bar } list(lambda = lambda, alpha = alpha, beta = beta, k = k) } mixtools/R/plotly_ise.npEM.R0000644000175100001440000000541514343042424015520 0ustar hornikusersplotly_ise.npEM <- function(npEMout, component=1, block=1, truepdf=dnorm, lower=-Inf, upper=Inf, plots = TRUE , col = NULL , width = 3, title = NULL , title.size = 15 , title.x = 0.5 , title.y = 0.95, xlab = "t" , xlab.size = 15 , xtick.size = 15, ylab = "" , ylab.size = 15 , ytick.size = 15, legend.text = "" , legend.text.size = 15 , legend.size = 15, ...){ coords <- npEMout$blockid == block bs <- sum(coords) # block size xx <- as.vector(npEMout$data[,coords]) # flatten data wts <- rep(npEMout$post[,component],bs) # duplicate weights if (is.matrix(npEMout$bandwidth)){ bw <- npEMout$bandwidth[block,component] } else {bw <- npEMout$bandwidth} integrand = function(u,...) { (wkde(xx,u,wts,bw) - truepdf(u,...))^2 } numint <- integrate(integrand,lower,upper, ...) if (is.null(col)){ col <- hue_pal()(2) } if (length(col) != 2){ print("Please specify 2 colors in 'col'.") } if (plots){ # plot of estimated and truepdf ise <- paste(round(numint$value,4)) temp=paste(component, block, sep="") if (is.null(title)){ title = substitute(expression(paste("Integrated Squared Error for ", f[temp]," = ",ise,sep=""))) } if (!is.finite(lower)) { lower <- min(xx) } if (!is.finite(upper)) { upper <- max(xx) } u <- seq(lower,upper, 0.01) fhat <- wkde(xx,u,wts,bw) ymax <- max(max(truepdf(u, ...)),max(fhat)) plot <- plot_ly()%>% add_trace(x=u , y=fhat , type = 'scatter' , mode = 'lines', line = list(width = (width/2) , color = col[2]), name = "Fitted", showlegend = TRUE)%>% add_trace(x=u , y=truepdf(u, ...) , type = 'scatter' , mode = 'lines', line = list(width = width , color = col[1]), name = "True", showlegend = TRUE)%>% plotly::layout( legend = list(title=list(text=legend.text, font=list(size=legend.text.size)), font = list(size=legend.size)), title = list(text = eval(title), x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = xlab, font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = ylab, font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) } print(plot) numint }mixtools/R/multmixEM.R0000755000175100001440000000643614342153463014434 0ustar hornikusersmultmixEM <- function (y, lambda = NULL, theta = NULL, k = 2, maxit = 10000, epsilon = 1e-08, verb = FALSE) { if (class(y)[1]=="list" && !is.null(y$y)) { y <- y$y } n <- nrow(y) p <- ncol(y) m <- colSums(y) r <- rowSums(y) # These need not all be the same tmp <- multmix.init(y=y, lambda=lambda, theta=theta, k=k) lambda <- tmp$lambda theta <- tmp$theta k <- tmp$k restarts<-0 mustrestart <- FALSE llconstant <- sum(lgamma(r+1)) - sum(lgamma(y+1)) while (restarts < 50) { ll <- NULL iter <- 0 diff <- epsilon+1 # to ensure entering main EM loop # Normalize rows of theta matrix theta <- theta/rowSums(theta) theta <- pmax(theta, 1e-100) # ensure no zeros # preparatory E-step prior to entering main EM loop loglamcd <- log(lambda) + log(theta) %*% t(y) # kxn matrix of log(lambda * component densities) z <- .C(C_multinompost, as.integer(n), as.integer(k), as.double(loglamcd), post=double(n*k), loglik=as.double(llconstant), PACKAGE = "mixtools") post <- matrix(z$post, ncol=k) newll <- z$loglik tmp.post <- (post==0) if(any(apply(tmp.post,2,sum)==n)){ diff <- epsilon mustrestart <- TRUE } while ((iter < maxit) && diff > epsilon) { # main EM loop iter <- iter + 1 oldll <- newll ll <- c(ll, oldll) # M-step: First update theta values (proportional to sum of posteriors * data) theta <- t(post) %*% y theta <- theta/rowSums(theta) theta <- pmax(theta, 1e-100) # ensure no zeros # M-step: Update the lambdas as usual for a finite mixture lambda <- colMeans(post) # E-step: prepare to find posteriors using C function loglamcd <- log(lambda) + log(theta) %*% t(y) # kxn matrix of log(lambda * component densities) # E-step: Call C function to return nxk matrix of posteriors along with loglikelihood z <- .C(C_multinompost, as.integer(n), as.integer(k), as.double(loglamcd), post=double(n*k), loglik=as.double(llconstant), PACKAGE = "mixtools") post <- matrix(z$post, ncol=k) newll <- z$loglik diff <- newll - oldll if (diff<0 || is.na(newll) || is.infinite(newll) || is.nan(newll)) { mustrestart <- TRUE break } if (verb) { cat("iteration=", iter, "diff=", diff, "log-likelihood", ll[iter], "lambda", lambda, "\n") } } if (mustrestart) { cat("Restarting due to numerical problem.\n") mustrestart <- FALSE restarts <- restarts + 1 tmp <- multmix.init(y=y, k=k) lambda <- tmp$lambda theta <- tmp$theta k <- tmp$k } else { if (iter == maxit) { cat("Warning: Not convergent after", maxit, "iterations\n") } theta[,p] <- 1-apply(as.matrix(theta[,1:(p-1)]),1,sum) colnames(theta) <- c(paste("theta", ".", 1:p, sep = "")) rownames(theta) <- c(paste("comp", ".", 1:k, sep = "")) colnames(post) <- c(paste("comp", ".", 1:k, sep = "")) cat("number of iterations=", iter, "\n") out <-list(y=y, lambda = lambda, theta = theta, loglik = ll[length(ll)], posterior = post, all.loglik=ll, restarts=restarts, ft="multmixEM") class(out) <- "mixEM" return(out) } } stop("Too many restarts!") } mixtools/R/bootse.R0000755000175100001440000004460214343155643014006 0ustar hornikusersboot.se <- function (em.fit, B = 100, arbmean = TRUE, arbvar = TRUE, N=NULL, ...) { mix.type <- em.fit$ft if (mix.type == "regmixEM") { #Start Here... k=length(em.fit$lambda) y=em.fit$y n=length(y) if(sum(em.fit$x[,1]==1)==n){ x=em.fit$x[,-1] } else x=em.fit$x if (arbmean == FALSE) { scale = em.fit$scale beta = matrix(rep(em.fit$beta, k), ncol = k) } else { scale = 1 beta = em.fit$beta } xbeta.new=em.fit$x%*%beta lambda = em.fit$lambda if(arbvar==FALSE){ sigma = rep(em.fit$sigma,k) } else{ sigma = scale*em.fit$sigma } j = 0 lambda.bs=NULL beta.bs=NULL sigma.bs=NULL scale.bs=NULL while (j < B) { j = j + 1 w=rmultinom(n,size=1,prob=lambda) y.sim=sapply(1:n,function(i) rnorm(1,mean=xbeta.new[i,(w[,i]==1)],sd=sigma[w[,i]==1]) ) em.bs = try(regmixEM(y = y.sim, x = x, k = k, arbmean = arbmean, arbvar = arbvar, lambda=em.fit$lambda, beta=em.fit$beta, sigma=(scale*em.fit$sigma), ...), silent = TRUE) if (inherits(em.bs, "try-error", which = TRUE) || em.bs$restarts!=0) { j = j - 1 } else { if(arbmean==FALSE){ lambda.bs = cbind(lambda.bs,em.bs$lambda) beta.bs = cbind(beta.bs,as.vector(em.bs$beta)) sigma.bs = cbind(sigma.bs,em.bs$sigma) scale.bs = cbind(scale.bs,em.bs$scale) } else { lambda.bs = cbind(lambda.bs,em.bs$lambda) beta.bs = cbind(beta.bs,as.vector(em.bs$beta)) sigma.bs = cbind(sigma.bs,em.bs$sigma) } } } if(arbmean==FALSE){ lambda.se=apply(lambda.bs,1,sd) beta.se=apply(beta.bs,1,sd) sigma.se=apply(sigma.bs,1,sd) scale.se=apply(scale.bs,1,sd) bs.list=list(lambda = lambda.bs, lambda.se = lambda.se, beta = beta.bs, beta.se = beta.se, sigma=sigma.bs, sigma.se = sigma.se, scale=scale.bs, scale.se=scale.se) } else{ lambda.se=apply(lambda.bs,1,sd) beta.se=matrix(apply(beta.bs,1,sd),ncol=k) sigma.se=apply(sigma.bs,1,sd) bs.list=list(lambda = lambda.bs, lambda.se = lambda.se, beta = beta.bs, beta.se = beta.se, sigma=sigma.bs, sigma.se = sigma.se) } } ##### if (mix.type == "regmixEM.mixed"){ #Start Here... k=length(em.fit$lambda) y=em.fit$y x=em.fit$x if (length(y) != length(x)) stop("Number of elements in lists for x and y must match!") w=em.fit$w p.z=em.fit$posterior.z p.b=em.fit$posterior.beta mu=em.fit$mu R=em.fit$R sigma=em.fit$sigma lambda=em.fit$lambda n=length(y) p=nrow(mu) n.i=sapply(y,length) alpha=em.fit$alpha w.test <- NULL for(i in 1:length(w)){ w.test <- c(w.test,as.vector(w[[i]])) } if(sum(w.test)==0){ w1=NULL} else w1=w if(length(R)==k) arb.R=TRUE else arb.R=FALSE if(length(sigma)==k) arb.sigma=TRUE else arb.sigma=FALSE j = 0 lambda.bs=NULL mu.bs=NULL sigma.bs=NULL R.bs=NULL alpha.bs=NULL while (j < B) { j = j + 1 k.bs=sapply(1:n, function(i) rmultinom(1,size=1,prob=lambda)) bs.i <- sample(1:n,n,replace=TRUE) ## if(arb.R==FALSE){ if(arb.sigma==FALSE){ y.sim <- lapply(1:n, function(i) w[[i]] %*% alpha + as.vector(rmvnorm(1, mu = x[[i]] %*% mu[, (k.bs[, i] == 1)], sigma = (x[[i]]%*%R%*%t(x[[i]]) +diag(sigma,n.i[i])) ))) } else y.sim <- lapply(1:n, function(i) w[[i]] %*% alpha + as.vector(rmvnorm(1, mu = x[[i]] %*% mu[, (k.bs[, i] == 1)], sigma = (x[[i]]%*%R%*%t(x[[i]]) +diag(sigma[(k.bs[,i] == 1)],n.i[i])) ))) } else{ if(arb.sigma==FALSE){ y.sim <- lapply(1:n, function(i) w[[i]] %*% alpha + as.vector(rmvnorm(1, mu = x[[i]] %*% mu[, (k.bs[, i] == 1)], sigma = (x[[i]]%*%R[(k.bs[, i] == 1)][[1]]%*%t(x[[i]]) +diag(sigma,n.i[i])) ))) } else y.sim <- lapply(1:n, function(i) w[[i]] %*% alpha + as.vector(rmvnorm(1, mu = x[[i]] %*% mu[, (k.bs[, i] == 1)], sigma = (x[[i]]%*%R[(k.bs[, i] == 1)][[1]]%*%t(x[[i]]) +diag(sigma[(k.bs[,i] == 1)],n.i[i])) ))) } ## em.bs = try(regmixEM.mixed(y = y.sim, x = x, w=w1, sigma=sigma, mu=mu, alpha=alpha, R=R, lambda=lambda, k = k, arb.R=arb.R, arb.sigma=arb.sigma, addintercept.fixed=FALSE, addintercept.random=FALSE, ...), silent = TRUE) if (inherits(em.bs, "try-error", which = TRUE) || em.bs$restarts!=0) { j = j - 1 } else { lambda.bs = cbind(lambda.bs,em.bs$lambda) alpha.bs = cbind(alpha.bs,em.bs$alpha) sigma.bs = cbind(sigma.bs,em.bs$sigma) mu.bs = cbind(mu.bs,as.vector(em.bs$mu)) R.bs = cbind(R.bs,as.vector(sapply(em.bs$R,c))) } lambda.se=apply(lambda.bs,1,sd) alpha.se=apply(alpha.bs,1,sd) sigma.se=apply(sigma.bs,1,sd) mu.se=matrix(apply(mu.bs,1,sd),ncol=k) R.se1=apply(R.bs,1,sd) if(arb.R==TRUE){ R.se2=matrix(R.se1,ncol=k) R.se=lapply(1:k,function(i) matrix(R.se2[,i],ncol=p)) } else R.se=matrix(R.se1,ncol=p) bs.list=list(lambda = lambda.bs, lambda.se = lambda.se, alpha=alpha.bs, alpha.se=alpha.se, mu = mu.bs, mu.se = mu.se, sigma=sigma.bs, sigma.se = sigma.se, R=R.bs, R.se=R.se) } } ##### # Commented out by DRH on 8-29-2008 due to absence of gammamixEM function # if (mix.type == "gammamixEM") { # x <- em.fit$x # n <- length(x) # k <- length(em.fit$lambda) # alpha <- em.fit$gamma.pars[1,] # beta <- em.fit$gamma.pars[2,] # lambda <- em.fit$lambda # j = 0 # lambda.bs = NULL # alpha.bs = NULL # beta.bs = NULL # while (j < B) { # j = j + 1 # comp = sample(1:k,size=n,replace=T,prob=lambda) # x.sim = sapply(1:n,function(i) rgamma(1,shape=alpha[comp[i]],scale=beta[comp[i]])) # em.bs = try(gammamixEM(x = x.sim, k = k, lambda = lambda, # alpha = alpha, beta = beta, ...), silent = TRUE) # if (class(em.bs) == "try-error") { # j = j - 1 # } # else { # lambda.bs = cbind(lambda.bs, em.bs$lambda) # alpha.bs = cbind(alpha.bs, as.vector(em.bs$gamma.pars[1,])) # beta.bs = cbind(beta.bs, as.vector(em.bs$gamma.pars[2,])) # } # } # lambda.se = apply(lambda.bs, 1, sd) # alpha.se = apply(alpha.bs, 1, sd) # beta.se = apply(beta.bs, 1, sd) # bs.list = list(lambda = lambda.bs, lambda.se = lambda.se, # alpha = alpha.bs, alpha.se = alpha.se, beta = beta.bs, beta.se = beta.se) # } ##### if (mix.type == "repnormmixEM") { #Start Here... k=length(em.fit$lambda) y=em.fit$y m=nrow(y) n=ncol(y) if (arbmean == FALSE) { scale = em.fit$scale mu = rep(em.fit$mu, k) } else { scale = 1 mu = em.fit$mu } lambda = em.fit$lambda if(arbvar==FALSE){ sigma = rep(em.fit$sigma,k) } else{ sigma = scale*em.fit$sigma } j = 0 lambda.bs=NULL mu.bs=NULL sigma.bs=NULL scale.bs=NULL while (j < B) { j = j + 1 w=rmultinom(n,size=1,prob=lambda) y.sim=sapply(1:n,function(i) rnorm(m,mean=mu[w[,i]==1],sd=sigma[w[,i]==1]) ) em.bs = try(repnormmixEM(x = y.sim,k = k, arbmean = arbmean, arbvar = arbvar, lambda=em.fit$lambda, mu=em.fit$mu, sigma=(scale*em.fit$sigma), ...), silent = TRUE) if (inherits(em.bs, "try-error", which = TRUE) || em.bs$restarts!=0) { j = j - 1 } else { if(arbmean==FALSE){ lambda.bs = cbind(lambda.bs,em.bs$lambda) mu.bs = cbind(mu.bs,as.vector(em.bs$mu)) sigma.bs = cbind(sigma.bs,em.bs$sigma) scale.bs = cbind(scale.bs,em.bs$scale) } else { lambda.bs = cbind(lambda.bs,em.bs$lambda) mu.bs = cbind(mu.bs,as.vector(mu.bs$beta)) sigma.bs = cbind(sigma.bs,em.bs$sigma) } } } if(arbmean==FALSE){ lambda.se=apply(lambda.bs,1,sd) mu.se=apply(mu.bs,1,sd) sigma.se=apply(sigma.bs,1,sd) scale.se=apply(scale.bs,1,sd) bs.list=list(lambda = lambda.bs, lambda.se = lambda.se, mu = mu.bs, mu.se = mu.se, sigma=sigma.bs, sigma.se = sigma.se, scale=scale.bs, scale.se=scale.se) } else{ lambda.se=apply(lambda.bs,1,sd) mu.se=apply(mu.bs,1,sd) sigma.se=apply(sigma.bs,1,sd) bs.list=list(lambda = lambda.bs, lambda.se = lambda.se, mu = mu.bs, mu.se = mu.se, sigma=sigma.bs, sigma.se = sigma.se) } } #### if (mix.type == "mvnormalmixEM") { #Start Here... k=length(em.fit$lambda) y=em.fit$x n=nrow(y) p=ncol(y) if (arbmean == FALSE) { mu = lapply(1:k,function(i) em.fit$mu) } else { mu = em.fit$mu } lambda = em.fit$lambda if(arbvar==FALSE){ sigma = lapply(1:k, function(i) em.fit$sigma) } else{ sigma = em.fit$sigma } j = 0 lambda.bs=NULL mu.bs=NULL sigma.bs=NULL while (j < B) { j = j + 1 w=rmultinom(n,size=1,prob=lambda) y.sim=t(sapply(1:n,function(i) rmvnorm(1,mu=mu[w[,i]==1][[1]],sigma=sigma[w[,i]==1][[1]]) )) em.bs = try(mvnormalmixEM(x = y.sim, k = k, arbmean = arbmean, arbvar = arbvar, lambda=em.fit$lambda, mu=em.fit$mu, sigma=em.fit$sigma, ...), silent = TRUE) if (inherits(em.bs, "try-error", which = TRUE) || em.bs$restarts!=0) { j = j - 1 } else { lambda.bs = cbind(lambda.bs,em.bs$lambda) mu.bs1 = as.vector(sapply(em.bs$mu,c)) mu.bs = cbind(mu.bs, mu.bs1) if(arbvar==FALSE){ sigma.bs=cbind(sigma.bs,as.vector(em.bs$sigma)) } else{ sigma.bs1 = lapply(1:k, function(i) as.vector(em.bs$sigma[[i]])) sigma.bs2 = as.vector(sapply(sigma.bs1,c)) sigma.bs = cbind(sigma.bs,sigma.bs2) } } } lambda.se=apply(lambda.bs,1,sd) mu.se1=apply(mu.bs,1,sd) if(arbmean==TRUE){ mu.se = lapply(1:k,function(i) mu.se1[((i-1)*p+1):(i*p)]) } else mu.se = mu.se1 sigma.se1=apply(sigma.bs,1,sd) if(arbvar==TRUE){ sigma.se=lapply(1:k, function(i) matrix(sigma.se1[((i-1)*(p^2)+1):(i*(p^2))], nrow=p,ncol=p)) } else sigma.se=matrix(sigma.se1,nrow=p) bs.list=list(lambda = lambda.bs, lambda.se = lambda.se, mu = mu.bs, mu.se = mu.se, sigma=sigma.bs, sigma.se = sigma.se) } #### if (mix.type == "normalmixEM") { #Start Here... k=length(em.fit$lambda) y=em.fit$x n=length(y) x=em.fit$x if (arbmean == FALSE) { scale = em.fit$scale mu = rep(em.fit$mu, k) } else { scale = 1 mu = em.fit$mu } lambda = em.fit$lambda if(arbvar==FALSE){ sigma = rep(em.fit$sigma,k) } else{ sigma = scale*em.fit$sigma } j = 0 lambda.bs=NULL mu.bs=NULL sigma.bs=NULL scale.bs=NULL while (j < B) { j = j + 1 w=rmultinom(n,size=1,prob=lambda) y.sim=sapply(1:n,function(i) rnorm(1,mean=mu[(w[,i]==1)],sd=sigma[w[,i]==1]) ) em.bs = try(normalmixEM(x = y.sim, k = k, arbmean = arbmean, arbvar = arbvar, lambda=em.fit$lambda, mu=em.fit$mu, sigma=(scale*em.fit$sigma), ...), silent = TRUE) if (inherits(em.bs, "try-error", which = TRUE) || em.bs$restarts!=0) { j = j - 1 } else { if(arbmean==FALSE){ lambda.bs = cbind(lambda.bs,em.bs$lambda) mu.bs = cbind(mu.bs,as.vector(em.bs$mu)) sigma.bs = cbind(sigma.bs,em.bs$sigma) scale.bs = cbind(scale.bs,em.bs$scale) } else { lambda.bs = cbind(lambda.bs,em.bs$lambda) mu.bs = cbind(mu.bs,as.vector(em.bs$mu)) sigma.bs = cbind(sigma.bs,em.bs$sigma) } } } if(arbmean==FALSE){ lambda.se=apply(lambda.bs,1,sd) mu.se=apply(mu.bs,1,sd) sigma.se=apply(sigma.bs,1,sd) scale.se=apply(scale.bs,1,sd) bs.list=list(lambda = lambda.bs, lambda.se = lambda.se, mu = mu.bs, mu.se = mu.se, sigma=sigma.bs, sigma.se = sigma.se, scale=scale.bs, scale.se=scale.se) } else{ lambda.se=apply(lambda.bs,1,sd) mu.se=matrix(apply(mu.bs,1,sd),ncol=k) sigma.se=apply(sigma.bs,1,sd) bs.list=list(lambda = lambda.bs, lambda.se = lambda.se, mu = mu.bs, mu.se = mu.se, sigma=sigma.bs, sigma.se = sigma.se) } } ### if (mix.type == "multmixEM") { y<-em.fit$y n<-nrow(y) n.i<-apply(y,1,sum) p<-ncol(y) k<-length(em.fit$lambda) theta<-em.fit$theta lambda<-em.fit$lambda j = 0 lambda.bs=NULL theta.bs=NULL while (j < B) { j = j + 1 w=rmultinom(n,size=1,prob=lambda) y.sim=t(sapply(1:n,function(i) rmultinom(1,size=n.i[i],prob=theta[(w[,i]==1),]) )) em.bs = try(multmixEM(y = y.sim, k = k, lambda=lambda, theta=theta, ...), silent = TRUE) if (inherits(em.bs, "try-error", which = TRUE) || em.bs$restarts!=0) { j = j - 1 } else{ lambda.bs=cbind(lambda.bs,em.bs$lambda) theta.bs=cbind(theta.bs,as.vector(em.bs$theta)) } } lambda.se=apply(lambda.bs,1,sd) theta.se=matrix(apply(theta.bs,1,sd),nrow=k) bs.list=list(lambda=lambda.bs, lambda.se=lambda.se, theta=theta.bs, theta.se=theta.se) } #### if (mix.type == "logisregmixEM") { y=em.fit$y n=length(y) if (is.null(N)) N=rep(1,n) k=length(em.fit$lambda) if(sum(em.fit$x[,1]==1)==n){ x=em.fit$x[,-1] } else x=em.fit$x lambda<-em.fit$lambda beta<-em.fit$beta xbeta.new=em.fit$x%*%beta prob=inv.logit(xbeta.new) j = 0 lambda.bs=NULL beta.bs=NULL while (j < B) { j = j + 1 w=rmultinom(n,size=1,prob=lambda) y.sim = sapply(1:n, function(i) rbinom(1, size=N[i], prob=prob[,(w[,i]==1)])) em.bs = try(logisregmixEM(y = y.sim, x=x, N=N, k = k, lambda=lambda, beta=beta,...), silent = TRUE) if (inherits(em.bs, "try-error", which = TRUE) || em.bs$restarts!=0) { j = j - 1 } else{ lambda.bs=cbind(lambda.bs,em.bs$lambda) beta.bs=cbind(beta.bs,as.vector(em.bs$beta)) } } lambda.se=apply(lambda.bs,1,sd) beta.se=matrix(apply(beta.bs,1,sd),nrow=k) bs.list=list(lambda=lambda.bs, lambda.se=lambda.se, beta=beta.bs, beta.se=beta.se) } #### if (mix.type == "poisregmixEM") { k=length(em.fit$lambda) y=em.fit$y n=length(y) if(sum(em.fit$x[,1]==1)==n){ x=em.fit$x[,-1] } else x=em.fit$x lambda<-em.fit$lambda beta<-em.fit$beta xbeta.new=em.fit$x%*%beta prob=exp(xbeta.new) j = 0 lambda.bs=NULL beta.bs=NULL while (j < B) { j = j + 1 w=rmultinom(n,size=1,prob=lambda) y.sim = sapply(1:n, function(i) rpois(1, lambda=prob[,(w[,i]==1)])) em.bs = try(poisregmixEM(y = y.sim, x=x, k = k, lambda=lambda, beta=beta, ...), silent = TRUE) if (inherits(em.bs, "try-error", which = TRUE) || em.bs$restarts!=0) { j = j - 1 } else{ lambda.bs=cbind(lambda.bs,em.bs$lambda) beta.bs=cbind(beta.bs,as.vector(em.bs$beta)) } } lambda.se=apply(lambda.bs,1,sd) beta.se=matrix(apply(beta.bs,1,sd),nrow=k) bs.list=list(lambda=lambda.bs, lambda.se=lambda.se, beta=beta.bs, beta.se=beta.se) } bs.list } mixtools/R/regmixEMmixed.R0000755000175100001440000003735314342153463015261 0ustar hornikusersregmixEM.mixed = function (y, x, w = NULL, sigma = NULL, arb.sigma = TRUE, alpha = NULL, lambda = NULL, mu = NULL, rho=NULL, R = NULL, arb.R = TRUE, k = 2, ar.1 = FALSE, addintercept.fixed = FALSE, addintercept.random = TRUE, epsilon = 1e-08, maxit = 10000, verb = FALSE) { Omega.def <- function(rho,n){ Omega.1stcol <- NULL for(i in 1:n){ Omega.1stcol <- c(Omega.1stcol,rho^(i-1)) } A=Omega.1stcol for(i in 1:(n-1)){ A=cbind(A,c(rep(0,i),Omega.1stcol[1:(n-i)])) } B=A+t(A) diag(B)=rep(1,n) B=B/(1-rho^2) B } rho.max<-function(rho,z,sigma,y,x,w,alpha,beta,V.beta){ n.i <- length(y) Omega.ij <- Omega.def(rho=rho,n=n.i) -.5*z*(log(det(Omega.ij))+(1/sigma)*(t(y- as.vector(w %*% alpha)-x%*%beta))%*%solve(Omega.ij)%*%(y- as.vector(w %*% alpha)-x%*%beta)+sum(diag(solve(Omega.ij) %*% x %*% V.beta %*% t(x) ))) } `%L*%` = function(x, y) lapply(1:length(x), function(z) { t(x[[z]]) %*% y[[z]] }) N <- length(y) n <- sapply(y, length) if (addintercept.random) { x.1 = lapply(1:N, function(i) cbind(1, x[[i]])) x = x.1 } if (is.null(w)) { w = as.list(rep(0, N)) mixed=FALSE } else mixed=TRUE p <- ncol(x[[1]]) if (mixed == TRUE) { if (addintercept.fixed) { w.1 = lapply(1:N, function(i) cbind(1, w[[i]])) w = w.1 } tww = w %L*% w tww.inv = 0 for (i in 1:N) { tww.inv = tww.inv + tww[[i]] } tww.inv = solve(tww.inv) twx = w %L*% x twy = w %L*% y q <- ncol(w[[1]]) } tmp <- regmix.mixed.init(y = y, x = x, w = w, sigma = sigma, arb.sigma = arb.sigma, alpha = alpha, lambda = lambda, mu = mu, R = R, arb.R = arb.R, k = k, mixed = mixed, addintercept.fixed = addintercept.fixed, addintercept.random = addintercept.random) alpha <- tmp$alpha lambda <- tmp$lambda mu <- tmp$mu R <- tmp$R sigma <- tmp$sigma s.2 <- sigma^2 if(ar.1==TRUE & is.null(rho)==TRUE){ rho=matrix(runif(N*k,-1,1),nrow=N,ncol=k) } txx = x %L*% x diff <- 1 iter <- 0 obsloglik=-Inf ll <- NULL restarts <- 0 if(ar.1) Omega.k <- lapply(1:N, function(i) lapply(1:k, function(j) Omega.def(rho=rho[i,j],n=n[i]))) else Omega.k <- lapply(1:N, function(i) lapply(1:k, function(j) diag(1, n[i]))) while (diff > epsilon && iter < maxit) { txOx<-lapply(1:N, function(i) lapply(1:k, function(j) t(x[[i]]) %*% solve(Omega.k[[i]][[j]]) %*% x[[i]])) if (arb.R) { V.beta = list() for (i in 1:N) { V.beta[[i]] = list() V.beta[[i]] = lapply(1:k, function(j) { solve(txOx[[i]][[j]]/s.2[j * arb.sigma + (1 - arb.sigma)] + solve(R[[j]])) }) } beta = list() for (i in 1:N) { beta[[i]] = matrix(nrow = p, ncol = k) for (j in 1:k) { beta[[i]][, j] = V.beta[[i]][[j]] %*% (t(x[[i]])/s.2[j * arb.sigma + (1 - arb.sigma)]) %*% solve(Omega.k[[i]][[j]]) %*% (y[[i]] - as.vector(w[[i]] %*% alpha) - x[[i]] %*% mu[, j]) + mu[, j] } } z = matrix(nrow = N, ncol = k) for (i in 1:N) { for (j in 1:k) { z.denom = c() for (m in 1:k) { z.denom = c(z.denom, lambda[m]/lambda[j] * (det(x[[i]] %*% R[[j]] %*% t(x[[i]]) + s.2[j * arb.sigma + (1 - arb.sigma)] * Omega.k[[i]][[j]])/det(x[[i]] %*% R[[m]] %*% t(x[[i]]) + s.2[m * arb.sigma + (1 - arb.sigma)] * Omega.k[[i]][[m]]))^(0.5) * exp(-0.5 * (t(y[[i]] - as.vector(w[[i]] %*% alpha) - x[[i]] %*% mu[, m]) %*% solve(x[[i]] %*% R[[m]] %*% t(x[[i]]) + s.2[m * arb.sigma + (1 - arb.sigma)] * Omega.k[[i]][[m]]) %*% (y[[i]] - as.vector(w[[i]] %*% alpha) - x[[i]] %*% mu[, m]) - t(y[[i]] - as.vector(w[[i]] %*% alpha) - x[[i]] %*% mu[, j]) %*% solve(x[[i]] %*% R[[j]] %*% t(x[[i]]) + s.2[j * arb.sigma + (1 - arb.sigma)] * Omega.k[[i]][[j]]) %*% (y[[i]] - as.vector(w[[i]] %*% alpha) - x[[i]] %*% mu[, j])))) } z[i, j] = 1/sum(z.denom) } } # z[,k]=1-apply(as.matrix(z[,(1:(k-1))]),1,sum) z = z/apply(z,1,sum) sing <- sum(is.na(z)) sum.z = apply(z, 2, sum) lambda.new <- sum.z/N if (sum(lambda.new < 1e-08)>0 || is.na(sum(lambda.new))) { sing <- 1 } else { mu.new <- matrix(nrow = p, ncol = k) for (j in 1:k) { mu.2 <- matrix(sapply(1:N, function(i) { beta[[i]][, j] }), ncol = N) mu.new[, j] <- apply(t(apply(t(mu.2), 2, "*", matrix(z[, j], nrow = 1))), 1, sum) } mu.new = t(apply(t(mu.new), 2, "/", matrix(sum.z, nrow = 1))) if (mixed == TRUE) { a.vec <- c() A.mat <- 0 for (i in 1:N) { for (j in 1:k) { A.mat = A.mat + (z[i, j]/s.2[j * arb.sigma + (1 - arb.sigma)])*tww[[i]] a.vec = cbind(a.vec, (z[i, j]/s.2[j * arb.sigma + (1 - arb.sigma)]) * (twy[[i]] - twx[[i]] %*% beta[[i]][, j])) # a.vec = cbind(a.vec, z[i, j] * (twy[[i]] - # twx[[i]] %*% beta[[i]][, j])) } } # alpha.new <- tww.inv %*% apply(a.vec, 1, sum) alpha.new <- solve(A.mat) %*% apply(a.vec, 1, sum) alpha = alpha.new } s.tr <- matrix(nrow = N, ncol = k) z.n <- matrix(nrow = N, ncol = k) for (i in 1:N) { for (j in 1:k) { s.tr[i, j] = sum(diag(z[i, j] * (solve(Omega.k[[i]][[j]]) %*% (y[[i]] - as.vector(w[[i]] %*% alpha) - x[[i]] %*% beta[[i]][, j]) %*% t(y[[i]] - as.vector(w[[i]] %*% alpha) - x[[i]] %*% beta[[i]][, j]) + x[[i]] %*% V.beta[[i]][[j]] %*% t(x[[i]])))) z.n[i, j] = z[i, j] * n[i] } } if (arb.sigma) { s.2.new <- apply(s.tr, 2, sum)/apply(z.n, 2, sum) } else s.2.new <- sum(s.tr)/sum(n) R.new = list() for (j in 1:k) { r.2 <- 0 for (i in 1:N) { r <- z[i, j] * (V.beta[[i]][[j]] + t(t(beta[[i]][, j] - mu.new[, j])) %*% (beta[[i]][, j] - mu.new[, j])) r.2 <- r.2 + r } R.new[[j]] = r.2/sum(z[, j]) } lambda = lambda.new mu = mu.new s.2 = s.2.new R = R.new L = matrix(nrow = N, ncol = k) L = t(sapply(1:N, function(i) { sapply(1:k, function(j) { dmvnorm(as.vector(y[[i]]), as.vector(x[[i]] %*% mu[, j] + as.vector(w[[i]] %*% alpha)), x[[i]] %*% R[[j]] %*% t(x[[i]]) + s.2[j * arb.sigma + (1 - arb.sigma)] * Omega.k[[i]][[j]]) }) })) L.n = t(apply(t(L), 2, "*", matrix(lambda, nrow = 1))) newobsloglik = sum(log(apply(L.n, 1, sum))) } } else { R.inv = solve(R) V.beta = list() for (i in 1:N) { V.beta[[i]] = list() V.beta[[i]] = lapply(1:k, function(j) { solve(txOx[[i]][[j]]/s.2[j * arb.sigma + (1 - arb.sigma)] + R.inv) }) } beta = list() for (i in 1:N) { beta[[i]] = matrix(nrow = p, ncol = k) for (j in 1:k) { beta[[i]][, j] = V.beta[[i]][[j]] %*% (t(x[[i]])/s.2[j * arb.sigma + (1 - arb.sigma)]) %*% solve(Omega.k[[i]][[j]]) %*% (y[[i]] - as.vector(w[[i]] %*% alpha) - x[[i]] %*% mu[, j]) + mu[, j] } } z = matrix(nrow = N, ncol = k) for (i in 1:N) { for (j in 1:k) { z.denom = c() for (m in 1:k) { z.denom = c(z.denom, lambda[m]/lambda[j] * (det(x[[i]] %*% R %*% t(x[[i]]) + s.2[j * arb.sigma + (1 - arb.sigma)] * Omega.k[[i]][[j]])/det(x[[i]] %*% R %*% t(x[[i]]) + s.2[m * arb.sigma + (1 - arb.sigma)] * Omega.k[[i]][[m]]))^(0.5) * exp(-0.5 * (t(y[[i]] - as.vector(w[[i]] %*% alpha) - x[[i]] %*% mu[, m]) %*% solve(x[[i]] %*% R %*% t(x[[i]]) + s.2[m * arb.sigma + (1 - arb.sigma)] * Omega.k[[i]][[m]]) %*% (y[[i]] - as.vector(w[[i]] %*% alpha) - x[[i]] %*% mu[, m]) - t(y[[i]] - as.vector(w[[i]] %*% alpha) - x[[i]] %*% mu[, j]) %*% solve(x[[i]] %*% R %*% t(x[[i]]) + s.2[j * arb.sigma + (1 - arb.sigma)] * Omega.k[[i]][[j]]) %*% (y[[i]] - as.vector(w[[i]] %*% alpha) - x[[i]] %*% mu[, j])))) } z[i, j] = 1/sum(z.denom) } } # z[,k]=1-apply(as.matrix(z[,(1:(k-1))]),1,sum) z = z/apply(z,1,sum) sing <- sum(is.nan(z)) sum.z = apply(z, 2, sum) lambda.new <- sum.z/N if (sum(lambda.new < 1e-08)>0 || is.na(sum(lambda.new))) { sing <- 1 } else { mu.new <- matrix(nrow = p, ncol = k) for (j in 1:k) { mu.2 <- matrix(sapply(1:N, function(i) { beta[[i]][, j] }), ncol = N) mu.new[, j] <- apply(t(apply(t(mu.2), 2, "*", matrix(z[, j], nrow = 1))), 1, sum) } mu.new = t(apply(t(mu.new), 2, "/", matrix(sum.z, nrow = 1))) if (mixed == TRUE) { a.vec <- c() A.mat <- 0 for (i in 1:N) { for (j in 1:k) { A.mat = A.mat + (z[i, j]/s.2[j * arb.sigma + (1 - arb.sigma)])*tww[[i]] a.vec = cbind(a.vec, (z[i, j]/s.2[j * arb.sigma + (1 - arb.sigma)]) * (twy[[i]] - twx[[i]] %*% beta[[i]][, j])) # a.vec = cbind(a.vec, z[i, j] * (twy[[i]] - # twx[[i]] %*% beta[[i]][, j])) } } # alpha.new <- tww.inv %*% apply(a.vec, 1, sum) alpha.new <- solve(A.mat) %*% apply(a.vec, 1, sum) alpha = alpha.new } s.tr <- matrix(nrow = N, ncol = k) z.n <- matrix(nrow = N, ncol = k) for (i in 1:N) { for (j in 1:k) { s.tr[i, j] = sum(diag(z[i, j] * (solve(Omega.k[[i]][[j]]) %*% (y[[i]] - as.vector(w[[i]] %*% alpha) - x[[i]] %*% beta[[i]][, j]) %*% t(y[[i]] - as.vector(w[[i]] %*% alpha) - x[[i]] %*% beta[[i]][, j]) + x[[i]] %*% V.beta[[i]][[j]] %*% t(x[[i]])))) z.n[i, j] = z[i, j] * n[i] } } if (arb.sigma) { s.2.new <- apply(s.tr, 2, sum)/apply(z.n, 2, sum) } else s.2.new <- sum(s.tr)/sum(n) r.3 <- 0 for (j in 1:k) { r.2 <- 0 for (i in 1:N) { r <- z[i, j] * (V.beta[[i]][[j]] + t(t(beta[[i]][, j] - mu.new[, j])) %*% (beta[[i]][, j] - mu.new[, j])) r.2 <- r.2 + r } r.3 <- r.3 + r.2 } R.new = r.3/N lambda = lambda.new mu = mu.new s.2 = s.2.new R = R.new if(ar.1){ rho.new<-matrix(0,nrow=N,ncol=k) for(i in 1:N){ for(j in 1:k){ rho.new[i,j] <- optimize(rho.max,interval=c(-1,1),maximum=TRUE,tol=.Machine$double.eps,z=z[i,j],sigma=s.2[j * arb.sigma + (1 - arb.sigma)],y=y[[i]],x=x[[i]],w=w[[i]],alpha=alpha,beta=beta[[i]][,j],V.beta=V.beta[[i]][[j]])$max } } rho = rho.new Omega.k <- lapply(1:N, function(i) lapply(1:k, function(j) Omega.def(rho=rho[i,j],n=n[i] ))) } L = matrix(nrow = N, ncol = k) L = t(sapply(1:N, function(i) { sapply(1:k, function(j) { dmvnorm(as.vector(y[[i]]), as.vector(x[[i]] %*% mu[, j] + as.vector(w[[i]] %*% alpha)), x[[i]] %*% R %*% t(x[[i]]) + s.2[j * arb.sigma + (1 - arb.sigma)] * Omega.k[[i]][[j]]) }) })) L.n = t(apply(t(L), 2, "*", matrix(lambda, nrow = 1))) newobsloglik = sum(log(apply(L.n, 1, sum))) } } if (sing > 0 || is.na(newobsloglik) || abs(newobsloglik) == Inf || newobsloglik < obsloglik) {# || sum(z) != N cat("Need new starting values due to singularity...", "\n") restarts <- restarts + 1 if(restarts>15) stop("Too many tries!") tmp <- regmix.mixed.init(y = y, x = x, w = w, arb.sigma = arb.sigma, arb.R = arb.R, k = k, mixed = mixed, addintercept.fixed = addintercept.fixed, addintercept.random = addintercept.random) alpha <- tmp$alpha lambda <- tmp$lambda mu <- tmp$mu R <- tmp$R sigma <- tmp$sigma s.2 <- sigma^2 diff <- 1 iter <- 0 obsloglik=-Inf ll <- NULL } else { diff <- newobsloglik - obsloglik obsloglik <- newobsloglik ll <- c(ll, obsloglik) iter <- iter + 1 if (verb) { cat("iteration=", iter, "diff=", diff, "log-likelihood", obsloglik, "\n") } } } if (iter == maxit) { cat("WARNING! NOT CONVERGENT!", "\n") } cat("number of iterations=", iter, "\n") colnames(z) <- c(paste("comp", ".", 1:k, sep = "")) a=list(x=x, y=y, w=w, lambda = lambda, mu = mu, R = R, sigma = sqrt(s.2), alpha = alpha, loglik = obsloglik, posterior.z = z, posterior.beta = beta, all.loglik = ll, restarts=restarts, ft="regmixEM.mixed") class(a) = "mixEM" a } mixtools/R/multmixmodelsel.R0000755000175100001440000000350114342153463015725 0ustar hornikusersmultmixmodel.sel <- function (y, comps = NULL, ...) { if (class(y)[1]=="list" && !is.null(y$y)) { y <- y$y } n = dim(y)[1] p = dim(y)[2] m = min(apply(y, 1, sum)) # m = unique(apply(y, 1, sum)) # if (length(m) > 1) { # stop("Each row of y must have same total number of observations") # } max.allowed.comp = floor((m + 1)/2) if (is.null(comps)) comps = 1:max.allowed.comp if (max(comps) > max.allowed.comp) { stop(paste("No more than", max.allowed.comp, "components allowed", "with", m, "multinomial trials")) } aic = NULL bic = NULL caic = NULL icl = NULL ll = NULL theta = matrix(0, 0, p) lambda = NULL for (k in sort(comps)) { # cat("Testing", k, "components: ") # newrows = k - nrow(theta) tmp <- multmix.init(y, k = k) theta <- tmp$theta lambda <- tmp$lambda if (k!=1){ em = multmixEM(y, lambda = lambda, theta = theta, k = k, ...) loglik = em$loglik lambda = em$lambda theta = em$theta # cat(em$iter, "iterations.\n") } else loglik = sum(log(exp(apply(y,1,ldmult,theta=theta)))) aic = c(aic, loglik - (p * k - 1)) bic = c(bic, loglik - log(n) * (p * k - 1)/2) caic = c(caic, loglik - (log(n) + 1) * (p * k - 1)/2) if (k==1) { icl = c(icl, loglik - log(n) * (p * k - 1)/2) } else icl = c(icl, loglik - log(n) * (p * k - 1)/2 - sum(lambda * log(lambda))) ll = c(ll, loglik) } out = rbind(aic, bic, caic, icl, ll) # Winner = apply(out, 1, function(x) (1:length(x))[x == # max(x)]) win = apply(out, 1, which.max) rownames(out) = c("AIC", "BIC", "CAIC", "ICL", "Loglik") colnames(out) = sort(comps) Winner = as.numeric(colnames(out)[win]) cbind(out, Winner) } mixtools/R/kernG.R0000755000175100001440000000011414342153463013544 0ustar hornikuserskern.G <- function (x, xi, h) { exp(-((xi-x)/h)^2/2)/sqrt(2*pi)/h } mixtools/R/lambda.R0000755000175100001440000000222614343276430013725 0ustar hornikuserslambda <- function (z, x, xi, h = NULL, kernel = c("Gaussian", "Beta", "Triangle", "Cosinus", "Optcosinus"), g = 0) { if (is.null(h)) { cat("WARNING! BANDWIDTH MUST BE SPECIFIED!", "\n") } n <- nrow(xi) p <- ncol(xi) if(length(h)==1) h <- rep(h,p) if(length(h)!=p) { stop("Check the length of the bandwidth h.") } else{ h <- matrix(rep(h,each=n),nrow=n) } x <- matrix(rep(x,each=n),nrow=n) X.mat=cbind(1,(xi-x)) kernel <- match.arg(kernel) inwindow <- (abs((xi - x)/h) <= 1) if (kernel == "Gaussian") { W=(kern.G(x, xi, h) * inwindow) } else if (kernel == "Beta") { W=(kern.B(x, xi, h, g) * inwindow) } else if (kernel == "Triangle") { W=(kern.T(x, xi, h) * inwindow) } else if (kernel == "Cosinus") { W=(kern.C(x, xi, h) * inwindow) } else if (kernel == "Optcosinus") { W=(kern.O(x, xi, h) * inwindow) } W = diag(apply(matrix(W,ncol=ncol(X.mat)-1),1,prod)) A=try(solve(t(X.mat)%*%(W%*%X.mat)), silent=TRUE) if(inherits(A, "try-error", which = TRUE)) { A=ginv(t(X.mat)%*%(W%*%X.mat)) } beta.x=A%*%t(X.mat)%*%(W%*%cbind(z)) beta.x }mixtools/R/regmix.init.R0000755000175100001440000000406714342153463014746 0ustar hornikusersregmix.init<-function (y, x, lambda = NULL, beta = NULL, s = NULL, k = 2, addintercept = TRUE, arbmean = TRUE, arbvar = TRUE) { x <- as.matrix(x) n <- length(y) p <- ncol(x) if (addintercept) { x = x[, -1] } else x = x if (is.null(lambda)) { lambda = runif(k) lambda = lambda/sum(lambda) } else k = length(lambda) A = round(lambda * n) while(min(A)<4){ lambda = runif(k) lambda = lambda/sum(lambda) A = round(lambda * n) } A[k] = n - sum(A[1:(k - 1)]) B = c(0, cumsum(A)) w = cbind(y, x) w = w[order(w[, 1]), ] w.bin = list() for (j in 1:k) { w.bin[[j]] <- w[(B[j] + 1):B[j + 1], ] } if (addintercept) { lm.out <- lapply(1:k, function(i) lm(w.bin[[i]][, 1] ~ w.bin[[i]][, 2:p])) } else lm.out <- lapply(1:k, function(i) lm(w.bin[[i]][, 1] ~ w.bin[[i]][, 2:(p + 1)] - 1)) s.hyp = lapply(lm.out, anova) s.hyp = as.vector(sqrt(sapply(1:k, function(i) s.hyp[[i]]$Mean[length(s.hyp[[i]]$Mean)]))) s.hyp[(s.hyp<=0)|(is.na(s.hyp)==1)]=1 if (is.null(s)) { if (arbvar) { s = 1/rexp(k, rate = s.hyp) } else { s.hyp = mean(s.hyp) s = 1/rexp(1, rate = s.hyp) } } if (is.null(s) == FALSE && arbvar == TRUE) { k = length(s) } if (is.null(beta)) { x.x <- solve(t(x)%*%x) beta.hyp = matrix(sapply(lm.out, coef), ncol = k) beta = matrix(0, nrow = p, ncol = k) for (j in 1:k) { beta[, j] = rnorm(p, mean = as.vector(beta.hyp[, # j]), sd = (s[arbvar * j + (1 - arbvar)]*sqrt(diag(x.x))) ) j]), sd = (s.hyp[arbvar * j + (1 - arbvar)]*sqrt(diag(x.x))) ) } if (arbmean == FALSE) { beta = apply(beta, 1, mean) } } if (is.null(beta) == FALSE && arbmean == TRUE) { k = ncol(beta) } list(lambda = lambda, beta = beta, s = s, k = k) }mixtools/R/regmixEMloc.R0000755000175100001440000000566614343276574014744 0ustar hornikusersregmixEM.loc=function (y, x, lambda = NULL, beta = NULL, sigma = NULL, k = 2, addintercept = TRUE, kern.l = c("Gaussian", "Beta", "Triangle", "Cosinus", "Optcosinus"), epsilon = 1e-08, maxit = 10000, kernl.g = 0, kernl.h = 1, verb = FALSE) { diff <- 1 iter <- 0 x.1 <- cbind(1, x) n <- length(y) kern.l <- match.arg(kern.l) out.EM <- regmixEM.lambda(y, x, lambda = lambda, beta = beta, sigma = sigma, k = k, epsilon = epsilon, maxit = maxit) ll = out.EM$loglik restarts <- 0 while (diff > epsilon && iter < maxit) { old.l.x = out.EM$lambda old.loglik = out.EM$loglik l.x = matrix(nrow = n, ncol = k) for (i in 1:k) { # l.x[, i] <- c((cbind(rep(1,n),0)*t(apply(matrix(x, ncol = 1), 1, lambda, # z = out.EM$post[, i], xi = x, kernel = kern.l, # g = kernl.g, h = kernl.h)))[,1]) l.x[,i] <- t(apply(as.matrix(x), 1, lambda, z = out.EM$post[, i], xi = as.matrix(x), kernel = kern.l, g = kernl.g, h = kernl.h))[,1] l.x[,i] <- pmin(pmax(l.x[,i],0),1) # l.x[,i]=apply(cbind(l.x[,i]),1,max,0) # l.x[,i]=apply(cbind(l.x[,i]),1,min,1) } l.x <- l.x/matrix(rep(apply(l.x,1,sum),k),ncol = k) # l.x <- cbind(l.x, 1 - apply(l.x, 1, sum)) out.EM.loc <- regmixEM.lambda(y, x, beta = out.EM$beta, sigma = out.EM$sigma, lambda = l.x, k = k) loglik.loc <- out.EM.loc$loglik out.EM.old <- regmixEM.lambda(y, x, beta = out.EM$beta, sigma = out.EM$sigma, lambda = old.l.x, k = k) loglik.old <- out.EM.old$loglik if (loglik.loc > old.loglik) { out.EM <- out.EM.loc } else out.EM <- out.EM.old loglik.chosen <- out.EM$loglik ll <- c(ll, loglik.chosen) diff <- loglik.chosen - old.loglik if (diff < 0) { cat("Generating new starting values...", "\n") out.EM <- regmixEM.lambda(y, x, lambda = lambda, beta = beta, sigma = sigma, k = k, epsilon = epsilon, maxit = maxit) restarts <- restarts + 1 if (restarts > 15) stop("Too many tries!") iter <- 0 diff <- 1 } else { iter <- iter + 1 if (verb) { cat("iteration=", iter, "diff=", diff, "log-likelihood", loglik.chosen, "\n") } } } if (iter == maxit) { cat("WARNING! NOT CONVERGENT!", "\n") } cat("number of overall iterations=", iter, "\n") a = list(x = x, y = y, lambda.x = out.EM$lambda, beta = out.EM$beta, sigma = out.EM$sigma, loglik = loglik.chosen, posterior = out.EM$post, all.loglik = ll, restarts = restarts, ft = "regmixEM.loc") class(a) = "mixEM" a } mixtools/R/rmvnorm.R0000755000175100001440000000155614342153463014211 0ustar hornikusers# Alternative version of rmvnorm to eliminate dependence of mixtools # on additional package 'mvtnorm' # Uses eigen decomposition assuming symmetric==TRUE. Don't know how efficient # this might be relative to other approaches, but some suggest this is among # the most efficient methods to find a matrix square root. rmvnorm <- function(n, mu=NULL, sigma=NULL) { if (is.null(mu)) { if (is.null(sigma)) { return(rnorm(n)) } else { mu = rep(0, nrow(sigma)) } } else if (is.null(sigma)) { sigma=diag(length(mu)) } lmu <- length(mu) if (lmu != nrow(sigma) || lmu != ncol(sigma)) stop("length of mu must equal nrow and ncol of sigma") e <- eigen(sigma, symmetric=TRUE) if (any(e$val<0)) stop("Numerically negative definite covariance matrix") t(mu + e$vec %*% (t(e$vec) * sqrt(e$val)) %*% matrix(rnorm(n*lmu), lmu, n)) } mixtools/R/plotly_post.beta.R0000644000175100001440000001565414343051443016010 0ustar hornikusersplotly_post.beta <- function(y, x, p.beta, p.z, cex = 6,lwd=1, title.size = 15, xlab.size = 15 , xtick.size = 15, ylab.size = 15 , ytick.size = 15, col.data = "#1f77b4", col.comp = NULL){ N = length(y) k = ncol(p.z) g = apply(p.z, 1, function(i) (1:length(i))[i == max(i)]) if(is.null(col.comp)){ col.comp <- hue_pal()(k) } if (length(col.comp) != k){ print(paste("Please specify" , k , "colors in 'col.comp'.")) } abline.fun <- function(x , intercept , slope){ y <- slope * x + intercept return(y) } min.int=min(sapply(1:N, function(i) min(p.beta[[i]][1,]))) max.int=max(sapply(1:N, function(i) max(p.beta[[i]][1,]))) min.slp=min(sapply(1:N, function(i) min(p.beta[[i]][2,]))) max.slp=max(sapply(1:N, function(i) max(p.beta[[i]][2,]))) # All posterior regression lines. fig1 <- plot_ly()%>% plotly::layout( xaxis = list(title = list(text = "x-values", font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = "y-values", font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) for (i in 1:length(x)){ fig1 <- add_trace(fig1, x=as.vector(x[[i]]) , y=as.vector(y[[i]]), type = 'scatter' , mode = 'markers', marker = list(size = cex , color = col.data), name = paste("Comp" , i) , showlegend = FALSE) } for (j in 1:k){ for (l in 1:length(p.beta)){ fig1 <- add_trace(fig1, x=c(min(unlist(x)) , max(unlist(x))) , y=c(abline.fun(x=min(unlist(x)) , intercept = p.beta[[l]][1,j] , slope = p.beta[[l]][2,j]), abline.fun(x=max(unlist(x)) , intercept = p.beta[[l]][1,j] , slope = p.beta[[l]][2,j])), type = 'scatter' , mode = 'lines', line = list(width = lwd , color = col.comp[j]), name = paste("Fit" , j) , showlegend = FALSE) } } #Posterior regression lines chosen according to the membership probabilities. fig2 <- plot_ly()%>% plotly::layout( xaxis = list(title = list(text = "x-values", font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = "y-values", font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) for (i in 1:length(x)){ fig2 <- add_trace(fig2, x=as.vector(x[[i]]) , y=as.vector(y[[i]]), type = 'scatter' , mode = 'markers', marker = list(size = cex , color = col.data), name = paste("Comp" , i) , showlegend = FALSE) } for (l in 1:length(p.beta)){ fig2 <- add_trace(fig2, x=c(min(unlist(x)) , max(unlist(x))) , y=c(abline.fun(x=min(unlist(x)) , intercept = p.beta[[l]][1,g[l]] , slope = p.beta[[l]][2,g[l]]), abline.fun(x=max(unlist(x)) , intercept = p.beta[[l]][1,g[l]] , slope = p.beta[[l]][2,g[l]])), type = 'scatter' , mode = 'lines', line = list(width = lwd , color = col.comp[g[l]]), name = paste("Fit" , j) , showlegend = FALSE) } #All posterior beta values. fig3 <- plot_ly()%>% plotly::layout( xaxis = list(title = list(text = "Posterior Intercepts", font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = "Posterior Slopes", font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) for (j in 1:k){ for (l in 1:length(p.beta)){ fig3 <- add_trace(fig3, x=p.beta[[l]][1,j], y=p.beta[[l]][2,j], type = 'scatter' , mode = 'markers', marker = list(size = cex , color = col.comp[j]), name = paste("Comp" , j) , showlegend = FALSE) } } #Posterior beta values chosen according to the membership probabilities. fig4 <- plot_ly()%>% plotly::layout( xaxis = list(title = list(text = "Posterior Intercepts", font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = "Posterior Slopes", font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) for (l in 1:length(p.beta)){ fig4 <- add_trace(fig4, x=p.beta[[l]][1,g[l]] , y=p.beta[[l]][2,g[l]], type = 'scatter' , mode = 'markers', marker = list(size = cex , color = col.comp[g[l]]), name = paste("Comp" , l) , showlegend = FALSE) } fig <- subplot(fig1, fig2, fig3 , fig4 , nrows = 2, titleX = TRUE , titleY = TRUE, margin = c(0.03,0.03,0.15,0.15)) %>% plotly::layout(annotations = list( list( x = 0.225, y = 1.0, font = list(size = title.size), text = "Data and Posterior Regression Lines", xref = "paper", yref = "paper", xanchor = "center", yanchor = "bottom", showarrow = FALSE ), list( x = 0.775, y = 1.0, font = list(size = title.size), text = "Data and Most Probable Posterior Regression Lines", xref = "paper", yref = "paper", xanchor = "center", yanchor = "bottom", showarrow = FALSE ), list( x = 0.225, y = 0.375, font = list(size = title.size), text = "All Posterior Regression Coefficients", xref = "paper", yref = "paper", xanchor = "center", yanchor = "bottom", showarrow = FALSE ), list( x = 0.775, y = 0.375, font = list(size = title.size), text = "Most Probable Posterior Regression Coefficients", xref = "paper", yref = "paper", xanchor = "center", yanchor = "bottom", showarrow = FALSE ) ) ) print(fig) }mixtools/R/plotly_compCDF.R0000644000175100001440000000603514343035706015361 0ustar hornikusersplotly_compCDF <- function(data, weights, x=seq(min(data, na.rm=TRUE), max(data, na.rm=TRUE), len=250), comp=1:NCOL(weights), makeplot=TRUE, cex = 3, width = 3, legend.text = "Composition", legend.text.size = 15, legend.size = 15, title = "Empirical CDF", title.x = 0.5, title.y = 0.95, title.size = 15, xlab = "Data", xlab.size = 15, xtick.size = 15, ylab = "Probability", ylab.size = 15, ytick.size = 15, col.comp = NULL){ if (NROW(weights) != NROW(data)) { stop("data and weights arguments must have same number of rows") } if (is.null(col.comp)){ col.comp <- hue_pal()(length(comp)) } if (length(col.comp) != length(comp)){ print(paste("Please specify",length(comp),"colors in 'col.comp'.")) } # First, normalize the weights so the sum of each column is 1/NCOL(data) weights <- t(t(weights) / (NCOL(data) * colSums(weights))) # Next, give a binomial count for each row of the data and for each x f <- function(row, cutpt) colSums(outer(row, cutpt, "<="), na.rm = TRUE) bc <- apply(data, 1, f, x) # bc is a length(x) by n matrix; each column should be multiplied by # the appropriate weight(s) and then the rows summed to give the # unnormalized cdf estimates. This is just a matrix product. cdfs <- bc %*% weights[,comp,drop=FALSE] if(makeplot) { plot <- plot_ly() for (i in 1:length(comp)) { plot <- add_trace(plot, plot, x=x , y=cdfs[,comp[i]] , type = 'scatter' , mode = 'lines+markers', marker = list(size = cex , color = col.comp[i]), line = list(width = width , color = col.comp[i]), name = comp[i] , showlegend = TRUE) %>% plotly::layout( legend = list(title=list(text=legend.text, font=list(size=legend.text.size)), font = list(size=legend.size)), title = list(text = title, x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = xlab, font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = ylab, font = list(size = ylab.size)), tickfont = list(size = ytick.size), range = c(0 , 1) ) ) } print(plot) } invisible(t(cdfs)) } mixtools/R/poisregmixEM.R0000755000175100001440000000641614342153463015121 0ustar hornikuserspoisregmixEM = function (y, x, lambda = NULL, beta = NULL, k = 2, addintercept = TRUE, epsilon = 1e-08, maxit = 10000, verb=FALSE) { if (addintercept) { x = cbind(1, x) } else x = as.matrix(x) n <- length(y) p <- ncol(x) tmp <- poisregmix.init(y=y, x=x, lambda=lambda, beta=beta, k=k) lambda <- tmp$lambda beta <- tmp$beta k <- tmp$k xbeta <- x %*% beta z <- matrix(0, n, k) diff <- 1 iter <- 0 comp <- t(t(dpois(y, exp(xbeta))) * lambda) compsum <- apply(comp, 1, sum) obsloglik <- sum(log(compsum)) ll <- obsloglik restarts <- 0 while (diff > epsilon && iter < maxit) { j.star = apply(xbeta, 1, which.max) for (i in 1:n) { for (j in 1:k) { z[i, j] = lambda[j]/lambda[j.star[i]] * exp(y[i] * (xbeta[i, j] - xbeta[i, j.star[i]]) + exp(xbeta[i, j.star[i]]) - exp(xbeta[i, j])) } } z = z/apply(z, 1, sum) z[,k]=1-apply(as.matrix(z[,(1:(k-1))]),1,sum) if(sum(is.na(z))>0){ cat("Need new starting values due to underflow...","\n") restarts <- restarts + 1 if(restarts>15) stop("Too many tries!") tmp <- poisregmix.init(y=y, x=x, k=k) lambda <- tmp$lambda beta <- tmp$beta k <- tmp$k diff <- 1 iter <- 0 xbeta <- x %*% beta comp <- t(t(dpois(y, exp(xbeta))) * lambda) compsum <- apply(comp, 1, sum) obsloglik <- sum(log(compsum)) ll <- obsloglik } else{ lambda <- apply(z, 2, mean) lm.out <- lapply(1:k, function(j) try(glm.fit(x, y, weights = z[, j], family = poisson()) ,silent=TRUE)) beta = sapply(lm.out,coef) xbeta <- x %*% beta comp <- t(t(dpois(y, exp(xbeta))) * lambda) compsum <- apply(comp, 1, sum) newobsloglik <- sum(log(compsum)) if(abs(newobsloglik)==Inf || is.na(newobsloglik) || newobsloglik < obsloglik){# || sum(z)!=n){ cat("Need new starting values due to singularity...","\n") restarts <- restarts + 1 if(restarts>15) stop("Too many tries!") tmp <- poisregmix.init(y=y, x=x, k=k) lambda <- tmp$lambda beta <- tmp$beta k <- tmp$k diff <- 1 iter <- 0 xbeta <- x %*% beta comp <- t(t(dpois(y, exp(xbeta))) * lambda) compsum <- apply(comp, 1, sum) obsloglik <- sum(log(compsum)) ll <- obsloglik } else{ diff <- newobsloglik - obsloglik obsloglik <- newobsloglik ll <- c(ll, obsloglik) iter <- iter + 1 if (verb) { cat("iteration=", iter, "diff=", diff, "log-likelihood", obsloglik, "\n") } } } } if (iter == maxit) { cat("WARNING! NOT CONVERGENT!", "\n") } cat("number of iterations=", iter, "\n") beta <- matrix(beta,ncol=k) rownames(beta) <- c(paste("beta", ".", 0:(p-1), sep = "")) colnames(beta) <- c(paste("comp", ".", 1:k, sep = "")) colnames(z) <- c(paste("comp", ".", 1:k, sep = "")) a=list(x=x, y=y, lambda = lambda, beta = beta, loglik = obsloglik, posterior = z, all.loglik=ll, restarts=restarts, ft="poisregmixEM") class(a) = "mixEM" a } mixtools/R/regmixMH.R0000755000175100001440000000675014342153463014232 0ustar hornikusersregmixMH=function (y, x, lambda = NULL, beta = NULL, s = NULL, k = 2, addintercept = TRUE, mu = NULL, sig = NULL, lam.hyp = NULL, sampsize = 1000, omega = 0.01, thin = 1) { if (addintercept) { x = cbind(1, x) } XTX <- solve(t(x)%*%x) n <- length(y) p <- ncol(x) if (is.null(s)) { s = sqrt(1/rexp(k)) } else k = length(s) if (is.null(beta)) { beta = matrix(rnorm(p * k), p, k) } else k = ncol(beta) if (is.null(lambda)) { lambda = runif(k) lambda = lambda/sum(lambda) } else k = length(lambda) if (is.null(mu)) { mu = 0 * beta } if (is.null(sig)) { sig = rep(5 * sqrt(var(y)),k) } sig.beta = t(matrix(rep(sig,p),ncol=p)) * sqrt(matrix(rep(diag(XTX),k),ncol=k)) if(is.null(lam.hyp)) lam.hyp = rep(1,k) L.theta <- matrix(nrow = n, ncol = k) pi.beta <- matrix(nrow = p, ncol = k) pi.sigma <- c() pi.lambda <- c() new.L.theta <- matrix(nrow = length(y), ncol = k) new.pi.beta <- matrix(nrow = p, ncol = k) new.pi.sigma <- c() new.pi.lambda <- c() accepts = 0 theta <- matrix(c(beta, s, lambda), nrow = 1) thetalist <- matrix(theta, sampsize, ncol(theta), byrow=TRUE) for (i in 2:sampsize) { log.pi.beta <- dnorm(beta, mu, sig.beta, log=TRUE) log.pi.sigma <- dexp(s, 1/sig, log=TRUE) log.pi.lambda <- sum((lam.hyp-1)*log(lambda)) - lgamma(lam.hyp) + lgamma(sum(lam.hyp)) # Dirichlet log-density # log.pi.lambda <- log(ddirichlet(lambda, lam.hyp)) L.theta <- dnorm(y - x %*% beta, 0, matrix(s, n, k, byrow = TRUE) ) %*% matrix(lambda, k, 1) log.Lik.theta <- sum(log(L.theta)) log.prior <- sum(log.pi.beta) + sum(log.pi.sigma) + sum(log.pi.lambda) log.f.theta <- log.Lik.theta + log.prior new.beta <- beta + omega * matrix(rcauchy(k * p), p, k) new.sigma <- log(s) + omega * rcauchy(k) new.sigma <- exp(new.sigma) new.lambda <- lambda.pert(lambda, omega*rcauchy(k)) log.new.pi.beta <- dnorm(new.beta, mu, sig.beta, log=TRUE) log.new.pi.sigma <- dexp(new.sigma, 1/sig, log=TRUE) log.new.pi.lambda <- sum((lam.hyp-1)*log(new.lambda)) - lgamma(lam.hyp) + lgamma(sum(lam.hyp)) # Dirichlet log-density # log.new.pi.lambda <- log(ddirichlet(new.lambda, lam.hyp)) new.L.theta <- dnorm(y - x %*% new.beta, 0, matrix(new.sigma, n, k, byrow = TRUE)) %*% matrix(new.lambda, k, 1) log.new.Lik.theta <- sum(log(new.L.theta)) log.new.prior <- sum(log.new.pi.beta) + sum(log.new.pi.sigma) + sum(log.new.pi.lambda) log.new.f.theta <- log.new.Lik.theta + log.new.prior new.theta <- c(new.beta, new.sigma, new.lambda) a <- log.new.f.theta - log.f.theta r <- log(runif(1)) if (a > r & !is.na(a)) { theta <- new.theta beta <- new.beta s <- new.sigma lambda <- new.lambda accepts = accepts + 1 } if (i%%thin == 0) thetalist[i,] = theta } cat(paste("Acceptance rate: ", 100 * accepts/sampsize, "%\n", sep = "")) colnames(thetalist) <- c(paste("beta", rep(0:(p - 1), k), ".", rep(1:k, rep(p, k)), sep = ""), paste("s.", 1:k, sep = ""), paste("lambda.", 1:k, sep = "")) invisible(thetalist) a=list(x=x, y=y, theta=thetalist, components=k) class(a)="mixMCMC" a } mixtools/R/regmixEMlambda.R0000755000175100001440000001032614342153463015362 0ustar hornikusersregmixEM.lambda = function (y, x, lambda = NULL, beta = NULL, sigma = NULL, k = 2, addintercept = TRUE, arbmean = TRUE, arbvar = TRUE, epsilon = 1e-08, maxit = 10000, verb = FALSE) { if (arbmean == FALSE && arbvar == FALSE) { stop(paste("Must change constraints on beta and/or sigma!", "\n")) } s = sigma if (addintercept) { x = cbind(1, x) } n <- length(y) p <- ncol(x) tmp <- regmix.lambda.init(y = y, x = x, lambda = lambda, beta = beta, s = s, k = k, addintercept = addintercept, arbmean = arbmean, arbvar = arbvar) lambda <- tmp$lambda beta <- tmp$beta s <- tmp$s k <- tmp$k diff <- 1 iter <- 0 xbeta <- x %*% beta res2 <- (y - xbeta)^2 if (arbmean == FALSE) { res2 <- sapply(1:k, function(i) res2) } comp <- t(t(lambda)/sqrt(2 * pi * s^2)) * exp(-t(t(res2)/(2 * s^2))) obsloglik <- sum(log(apply(comp, 1, sum))) ll <- obsloglik while (diff > epsilon && iter < 1) { V=as.double(sweep(lambda, 2, s+rep(0,k), "/")) W=as.double(sweep(res2, 2, 2*(s+rep(0,k))^2, "/")) z <- matrix(.C(C_newz, as.integer(n), as.integer(k), V=V, W=W, newz=double(n*k), PACKAGE = "mixtools")$newz, ncol=k) z = z/apply(z,1,sum) if (addintercept) { lm.out <- lapply(1:k, function(i) lm(y ~ x[,-1], weights = z[, i])) } else lm.out <- lapply(1:k, function(i) lm(y ~ x - 1, weights = z[, i])) beta.new <- sapply(lm.out, coef) if (arbmean == FALSE) { beta.new <- apply(t(apply(z, 2, sum) * t(beta.new)), 1, sum)/n } xbeta.new <- x %*% beta.new res2 <- (y - xbeta.new)^2 if (arbmean == FALSE) { res2 <- sapply(1:k, function(i) res2) } if (arbvar) { s.new <- sqrt(sapply(1:k, function(i) sum(z[,i] * (res2[, i]))/sum(z[, i]))) } else s.new <- sqrt(sum(z * res2)/n) beta <- beta.new xbeta <- x %*% beta s <- s.new sing <- sum(s < 1e-08) comp <- lapply(1:k, function(i) lambda[,i] * dnorm(y, xbeta[, i * arbmean + (1 - arbmean)], s[i * arbvar + (1 - arbvar)])) comp <- sapply(comp, cbind) compsum <- apply(comp, 1, sum) newobsloglik <- sum(log(compsum)) if (newobsloglik < obsloglik || sing > 0 || abs(newobsloglik) == Inf || is.nan(newobsloglik)){# || sum(z) != n) { cat("Need new starting values due to singularity...", "\n") tmp <- regmix.lambda.init(y = y, x = x, k = k, addintercept = addintercept, arbmean = arbmean, arbvar = arbvar) lambda <- tmp$lambda beta <- tmp$beta s <- tmp$s k <- tmp$k diff <- 1 iter <- 0 xbeta <- x %*% beta res2 <- (y - xbeta)^2 if (arbmean == FALSE) { res2 <- sapply(1:k, function(i) res2) } comp <- t(t(lambda)/sqrt(2 * pi * s^2)) * exp(-t(t(res2)/(2 * s^2))) obsloglik <- sum(log(apply(comp, 1, sum))) ll <- obsloglik } else { diff <- newobsloglik - obsloglik obsloglik <- newobsloglik ll <- c(ll, obsloglik) iter <- iter + 1 } } scale.order = order(s) sigma.min = min(s) if (arbmean == FALSE) { z = z[, scale.order] names(beta) <- c(paste("beta", ".", 0:(p - 1), sep = "")) colnames(z) <- c(paste("comp", ".", 1:k, sep = "")) a = list(x = x, y = y, lambda = lambda[,scale.order], beta = beta, sigma = sigma.min, scale = s[scale.order]/sigma.min, loglik = obsloglik, posterior = z[, scale.order], all.loglik = ll, ft="regmixEM.lambda") class(a) = "mixEM" a } else { rownames(beta) <- c(paste("beta", ".", 0:(p - 1), sep = "")) colnames(beta) <- c(paste("comp", ".", 1:k, sep = "")) colnames(z) <- c(paste("comp", ".", 1:k, sep = "")) a = list(x = x, y = y, lambda = lambda, beta = beta, sigma = s, loglik = obsloglik, posterior = z, all.loglik = ll, ft="regmixEM.lambda") class(a) = "mixEM" a } } mixtools/R/rnormmix.R0000755000175100001440000000050614342153463014356 0ustar hornikusers# Simulate from a normal mixture. New version simply calls rmvnormmix. # normmix.sim is here for backwards compatibility rnormmix <- normmix.sim <- function(n,lambda=1,mu=0,sigma=1) { if (NCOL(mu)>1 || NCOL(sigma)>1) stop ("Use the rmvnormmix function instead.") as.vector(rmvnormmix(n,lambda,mu,sigma)) } mixtools/R/WeibullRMMSEM.R0000644000175100001440000002035014342153463015023 0ustar hornikusers# code for Reliability Mixture Models (RMM) with Censored data # D. Chauveau # ref: Bordes L. and Chauveau D. Computational Statistics (2016) # Simulate from a Weibull mixture # lambda = vector of component probabilities # shape, scale = vector of component rates rweibullmix <- function(n,lambda=1, shape=1, scale=1) { m <- length(lambda) # nb of components z <- sample(m, n, replace=TRUE, prob=lambda) # component indicator rweibull(n, shape = shape[z], scale=scale[z]) } ######################################################################## ## Stochastic EM algorithm for Reliability Mixture Models (RMM) ## with Censoring; Parametric model, for ## univariate finite mixture of Weibull with right censoring # x = lifetime data, censored by random c if d is not NULL, in which case # x= min(x,c) and d = I(x <= c) # uses parametric MLE for censored weibull data from the survival package # caution: when fitted by a survreg object, the weibull parametrization is # shape=1/fit$scale and scale=exp(fit$coeff) # averaged = TRUE if averaging of the parameters is computed at each iteration # (cf Nielsen 2000) # NB: averaging can be done in several ways; # DEPRECATED: the current theta for E & M steps is the average over the sequence, # but the theta^next not averaged is stored on the sequence # CURRENT VERSION: the average is stored and used for next step # # About calls of survreg() from the survival package: # maxit.survreg is # passed to survreg.control() for weibull MLE using survreg() weibullRMM_SEM <- function (x, d=NULL, lambda = NULL, shape = NULL, scale = NULL, # dweibull() parameters k = 2, # default nb of components maxit = 200, # maxrestarts = 20, maxit.survreg = 200, epsilon = 1e-03, averaged = TRUE, verb = FALSE) { # warn <- options(warn=-1) # Turn off warnings # x <- as.vector(x) # require(survival) n <- length(x) if (!is.null(lambda)) k=length(lambda) if (!is.null(scale)) k=length(scale) # at least one if (!is.null(shape)) k=length(shape) # should be define !!! if (is.null(d)) d <- rep(1,n) # noncensored case forced xx <- matrix(x, nrow=n, ncol=k) # x repeated k times, used in E-steps dd <- matrix(d, nrow=n, ncol=k) # idem for d # # note: d can be used instead of dd since automatic recycling gives # dd*xx = d*xx, but we keep dd to avoid eventual futur change # init function call to do later, in case lambda = rate = NULL if (is.null(lambda)) lambda <- rep(1/k,k) if (is.null(scale)) scale <- rep(1,k) # to do : init.functions(k) if (is.null(shape)) shape <- rep(1,k) # # sequences for storing along iterations lambda_seq <- scale_seq <- shape_seq <- matrix(0, nrow = maxit, ncol = k) lambda_seq[1,] <- lambda scale_seq[1,] <- scale; shape_seq[1,] <- shape loglik_seq <- NULL oldloglik <- -Inf # notdone <- TRUE # for handling restarts etc, ToDo later! # while(notdone) { # Initialize everything notdone <- FALSE # dll <- epsilon+1 iter <- 1 post <- z <- sumpost <- matrix(0, nrow = n, ncol = k) new_scale <- new_shape <- rep(0,k) ##### SEM iterations ##### while (iter < maxit) { # SEM version ### E-step ### scn <- matrix(scale, n, k, byrow=T) # for vectorized post comput. shn <- matrix(shape, n, k, byrow=T) ll <- matrix(lambda, n, k, byrow=T) # handling censored & non-censored cases post <- ((ll*dweibull(xx,shn,scn))^dd)*((ll*(1-pweibull(xx,shn,scn)))^(1-dd)) rs <- rowSums(post) loglik <- sum(log(rs)) # loglik without the constant term related to h pdf # post normalized per row post <- sweep(post, 1, rs, "/") # posteriors p_{ij}^t 's # check and solve NaN's: may cause theoretical pbs!? snans <- sum(is.na(post)) if (snans > 0) { post[is.na(post[,1]),] <- 1/k cat("warning:",snans, "NaN's in post\n") } ### S-step ### # ~ matrix of component indicators simu checked ? z <- t(apply(post, 1, function(prob) rmultinom(1, 1, prob))) nsets <- colSums(z) # subsets per component sizes # cat("it",iter,": sets=",nsets,"\n") ### M-step ### # new_parameter = SEM(lambda,shape,scale) new_lambda <- nsets/n # or colMeans(post) if EM version preferred for (j in 1:k) { # for each component; vectorize later? tj <- x[z[,j]==1] # subsample from component j dj <- d[z[,j]==1] # associated event indicator # passing maxit and epsilon parameters to survreg # and current shape & scale as init parameters fit=survreg(Surv(tj,dj)~1, dist = 'weibull', control = survreg.control(maxiter = maxit.survreg, rel.tolerance=epsilon), init.beta=log(scale), init.scale=1/shape) new_scale[j] <- exp(fit$coeff) new_shape[j] <- 1/fit$scale } # Next parameter value, depending on average strategy if (averaged) { scale <- (new_scale + iter*scale_seq[iter,])/(iter+1) shape <- (new_shape + iter*shape_seq[iter,])/(iter+1) lambda <- (new_lambda + iter*lambda_seq[iter,])/(iter+1) } else { # averaged=FALSE case, just use last update scale <- new_scale shape <- new_shape lambda <- new_lambda } # new strategy = storing sequence of averages lambda_seq[iter+1, ] <- lambda scale_seq[iter+1, ] <- scale shape_seq[iter+1, ] <- shape dll <- loglik - oldloglik # = Inf for iter=0 1st time oldloglik <- loglik loglik_seq <- c(loglik_seq, loglik) if (verb) { cat("iteration", iter, " log-lik diff =", dll, " log-lik =", loglik, "\n") # print(rbind(lambda, rate)) } iter <- iter + 1 } # end of SEM loops over iterations # } # while notdone, if restarts control implemented # final estimates depending on average strategy if (averaged) { final.lambda <- lambda final.scale <- scale final.shape <- shape } else { final.scale <- colMeans(scale_seq[1:iter,]) final.shape <- colMeans(shape_seq[1:iter,]) final.lambda <- colMeans(lambda_seq[1:iter,]) } cat("number of iterations =", iter, "\n") colnames(post) <- c(paste("comp", ".", 1:k, sep = "")) a=list(x=x, d=d, lambda = final.lambda, scale = final.scale, shape = final.shape, loglik = loglik, posterior = post, all.loglik=loglik_seq, all.lambda = lambda_seq[1:iter,], all.scale = scale_seq[1:iter,], all.shape = shape_seq[1:iter,], ft="weibullRMM_SEM") class(a) = "mixEM" a } ################################################## # plot SEM sequences from weibullRMM_SEM: # color by components, one plot per parameter type plotweibullRMM <- function(a, title=NULL, rowstyle=TRUE, subtitle=NULL,...) { n <- length(a$x); m <- dim(a$all.lambda)[2] pcc <- round(100*(1-mean(a$d)),2) if (is.null(subtitle)) { subtitle <- paste("n=",n,", ", pcc, "% censored", sep="")} if (is.null(title)) { tt1 <- "Shape parameters"; tt2 <- "Scale parameters" tt3 <- "Weight parameters" } else tt1 <- tt2 <- tt3 <- title lwdset <- 2 if (rowstyle) par(mfrow=c(3,1)) else par(mfrow=c(1,3)) plot(a$all.shape[,1], type="l", ylim=c(0,max(a$all.shape)), xlab="iterations", ylab="estimates", main=tt1, ...) # if (truevalues) abline(shape[1],0,lty=3) title(sub=subtitle, cex.sub = 0.75) lgd <- expression(sh[1]); lcol <- 1 for (j in 2:m) { lines(a$all.shape[,j], col=j, ...) # if (truevalues) abline(shape[j],0,col=j,lty=3) lgd <- c(lgd,substitute(sh[j])); lcol <- c(lcol,j) } legend("topright", lgd, col=lcol, lty=1,...) plot(a$all.scale[,1], type="l", ylim=c(0,max(a$all.scale)), xlab="iterations", ylab="estimates", main=tt2, ...) # if (truevalues) abline(scale[1],0,lty=3) title(sub=subtitle, cex.sub = 0.75) lgd <- expression(sc[1]); lcol <- 1 for (j in 2:m) { lines(a$all.scale[,j], col=j, ...) # if (truevalues) abline(scale[j],0,col=j,lty=3) lgd <- c(lgd,substitute(sc[j])); lcol <- c(lcol,j) } legend("topright", lgd, col=lcol, lty=1, ...) plot(a$all.lambda[,1], type="l", ylim=c(0,1), xlab="iterations", ylab="estimates", main=tt3, ...) # if (truevalues) abline(lambda[1],0,lty=3) title(sub=subtitle,cex.sub = 0.75) lgd <- expression(lambda[1]); lcol <- 1 for (j in 2:m) { lines(a$all.lambda[,j], col=j, ...) # if (truevalues) abline(lambda[j],0,col=j,lty=3) lgd <- c(lgd,substitute(lambda[j])) lcol <- c(lcol,j) } legend("topright", lgd, col=lcol, lty=1, ...) } mixtools/R/density.npEM.R0000755000175100001440000000266214342153463015025 0ustar hornikusers# Method for "density" generic: Takes an npEM object and returns # a corresponding KDE for the appropriate component and block, evaluated # at the given set of points. # Does not use the FFT like the density.default function does; still # quite fast, but not optimized for speed density.npEM <- function (x, u = NULL, component = 1, block = 1, scale = FALSE, ...) { if (is.null(blockid <- x$blockid)) { coords <- 1 } else { coords <- blockid == block if (!any(coords)) stop("Illegal value of block argument") } m <- NCOL(x$post) xx <- as.vector(as.matrix(x$data)[, coords]) if(is.matrix(x$bandwidth)) bw <- x$bandwidth[block, component] else bw <- x$bandwidth if (is.null(u)) { u = seq(min(xx) - 4 * bw, max(xx) + 4 * bw, len = 250) } if (component > m || component < 1) stop("Illegal value of component argument") if (!is.null(x$symmetric) && x$symmetric) { n <- length(xx) d <- wkde(x = rep(xx, m) - rep(x$muhat, each = n), u = u - x$muhat[component], w = as.vector(x$post), bw = bw, sym = TRUE) } else { n <- NROW(x$data) wts <- rep(x$post[, component], sum(coords)) d <- wkde(xx, u = u, w = wts, bw = bw) } if (scale) d <- d * x$lambdahat[component] structure(list(x = u, y = d, bw = bw, n = n, call = match.call(), data.name = deparse(substitute(x)), has.na = FALSE), class = "density") } mixtools/R/mvnormalmixinit.R0000755000175100001440000000322014342153463015734 0ustar hornikusersmvnormalmix.init = function (x, lambda = NULL, mu = NULL, sigma = NULL, k = 2, arbmean = TRUE, arbvar = TRUE) { n <- nrow(x) p <- ncol(x) y <- apply(x, 1, mean) x <- x[order(y), ] x.bin <- list() for (j in 1:k) { x.bin[[j]] <- x[max(1, floor((j - 1) * n/k)):ceiling(j * n/k), ] } if (is.null(sigma)) { if (arbvar) { sigma.hyp = lapply(1:k, function(i) (apply(x.bin[[i]], 2, var))^-1) sigma = lapply(1:k, function(i) diag(1/rexp(p, rate = sigma.hyp[[i]]))) } else { sigma.hyp = apply(sapply(1:k, function(i) (apply(x.bin[[i]], 2, var))^-1), 2, mean) sigma = diag(1/rexp(p, rate = sigma.hyp)) } } if (is.null(sigma) == FALSE && arbvar == TRUE) { k = length(sigma) } if (is.null(mu)) { mu.hyp <- lapply(1:k, function(i) apply(x.bin[[i]], 2, mean)) if (arbvar) { mu <- lapply(1:k, function(i) as.vector(rmvnorm(1, mu = as.vector(mu.hyp[[i]]), sigma = as.matrix(sigma[[i]])))) } else mu <- lapply(1:k, function(i) as.vector(rmvnorm(1, mu = as.vector(mu.hyp[[i]]), sigma = as.matrix(sigma)))) if (arbmean==FALSE) { mu <- apply(sapply(mu,as.vector),1,mean) # mu <- lapply(1:k, function(i) mu) } } if (is.null(mu) == FALSE && arbmean == TRUE){ k=length(mu) } if (is.null(lambda)) { lambda <- runif(k) lambda <- lambda/sum(lambda) } else k <- length(lambda) list(lambda = lambda, mu = mu, sigma = sigma, k = k) }mixtools/R/spEM.R0000644000175100001440000001151514342153463013346 0ustar hornikusers## EM-like algorithm for a location-scale mixture model with ## independent repeated measures -- some ID, some not -- ## where each block has its own location and scale but otherwise ## all blocks (within a component or globally, depending) have the same ## shape. ## Correction: For now, this algorithm only implements model (17) in ## Benaglia et al -- in other words, each component and block has exactly ## the same shape and they differ only by location and scale. spEM <- function(x, mu0, blockid = 1:ncol(x), bw=bw.nrd0(as.vector(as.matrix(x))), constbw = TRUE, h=bw, eps=1e-8, maxiter=500, stochastic = FALSE, verb = TRUE){ bw <- h # h is alternative bandwidth argument, for backward compatibility x <- as.matrix(x) n <- nrow(x) # number of subjects r <- ncol(x) # number of measurements in each subject u <- match(blockid, unique(blockid)) # convert blockid to integers 1, 2, ... if (is.matrix(mu0)) m <- dim(mu0)[1] # mu0=centers else m <- mu0 # mu0=number of clusters z.hat <- matrix(0, nrow = n, ncol = m) tt0 <- proc.time() # for total time ## Initial Values if(m == 1) z.hat <- matrix(1, nrow = n, ncol = m) else{ kmeans <- kmeans(x, mu0) for(j in 1:m) z.hat[kmeans$cluster==j, j] <- 1 } iter <- 0 if (stochastic) { sumpost <- matrix(0, n, m) } finished <- FALSE lambda <- matrix(0, nrow = maxiter, ncol = m) mu <- sigma <- array(0, dim=c(maxiter, m, max(u))) stackedx <- x[rep(1:n,m),] loglik <- NULL while (!finished) { iter <- iter + 1 bw.old <- bw t0 <- proc.time() ## Note: Enter loop assuming E-step is done -- i.e., z.hat is in place ## M-Step lambda[iter, ] <- colMeans(z.hat) if (stochastic) { z <- t(apply(z.hat, 1, function(prob) rmultinom(1, 1, prob))) cs <- colSums(z) z.tmp <- sweep(z, 2, cs, "/") z.tmp[, cs==0] <- 1/NROW(z.tmp) # Just in case } else { cs <- colSums(z.hat) z.tmp <- sweep(z.hat, 2, cs, "/") z.tmp[, cs==0] <- 1/NROW(z.tmp) # Just in case } h <- bw ## More M-step (means and std devs are location / scale params) for (k in 1:max(u)) { # k is the block number r2 <- sum(u == k) x2 <- x[, u==k] # Subset of data belonging to kth block (n x r2 matrix) mu[iter, , k] <- as.vector(rowMeans(t(z.tmp) %*% x2)) for (j in 1:m) sigma[iter, j, k] <- sqrt(sum(z.tmp[,j] * (x2-mu[iter, j, k])^2)/r2) } ## density estimation step if (!constbw) { wts <- rep(as.vector(z.tmp),r) scaledx <- as.vector((stackedx - mu[iter, rep(1:m, each=n), u])/ sigma[iter, rep(1:m, each=n), u]) h <- bw <- 0.9 / (n*r)^(1/5) * min(1, wiqr<-wIQR(wt=wts, x=scaledx)/1.34) } ans <- .C(C_KDElocscale, n = as.integer(n), m = as.integer(m), r = as.integer(r), blockid=as.integer(u), mu = as.double(mu[iter, , ]), sigma = as.double(sigma[iter, , ]), x = as.double(x), bw = as.double(h), z = as.double(z.tmp), f = double(n*m), PACKAGE="mixtools") lambda.f <- sweep(matrix(ans$f, ncol=m), 2, lambda[iter, ], "*") ## E-step (for next iteration) z.hat <- lambda.f/rowSums(lambda.f) loglik <- c(loglik,sum(log(rowSums(lambda.f)))) # log-likelihood finished <- iter >= maxiter if (stochastic) { sumpost <- sumpost + z.hat } else if (iter > 1) { # This convergence criterion may be too simplistic: maxchange <- max(abs(lambda[iter,] - lambda[iter-1,])) if (!constbw) maxchange <- max(maxchange, max(abs(bw.old - bw))) finished <- finished | (maxchange < eps) } if (verb) { t1 <- proc.time() cat("iteration", iter, " lambda ", round(lambda[iter, ], 4)) cat(" time", (t1 - t0)[3], "\n") } } if (verb) { tt1 <- proc.time() cat("lambda ", round(lambda[iter, ], 4)) cat(", total time", (tt1 - tt0)[3], "s\n") } if (stochastic) { return(structure(list(data = x, posteriors = sumpost/iter, lambda = lambda, bandwidth = bw, blockid = u, lambdahat = colMeans(lambda), mu = mu, muhat = colMeans(mu), sigma = sigma, sigmahat = colMeans(sigma), loglik = loglik), class="spEM")) } else { return(structure(list(data = x, posteriors = z.hat, lambda = lambda[1:iter,], bandwidth = bw, blockid = u, lambdahat = lambda[iter,], mu = mu[1:iter, , ], muhat = mu[iter, , ], sigma = sigma[1:iter, , ], sigmahat = sigma[iter, , ], loglik = loglik), class="spEM")) } } mixtools/R/ellipse.R0000755000175100001440000000067114342153463014143 0ustar hornikusersellipse <- function(mu, sigma, alpha=.05, npoints=250, newplot=FALSE, draw=TRUE, ...) { es <- eigen(sigma) e1 <- es$vec%*%diag(sqrt(es$val)) r1 <- sqrt(qchisq(1-alpha,2)) theta <- seq(0,2*pi,len=npoints) v1 <- cbind(r1*cos(theta),r1*sin(theta)) pts=t(mu-(e1%*%t(v1))) if (newplot && draw) { plot(pts, ...) } else if (!newplot && draw) { lines(pts, ...) } invisible(pts) } mixtools/R/kernO.R0000755000175100001440000000010714342153463013556 0ustar hornikuserskern.O <- function (x, xi, h) { (pi/4)*cos(.5*pi*(xi-x)/h)/h } mixtools/R/ise.npEM.R0000755000175100001440000000260014342153463014116 0ustar hornikusersise.npEM <- function(npEMout, component=1, block=1, truepdf, lower=-Inf, upper=Inf, plots = TRUE, ...){ # returns the Integrated Squared Error # between f_{comp,block} as estimated by npEM, # and truepdf #true2 <- function(u) truepdf(u, ...) coords <- npEMout$blockid == block bs <- sum(coords) # block size xx <- as.vector(npEMout$data[,coords]) # flatten data wts <- rep(npEMout$post[,component],bs) # duplicate weights if (is.matrix(npEMout$bandwidth)){ bw <- npEMout$bandwidth[block,component] } else bw <- npEMout$bandwidth integrand = function(u,...) { (wkde(xx,u,wts,bw) - truepdf(u,...))^2 } numint <- integrate(integrand,lower,upper, ...) if (plots) { # plot of estimated and truepdf ise <- paste(round(numint$value,4)) temp=paste(component, block, sep="") title = substitute(expression(paste("Integrated Squared Error for ", f[temp]," = ",ise,sep=""))) if (!is.finite(lower)) { lower <- min(xx) } if (!is.finite(upper)) { upper <- max(xx) } u <- seq(lower,upper, 0.01) fhat <- wkde(xx,u,wts,bw) ymax <- max(max(truepdf(u, ...)),max(fhat)) plot(u,fhat,type="l",ylim=c(0,ymax), main=eval(title),ylab="") legend("topleft",legend=c("true","fitted"),col=c(2,1),lty=c(1,1),lwd=c(2,1)) lines(u,truepdf(u, ...),lwd=2,col=2) } numint } mixtools/R/summary.npEM.R0000755000175100001440000000325414342153463015041 0ustar hornikuserssummary.npEM <- function(object, ...) { normpost <- sweep(object$post, 2, sums <- colSums(object$post), "/") n <- NROW(object$data) r <- NCOL(object$data) m <- length(object$lambdahat) B <- 1 if (r>1) B <- max(object$blockid) lambda <- sums/n means <- variances <- NULL for(i in 1:B) { if (r>1) { coords <- object$blockid == i xx <- as.vector(object$data[,coords]) } else { coords <- 1 xx <- as.vector(object$data) } sc <- sum(coords) M <- V <- NULL for (j in 1:m) { wts <- rep(normpost[,j]/sc, sc) M <- c(M, tmp <- sum(xx*wts)) V <- c(V, sum((xx-tmp)^2 *wts)) # cat(M," ") } means <- rbind(means, M) variances <- rbind(variances, V) } rownames(means) <- rownames(variances) <- paste("block", 1:B) colnames(means) <- colnames(variances) <- paste("component", 1:m) ans <- list(n=n, m=m, r=r, B=B, blockid=object$blockid, means = means, variances=variances) class(ans) <- "summary.npEM" ans } print.summary.npEM <- function(x, digits=3, ...) { if (x$r>1) cat (paste(x$n,"observations,",x$r,"coordinates,", x$m,"components, and",x$B,"blocks.\n\n")) else cat(paste(x$n,"univariate observations, and", x$m,"components.\n\n")) cat ("Means (and std. deviations) for each component:\n") for(i in 1:x$B) { coords <- 1 if (x$r>1) { coords <- x$blockid == i cat(paste(" Block #",i,": Coordinate", sep="")) cat(ifelse(sum(coords)>1, "s ", " ")) cat(which(coords)) cat("\n ") } cat(paste(signif(x$means[i,],digits), " (", signif(sqrt(x$variances[i,]),digits), ") ", sep="")) cat("\n") } } mixtools/R/perm.R0000755000175100001440000000034314342153463013445 0ustar hornikusersperm <- function (n, r, v = 1:n) { if (r == 1) matrix(v, n, 1) else if (n == 1) matrix(v, 1, r) else { X <- NULL for (i in 1:n) X <- rbind(X, cbind(v[i], perm(n - 1, r - 1, v[-i]))) X } } mixtools/R/tryflare.R0000755000175100001440000000646714342153463014347 0ustar hornikuserstry.flare <- function (y, x, lambda = NULL, beta = NULL, sigma = NULL, alpha = NULL, nu=1, epsilon = 1e-04, maxit = 10000, verb = FALSE, restart=50) { loglik <- function(res, sigma, lambda, alpha) { tmp <- lambda*dnorm(res,sd=sqrt(sigma)) + (1-lambda)*dexp(res,rate=alpha) sum(log(tmp)) } Q=function(res, sigma, lambda, alpha, z) { Q <- sum(z*log(lambda)) + sum((1-z)*log(1-lambda)) - log(2*pi*sigma)*sum(z)/2 - sum(z*res^2)/2/sigma + log(alpha)*sum(1-z) - alpha*sum((1-z)*res) Q } Z <- function(res, sigma, lambda, alpha) { z=rep(1, length(res)) z[res>0] = lambda / (lambda+(1-lambda)* sqrt(2*pi*sigma) * alpha * as.vector(exp(res[res>0]^2/2/sigma - alpha*res[res>0]))) z } x <- cbind(1, x) n <- length(y) p <- ncol(x) est <- flaremix.init(y=y, x=x, lambda=lambda, beta=beta, sigma=sigma, alpha=alpha) lambda <- est$lambda beta <- est$beta sigma <- est$sigma alpha <- est$alpha diff <- 1 iter <- 0 counts <- 0 ll.counts<-0 xbeta <- x %*% beta res <- y - xbeta dn <- dnorm(res,sd=sqrt(sigma)) de <- dexp(res,rate=alpha) obsloglik <- loglik(res, sigma, lambda, alpha) ll<-obsloglik Q1 <- -Inf all.Q <- NULL z=Z(res,sigma,lambda,alpha) while (sum(abs(diff) > epsilon)>0 && iter < maxit) { iter=iter+1 temp=(solve(-1/sigma*t(x) %*% sweep(x, 1, z, "*") + nu*t(x) %*% sweep(x, 1, (1-z)/(y-x%*%beta), "*"))%*%(1/sigma*(apply(sweep(x,1,z*(y-x%*%beta),"*"),2,sum)) +alpha*apply(sweep(x,1,1-z,"*"),2,sum))) m=1 while(m0) beta.new=beta else beta.new=beta.new xbeta.new <- x %*% beta.new res.new <- y-xbeta.new Q.beta <- Q(res.new,sigma,lambda,alpha,z) if(Q.beta < Q1) j=j+1 else j=101 } if(j==restart) stop(paste("Too many attempts at step-halving!","\n")) z.new=Z(res.new,sigma,lambda,alpha) lambda.new <- mean(z.new) sigma.new <- sum(z.new*(res.new^2))/sum(z.new) alpha.new <- sum(1-z.new[res.new>0])/sum((1-z.new[res.new>0])*res.new[res.new>0]) diff <- c(lambda.new,beta.new,sigma.new,alpha.new)-c(lambda,beta,sigma,alpha) z.new2=Z(res,sigma,lambda,alpha) # z.new2=z.new2/apply(z.new2,1,sum) Q.new <- Q(res.new,sigma.new,lambda.new,alpha.new,z.new2) q.diff=Q.new-Q1 if(q.diff<0) m=m+1 else m=101 } if(m==restart) stop(paste("Too many attempts at step-halving!","\n")) lambda <- lambda.new beta <- beta.new xbeta <- xbeta.new res <- res.new sigma <- sigma.new alpha <- alpha.new z<-z.new2 newobsloglik <- loglik(res.new, sigma.new, lambda.new, alpha.new) ll<-c(ll, newobsloglik) counts <- counts + (Q.newnewobsloglik) Q1 <- Q.new obsloglik <- newobsloglik if(verb==TRUE) cat("iteration=", iter, "diff=", diff, "log-likelihood", obsloglik, "\n") } if (iter == maxit) { cat("WARNING! NOT CONVERGENT!", "\n") } # par(mfrow=c(2,1)) # plot(all.Q,type="l") # plot(ll,type="l") cat("number of iterations=", iter, "\n") a=list(x=x,y=y,posterior=cbind(z,1-z),lambda=c(lambda,1-lambda),beta=beta,sigma=sigma,alpha=alpha,loglik=obsloglik,all.loglik=ll,ft="flaremixEM") class(a)="mixEM" a } mixtools/R/npEM.R0000644000175100001440000001265514342153463013347 0ustar hornikusers## EM-like algorithm for a nonparametric mixture model with ## independent repeated measures - some ID, some not npEMindrep <- # npEMindrep is an alias (only for backward compatibility) npEM <- function(x, mu0, blockid = 1:ncol(x), bw=bw.nrd0(as.vector(as.matrix(x))), samebw = TRUE, h=bw, eps=1e-8, maxiter=500, stochastic = FALSE, verb = TRUE){ bw <- h # h is alternative bandwidth argument, for backward compatibility x <- as.matrix(x) n <- nrow(x) # number of subjects r <- ncol(x) # number of measurements in each subject u <- match(blockid, unique(blockid)) if (is.matrix(mu0)) m <- dim(mu0)[1] # mu0=centers else m <- mu0 # mu0=number of clusters if(!samebw && !is.matrix(bw)) { bw <- matrix(bw, nrow=max(u), ncol=m) } z.hat <- matrix(0, nrow = n, ncol = m) tt0 <- proc.time() # for total time ## Initial Values if(m == 1) z.hat <- matrix(1, nrow = n, ncol = m) else{ kmeans <- kmeans(x, mu0) for(j in 1:m) z.hat[kmeans$cluster==j, j] <- 1 } iter <- 0 if (stochastic) { sumpost <- matrix(0, n, m) } finished <- FALSE lambda <- matrix(0, nrow = maxiter, ncol = m) loglik <- NULL orderx <- xx <- list() for(k in 1:max(u)) { xx[[k]] <- as.vector(x[, u==k]) if (!samebw) { orderx[[k]] = order(xx[[k]]) # only needed for IQR calculation for bw } } ### Cfunction <- ifelse(samebw, "KDErepeated", "KDErepeatedbw") while (!finished) { iter <- iter + 1 bw.old <- bw t0 <- proc.time() ## Note: Enter loop assuming E-step is done -- i.e., z.hat in place ## M-Step lambda[iter, ] <- colMeans(z.hat) ## density estimation step if (stochastic) { z <- t(apply(z.hat, 1, function(prob) rmultinom(1, 1, prob))) cs <- colSums(z) z.tmp <- sweep(z, 2, cs, "/") z.tmp[, cs==0] <- 1/NROW(z.tmp) # Just in case } else { cs <- colSums(z.hat) z.tmp <- sweep(z.hat, 2, cs, "/") z.tmp[, cs==0] <- 1/NROW(z.tmp) # Just in case } fkernel <- matrix(1, n, m) h <- bw # This is for samebw == TRUE for (k in 1:max(u)) { r2 <- sum(u == k) # block size if (!samebw) { wts <- apply(z.tmp, 2, function(z) rep(z/r2, r2)) variances <- colSums(wts * outer(xx[[k]], colSums(wts * xx[[k]]), '-')^2) iqr <- apply(as.matrix(wts[orderx[[k]],]), 2, wIQR, xx[[k]][orderx[[k]]], already.sorted=TRUE, already.normalized=TRUE) h <- bw[k, ] <- 0.9 * pmin(sqrt(variances), iqr/1.34) * pmax(1,r2*n*lambda[iter, ])^(-1/5) # Note: Doesn't allow "sample size" < 1. # browser() } if(samebw){ ans <- .C(C_KDErepeated, n = as.integer(n), m = as.integer(m), r = as.integer(r2), x = as.double(x[,u==k]), h = as.double(h), z = as.double(z.tmp), f = double(n*m), PACKAGE="mixtools") } else{ ans <- .C(C_KDErepeatedbw, n = as.integer(n), m = as.integer(m), r = as.integer(r2), x = as.double(x[,u==k]), h = as.double(h), z = as.double(z.tmp), f = double(n*m), PACKAGE="mixtools") } fkernel <- fkernel * matrix(ans$f, ncol = m) } lambda.f <- sweep(fkernel, 2, lambda[iter, ], "*") ## E-step (for next iteration) z.hat <- lambda.f/rowSums(lambda.f) loglik <- c(loglik,sum(log(rowSums(lambda.f)))) # log-likelihood finished <- iter >= maxiter if (stochastic) { sumpost <- sumpost + z.hat } else if (iter > 1) { # This convergence criterion may be too simplistic: maxchange <- max(abs(lambda[iter,] - lambda[iter-1,])) if (!samebw) maxchange <- max(maxchange, max(abs(bw.old - bw))) finished <- finished | (maxchange < eps) } if (verb) { t1 <- proc.time() cat("iteration", iter, " lambda ", round(lambda[iter, ], 4)) cat(" time", (t1 - t0)[3], "\n") } } if (!samebw) { rownames(bw) <- paste("block", 1:max(u)) colnames(bw) <- paste("component", 1:m) } if (verb) { tt1 <- proc.time() cat("lambda ", round(lambda[iter, ], 4)) cat(", total time", (tt1 - tt0)[3], "s\n") } if (stochastic) { return(structure(list(data = x, posteriors = sumpost/iter, lambda = lambda, bandwidth = bw, blockid = u, lambdahat = colMeans(lambda), loglik = loglik), class="npEM")) } else { return(structure(list(data = x, posteriors = z.hat, lambda = lambda[1:iter,], bandwidth = bw, blockid = u, lambdahat = lambda[iter,], loglik = loglik), class="npEM")) } } # Not sure whether the following function is really necessary: npEMindrepbw <- function (x, mu0, blockid = 1:ncol(x), bw = bw.nrd0(as.vector(as.matrix(x))), eps = 1e-08, maxiter = 500, stochastic = FALSE, verb = TRUE){ npEM(x=x, mu0=mu0, blockid=blockid, bw=bw, samebw=FALSE, eps=eps, maxiter=maxiter, stochastic=stochastic, verb=verb) } mixtools/R/normalmixinit.R0000755000175100001440000000315414342153463015377 0ustar hornikusersnormalmix.init <- function (x, lambda = NULL, mu = NULL, s = NULL, k = 2, arbmean = TRUE, arbvar = TRUE){ if (!is.null(s)) { arbvar <- (length(s) > 1) if (arbvar) k <- length(s) } if (!is.null(mu)) { arbmean <- (length(mu) > 1) if (arbmean) { k <- length(mu) if (!is.null(s) && length(s) > 1 && k != length(s)) { stop("mu and sigma are each of length >1 but not of the same length.") } } } if (!arbmean && !arbvar) { stop("arbmean and arbvar cannot both be FALSE") } n = length(x) x = sort(x) x.bin = list() for (j in 1:k) { x.bin[[j]] <- x[max(1, floor((j - 1) * n/k)):ceiling(j * n/k)] } if (is.null(s)) { s.hyp = as.vector(sapply(x.bin, sd)) if (any(s.hyp == 0)) s.hyp[which(s.hyp == 0)] = runif(sum(s.hyp == 0), 0, sd(x)) if (arbvar) { s = 1/rexp(k, rate = s.hyp) } else { s = 1/rexp(1, rate = mean(s.hyp)) } } if (is.null(mu)) { mu.hyp <- as.vector(sapply(x.bin, mean)) if (arbmean) { mu = rnorm(k, mean = mu.hyp, sd = s) } else { mu = rnorm(1, mean = mean(mu.hyp), sd = mean(s)) } } if (is.null(lambda)) { cond = TRUE while(cond){ lambda = runif(k) lambda = lambda/sum(lambda) if(min(lambda)<0.05) cond=TRUE else cond=FALSE } } else { lambda <- rep(lambda, length.out = k) lambda <- lambda/sum(lambda) } list(lambda = lambda, mu = mu, s = s, k = k, arbvar = arbvar, arbmean = arbmean) } mixtools/R/plotly_spEMN01.R0000644000175100001440000000475114343053262015231 0ustar hornikusersplotly_spEMN01 <- function(x, bw=x$bandwidth, knownpdf=dnorm, add.plot=FALSE, width = 3 , col.dens = NULL, col.hist = '#1f77b4', title = NULL , title.size = 15 , title.x = 0.5 , title.y = 0.95, xlab = "t" , xlab.size = 15 , xtick.size = 15, ylab = "Density" , ylab.size = 15 , ytick.size = 15, legend.text = "Densities" , legend.text.size = 15 , legend.size = 15 ){ t <- seq(min(x$data), max(x$data), len=200) f1 <- x$lambdahat[1]*knownpdf(t) f2 <- x$lambdahat[2]*wkde(x$data-x$muhat, u=t-x$muhat, w=x$post[,2], bw=bw, sym=TRUE) f <- f1+f2 if(is.null(col.dens)){ col.dens <- hue_pal()(3) } if (length(col.dens) != 3){ print("Please sepcify 3 colors in 'col.dens'.") } if (is.null(title)){ title <- "" } plot <- plot_ly()%>% add_trace(x=t , y=f , type = 'scatter' , mode = 'lines', line = list(width = width , color = col.dens[1]), name = "f", showlegend = TRUE)%>% add_trace(x=t , y=f1 , type = 'scatter' , mode = 'lines', line = list(width = width , color = col.dens[2]), name = "f1", showlegend = TRUE)%>% add_trace(x=t , y=f2 , type = 'scatter' , mode = 'lines', line = list(width = width , color = col.dens[3]), name = "f2", showlegend = TRUE)%>% plotly::layout( legend = list(title=list(text=legend.text, font=list(size=legend.text.size)), font = list(size=legend.size)), title = list(text = title, x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = xlab, font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = ylab, font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) if (add.plot){ plot <- plot%>% add_trace(x=x$data , type = 'histogram', histnorm = "probability density", name = 'Data' , showlegend = FALSE, marker = list(color = col.hist, line = list(color = col.hist)) )%>% plotly::layout(bargap = 0.01) } print(plot) }mixtools/R/logitfns.R0000755000175100001440000000007314342153463014327 0ustar hornikuserslogit <- binomial()$linkfun inv.logit <- binomial()$linkinvmixtools/R/kernB.R0000755000175100001440000000012514342153463013541 0ustar hornikuserskern.B <- function (x, xi, h, g = 0) { ((1-((xi-x)/h)^2)^g)/beta(.5,g+1)/h } mixtools/R/repnormmixmodelsel.R0000755000175100001440000000274314342153463016435 0ustar hornikusersrepnormmixmodel.sel <- function (x, k = 2, ...) { aic <- NULL bic <- NULL caic <- NULL icl <- NULL AIC <- function(emout) { emout$loglik - (length(emout$mu) + length(emout$stdev) + length(emout$lambda) - 1) } BIC <- function(emout) { emout$loglik - log(nrow(x)) * (length(emout$mu) + length(emout$stdev) + length(emout$lambda) - 1)/2 } CAIC <- function(emout) { emout$loglik - (log(nrow(x)) + 1) * (length(emout$mu) + length(emout$stdev) + length(emout$lambda) - 1)/2 } ICL <- function(emout) { BIC(emout) - sum(emout$lambda * log(emout$lambda)) } for (i in 1:k) { if (i == 1) { avx <- as.vector(x) mu <- mean(avx) s <- sd(avx) loglik <- sum(dnorm(avx, mean=mu, sd=s, log=TRUE)) emout <- list(mu=mu, stdev=s, lambda=1, loglik=loglik) } else emout <- repnormmixEM(x, k = i, ...) aic[i] <- AIC(emout) bic[i] <- BIC(emout) caic[i] <- CAIC(emout) icl[i] <- ICL(emout) } out = rbind(aic, bic, caic, icl) Winner = apply(out, 1, function(x) (1:length(x))[x == max(x)]) rownames(out) = c("AIC", "BIC", "CAIC", "ICL") colnames(out) = 1:k cbind(out, Winner) } mixtools/R/mixturegram.R0000644000175100001440000001247314342153463015052 0ustar hornikusersmixturegram <- function(data, pmbs, method=c("pca","kpca","lda"), all.n=FALSE, id.con=NULL, score=1, iter.max=50, nstart=25, ...){ col.blind=rep(c("#000000", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7", "#7FFF00","#7D26CD"),100) method <- match.arg(method) k=length(pmbs)+1 if (is.null(id.con)) id.con=lapply(pmbs,function(x) data%*%x/apply(x,2,sum)) ###regular pca if(method=="pca"){ x.star=c(list(data), lapply(1:(k-1), function(i) cbind(data,pmbs[[i]][,order(id.con[[i]])]))) Data=lapply(x.star,scale) if(score>(ncol(Data[[1]])+1)) warning(paste("The largest value that can be specified for 'score' is ",ncol(Data[[1]])+1,", which is what will be used for the mixturegram.",sep="")) score<-min(score,ncol(x.star[[2]])) if(score==1){ PCA=lapply(Data,function(x) x%*%princomp(x)$loadings[,score]) } else{ PCA <- vector("list",k) PCA[[1]]=Data[[1]]%*%princomp(Data[[1]])$loadings[,1] PCA[2:k]=lapply(1:(k-1),function(i) Data[[(i+1)]]%*%princomp(Data[[(i+1)]])$loadings[,score]) } K=lapply(2:k,function(i) kmeans(PCA[[i]],i,iter.max=iter.max,nstart=nstart)) lim=ceiling(max(abs(unlist(PCA)))) plot(1:k,rep(1e1000,k),ylim=c(-lim,lim),col='white',xlab='k',ylab='PC Scores',xaxt="n", ...) rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col = colors()[356]) axis(1,at=1:k,labels=1:k) abline(v=1:k,col="gray80") mix.method <- PCA }else{ ###kernel pca if(method=="kpca"){ x.star=c(list(data), lapply(1:(k-1), function(i) cbind(data,pmbs[[i]][,order(id.con[[i]])]))) Data=lapply(x.star,scale) if(score>(ncol(Data[[1]])+1)) warning(paste("The largest value that can be specified for 'score' is ",ncol(Data[[1]])+1,", which is what will be used for the mixturegram.",sep="")) score<-min(score,ncol(x.star[[2]])) if(score==1){ kPCA=lapply(Data,function(x) cbind(pcv(kpca(x))[,1])) } else{ kPCA <- vector("list",k) kPCA[[1]]=cbind(pcv(kpca(Data[[1]]))[,1]) kPCA[2:k]=lapply(1:(k-1),function(i) cbind(pcv(kpca(Data[[i+1]]))[,score])) } K=lapply(2:k,function(i) kmeans(kPCA[[i]],i,iter.max=iter.max,nstart=nstart)) lim=max(abs(unlist(kPCA)))+0.1 plot(1:k,rep(1e1000,k),ylim=c(-lim,lim),col='white',xlab='k',ylab='Kernel PC Scores',xaxt="n", ...) rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col = colors()[356]) axis(1,at=1:k,labels=1:k) abline(v=1:k,col="gray80") mix.method <- kPCA }else{ if(method=="lda"){ class=lapply(pmbs, function(post) apply(post,1,which.max)) ldcdata = c(list(as.matrix(data) %*% ldc(data, rep(1,nrow(as.matrix(data))),score=score)), lapply(class, function(class) as.matrix(data) %*% ldc(data, class,score=score))) K=lapply(2:k,function(i) kmeans(ldcdata[[i]],i,iter.max=iter.max,nstart=nstart)) lim=ceiling(max(abs(unlist(ldcdata)))) plot(1:k,rep(1e1000,k),ylim=c(-lim,lim),col='white',xlab='k',ylab='LDC Scores',xaxt="n", ...) rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col = colors()[356]) axis(1,at=1:k,labels=1:k) abline(v=1:k,col="gray80") mix.method <- ldcdata } } } Kcol=function(x){ temp=unlist(sapply(1:length(x$size),function(i) rep(rank(x$center)[i],x$size[i]))) index=unlist(sapply(1:length(x$size),function(i) which(x$cluster==i))) K.col=replace(x$cluster,index,temp) } all.K.col=lapply(1:(k-1), function(i) Kcol(K[[i]])) K.col=all.K.col[[k-1]] n=length(K.col) K.centers=c(0, lapply(1:(k-1), function(i) sort(c(K[[i]]$centers)))) if(all.n){ sapply(1:(k-1),function(i) segments(i,mix.method[[i]],(i+1),mix.method[[i+1]],col=col.blind[K.col])) points(1,mean(mix.method[[1]]),pch=21,cex=1.2,bg=colors()[553],col=1) sapply(2:k,function(i) points(rep(i,i),sort(c(K[[i-1]]$centers)),pch=21,cex=1.2,bg=colors()[553],col=1)) } else{ ride.medians=sapply(1:k, function(i) unlist(by(c(mix.method[[i]]),col.blind[K.col],median))) prop.mad=sapply(1:k, function(i) unlist(by(c(mix.method[[i]]),col.blind[K.col],mad))) L1=ride.medians-prop.mad U1=ride.medians+prop.mad L2=ride.medians-2*prop.mad U2=ride.medians+2*prop.mad L3=ride.medians-3*prop.mad U3=ride.medians+3*prop.mad srt.colors=rownames(ride.medians) srt.colors1=adjustcolor(srt.colors, alpha.f = 0.7) srt.colors2=adjustcolor(srt.colors, alpha.f = 0.4) srt.colors3=adjustcolor(srt.colors, alpha.f = 0.2) invisible(sapply(1:k, function(i) polygon(c(1:k,k:1),c(L3[i,],rev(U3[i,])),col=srt.colors3[i], border=FALSE) )) invisible(sapply(1:k, function(i) polygon(c(1:k,k:1),c(L2[i,],rev(U2[i,])),col=srt.colors2[i], border=FALSE) )) invisible(sapply(1:k, function(i) polygon(c(1:k,k:1),c(L1[i,],rev(U1[i,])),col=srt.colors1[i], border=FALSE) )) invisible(sapply(1:(k-1),function(i) segments(rep(i,k),ride.medians[,i],rep((i+1),k),ride.medians[,(i+1)],col=srt.colors) )) points(1,mean(mix.method[[1]]),pch=21,cex=1.2,bg=colors()[553],col=1) invisible(sapply(2:k,function(i) points(rep(i,i),sort(c(K[[i-1]]$centers)),pch=21,cex=1.2,bg=colors()[553],col=1))) } props=c(1,sapply(1:length(K), function(i) K[[i]][[5]]/sum(unlist(K[[i]][5:6])))) print(list(stopping=props)) } mixtools/R/plot.mixEM.R0000644000175100001440000002142114342153463014473 0ustar hornikusersplot.mixEM <-function (x, whichplots = 1, loglik = 1 %in% whichplots, density = 2 %in% whichplots, xlab1="Iteration", ylab1="Log-Likelihood", main1="Observed Data Log-Likelihood", col1=1, lwd1=2, xlab2=NULL, ylab2=NULL, main2=NULL, col2=NULL, lwd2=2, alpha = 0.05, marginal = FALSE, ...) { def.par <- par(ask=(loglik + density > 1), "mar") # only ask and mar are changed mix.object <- x if (!inherits(mix.object, "mixEM")) stop("Use only with \"mixEM\" objects!") if (loglik) { plot(mix.object$all.loglik, xlab = xlab1, ylab = ylab1, main = main1, type="l", lwd=lwd1, col=col1, ...) } if (density) { if (mix.object$ft == "logisregmixEM") { if (ncol(mix.object$x) != 2) { stop("The predictors must have 2 columns!") } if (sum((mix.object$y == 1) + (mix.object$y == 0)) != length(mix.object$y)) { stop("The response must be binary!") } k = ncol(mix.object$beta) x = mix.object$x[, 2] if(is.null(main2)) { main2 <- "Most Probable Component Membership" } if(is.null(xlab2)) { xlab2 <- "Predictor" } if(is.null(ylab2)) { ylab2 <- "Response" } if(is.null(col2)) { col2 <- 2:(k+1) } plot(x, mix.object$y, main=main2, xlab=xlab2, ylab=ylab2, col = col2[apply(mix.object$posterior, 1, which.max)], ...) a = cbind(x, mix.object$y) a = a[order(a[, 1]), ] for (i in 1:k) { lines(a[, 1], plogis(mix.object$beta[1, i] + mix.object$beta[2, i] * a[, 1]), col = col2[i]) } } if (mix.object$ft == "normalmixEM") { k <- ncol(mix.object$posterior) x <- sort(mix.object$x) a <- hist(x, plot = FALSE) maxy <- max(max(a$density), .3989*mix.object$lambda/mix.object$sigma) if(is.null(main2)) { main2 <- "Density Curves" } if(is.null(xlab2)) { xlab2 <- "Data" } if(is.null(col2)) { col2 <- 2:(k+1) } hist(x, prob = TRUE, main = main2, xlab = xlab2, ylim = c(0,maxy), ...) if (length(mix.object$mu) == 1) { arbvar <- TRUE mix.object$sigma <- mix.object$scale * mix.object$sigma arbmean <- FALSE } if (length(mix.object$mu) == k && length(mix.object$sigma) == 1) { arbmean <- TRUE arbvar <- FALSE } if (length(mix.object$sigma) == k && length(mix.object$mu) == k) { arbmean <- TRUE arbvar <- TRUE } for (i in 1:k) { lines(x, mix.object$lambda[i] * dnorm(x, mean = mix.object$mu[i * arbmean + (1 - arbmean)], sd = mix.object$sigma[i * arbvar + (1 - arbvar)]), col = col2[i], lwd = lwd2) } } if (mix.object$ft == "repnormmixEM") { x <- as.vector(as.matrix(x)) k <- ncol(mix.object$posterior) x <- sort(mix.object$x) a <- hist(x, plot = FALSE) maxy <- max(max(a$density), .3989*mix.object$lambda/mix.object$sigma) if (is.null(main2)) { main2 <- "Density Curves" } if(is.null(xlab2)) { xlab2 <- "Data" } if(is.null(col2)) { col2 <- 2:(k+1) } hist(x, prob = TRUE, main = main2, xlab = xlab2, ylim = c(0, maxy), ...) if (length(mix.object$mu) == 1) { arbvar <- TRUE mix.object$sigma = mix.object$scale * mix.object$sigma arbmean <- FALSE } if (length(mix.object$mu) == k && length(mix.object$sigma) == 1) { arbmean <- TRUE arbvar <- FALSE } if (length(mix.object$sigma) == k && length(mix.object$mu) == k) { arbmean <- TRUE arbvar <- TRUE } for (i in 1:k) { lines(x, mix.object$lambda[i] * dnorm(x, mean = mix.object$mu[i * arbmean + (1 - arbmean)], sd = mix.object$sigma[i * arbvar + (1 - arbvar)]), col = col2[i], lwd = lwd2) } } if (mix.object$ft == "regmixEM.mixed") { x.1 = mix.object$x n = sum(sapply(x.1, nrow)) x.1.sum = sum(sapply(1:length(x.1), function(i) length(x.1[[i]][, 1]))) if (x.1.sum == n) { x = lapply(1:length(x.1), function(i) matrix(x.1[[i]][, -1], ncol = 1)) } else { x = x.1 } post.beta(x = x, y = mix.object$y, p.beta = mix.object$posterior.beta, p.z = mix.object$posterior.z) } if (mix.object$ft == "mvnormalmixEM") { x = mix.object$x if (ncol(x) != 2) { stop("The data must have 2 columns!") } post = apply(mix.object$posterior, 1, which.max) k <- ncol(mix.object$posterior) if (is.list(mix.object$sigma)) { sigma = mix.object$sigma } else { sigma = lapply(1:k, function(i) mix.object$sigma) } if (is.list(mix.object$mu)) { mu = mix.object$mu } else { mu = lapply(1:k, function(i) mix.object$mu) } if(is.null(xlab2)) { xlab2 <- "X.1" } if(is.null(ylab2)) { ylab2 <- "X.2" } if(is.null(col2)) { col2 <- 2:(k+1) } if (marginal == FALSE) { if (is.null(main2)) { main2 <- "Density Curves" } plot(x, col = col2[post], xlab = xlab2, ylab = ylab2, main = main2, ...) lapply(1:k, function(i) points(mu[[i]][1], mu[[i]][2], pch = 19)) for (i in 1:k) { for (j in 1:length(alpha)) { ellipse(mu = mu[[i]], sigma = sigma[[i]], alpha = alpha[j], col = col2[i]) } } } else { if (is.null(main2)) { main2 <- "" } # FIXME: What's the right main2 here? x <- mix.object$x[, 1] y <- mix.object$x[, 2] xhist <- hist(x, plot = FALSE) yhist <- hist(y, plot = FALSE) top <- max(c(xhist$counts, yhist$counts)) xrange <- range(x) yrange <- range(y) nf <- layout(matrix(c(2, 0, 1, 3), 2, 2, byrow = TRUE), c(4, 1), c(1, 4), TRUE) layout.show(nf) par(mar = c(3, 3, 1, 1)) plot(mix.object$x[, 1], mix.object$x[,2], col = col2[post], xlab = xlab2, ylab = ylab2, main = main2, ...) lapply(1:k, function(i) points(mu[[i]][1], mu[[i]][2], pch = 19)) for (i in 1:k) { for (j in 1:length(alpha)) { ellipse(mu = mu[[i]], sigma = sigma[[i]], alpha = alpha[j], col = (i + 1)) } } par(mar = c(0, 3, 1, 1)) barplot(xhist$counts, axes = FALSE, ylim = c(0, top), space = 0, ...) par(mar = c(3, 0, 1, 1)) barplot(yhist$counts, axes = FALSE, xlim = c(0, top), space = 0, horiz = TRUE, ...) } } if (mix.object$ft == "regmixEM") { if (ncol(mix.object$x) != 2) { stop("The predictors must have 2 columns!") } post <- apply(mix.object$posterior, 1, which.max) k <- ncol(mix.object$posterior) x <- mix.object$x[, 2] y <- mix.object$y n <- length(y) if(is.null(main2)) { main2 <- "Most Probable Component Membership" } if(is.null(xlab2)) { xlab2 <- "Predictor" } if(is.null(ylab2)) { ylab2 <- "Response" } if(is.null(col2)) { col2 <- 2:(k+1) } plot(x, y, main = main2, xlab=xlab2, ylab=ylab2, type="n", ...) a = cbind(mix.object$x[, 2], mix.object$y, post) for (i in 1:k) { xy = subset(cbind(a, mix.object$posterior[, i]), a[, 3] == i)[, -3] xy = matrix(xy, ncol=3) points(xy[, 1], xy[, 2], col = col2[i]) if (is.matrix(mix.object$beta) == FALSE) { abline(coef = mix.object$beta) beta = matrix(mix.object$beta, ncol = k, nrow = 2) } else { abline(coef = mix.object$beta[, i], col = col2[i]) beta = mix.object$beta } out = lm(y ~ x, weights = mix.object$posterior[,i]) fit = beta[1, i] + beta[2, i] * x out.aov = anova(out) MSE = out.aov$Mean[2] xy.f = cbind(x, y, fit) xy.sort = xy.f[order(xy.f[, 1]), ] x.new = seq(from=min(x),to=max(x),length.out=100) y.new = beta[1, i] + beta[2, i] * x.new s.h <- sqrt(MSE * (1/n + (x.new - mean(xy.sort[,1]))^2 / var(xy.sort[, 1])/(n - 1))) for (j in 1:length(alpha)) { W = sqrt(qf(1 - alpha[j], 2, n - 2)) upper = y.new + W * s.h lower = y.new - W * s.h lines(x.new, upper, col = (i + 1)) lines(x.new, lower, col = (i + 1)) } } } if (mix.object$ft == "expRMM_EM") {plotexpRMM(mix.object, ...)} # all default if (mix.object$ft == "weibullRMM_SEM") {plotweibullRMM(mix.object, ...)} # all default } par(def.par) # reset ask and mar to original values } mixtools/R/compcdf.R0000755000175100001440000000176414342153463014125 0ustar hornikuserscompCDF <- function(data, weights, x=seq(min(data, na.rm=TRUE), max(data, na.rm=TRUE), len=250), comp=1:NCOL(weights), makeplot=TRUE, ...) { if (NROW(weights) != NROW(data)) { stop("data and weights arguments must have same number of rows") } # First, normalize the weights so the sum of each column is 1/NCOL(data) weights <- t(t(weights) / (NCOL(data) * colSums(weights))) # Next, give a binomial count for each row of the data and for each x f <- function(row, cutpt) colSums(outer(row, cutpt, "<="), na.rm = TRUE) bc <- apply(data, 1, f, x) # bc is a length(x) by n matrix; each column should be multiplied by # the appropriate weight(s) and then the rows summed to give the # unnormalized cdf estimates. This is just a matrix product. cdfs <- bc %*% weights[,comp,drop=FALSE] if(makeplot) { plot(range(x), 0:1, type="n", ...) for (i in 1:length(comp)) { lines(x, cdfs[,comp[i]], lty=i, ...) } } t(cdfs) } mixtools/R/flaremixinit.R0000755000175100001440000000111714342153463015175 0ustar hornikusersflaremix.init <- function(y, x, lambda=NULL, beta=NULL, sigma=NULL, alpha=NULL){ n<-length(y) if(is.null(lambda)){ lambda=runif(2) lambda=lambda/sum(lambda) } lm.out=lm(y~x[,2]) if(is.null(beta)){ beta=lm.out$coef beta[1]=beta[1]+mean(sort(lm.out$residuals)[(n-10):n]) beta[2]=rnorm(1,mean=beta[2],sd=abs(beta[2]/10)) } if(is.null(sigma)){ sigma=rexp(1,rate=sqrt(1/anova(lm.out)$Mean[2])) } if(is.null(alpha)){ a=1/sum(lm.out$res[lm.out$res>0]) alpha=abs(rnorm(1,a)) } list(lambda=lambda[1], beta=matrix(beta,ncol=1), sigma=sigma, alpha=alpha) } mixtools/R/multmixinit.R0000755000175100001440000000063714342153463015073 0ustar hornikusersmultmix.init <- function(y, lambda = NULL, theta = NULL, k = 2){ n <- nrow(y) p <- ncol(y) if (is.null(theta)) { theta = matrix(runif(p * k), k, p) theta = theta/apply(theta, 1, sum) } else k = nrow(theta) if (is.null(lambda)) { lambda = runif(k) lambda = lambda/sum(lambda) } else k = length(lambda) list(lambda=lambda, theta=theta, k=k) }mixtools/R/normalmixEM2comp.R0000755000175100001440000000331314342153463015673 0ustar hornikusers# fast function for two-component univariate normal mixture normalmixEM2comp <- function(x, lambda, mu, sigsqrd, eps=1e-8, maxit=1000, verb=FALSE) { arbvar <- (length(sigsqrd)==2) mu1 <- mu[1]; mu2 <- mu[2] sigsqrd1 <- sigsqrd[1]; sigsqrd2 <- sigsqrd[arbvar+1] mx <- mean(x) const <- length(x) * 0.918938533204673 # i.e., times log(2*pi)/2 dl <- 1 + eps iter<-0 ll <- rep(0, maxit+1) a1<-(x-mu1)^2; b1<-(lambda/sqrt(sigsqrd1))*exp(-a1/2/sigsqrd1) a2<-(x-mu2)^2; b2<-((1-lambda)/sqrt(sigsqrd2))*exp(-a2/2/sigsqrd2) l <- sum(log(b1+b2)) while (dl>eps && iterm) { #browser(); #plot(x[,2],y); # j <- 1} iter <- iter + 1 t0 <- proc.time() ## M-step lambda[iter, ] <- colMeans(z.hat) oldbeta <- beta for (j in 1:m) { #abline(beta[1,j],beta[2,j], col=1+j, lwd=3, lty=2) if (betamethod=="LS") { wx <- sweep(x, 1, z.hat[,j], "*") beta[,j] <- solve(t(wx) %*% x, t(wx) %*% y) # Weighted least squares solution } else if (betamethod=="L1") { # Weighted L1 solution beta[,j] <- optim(par=beta[,j], fn=L1norm, y=y, x=x, p=z.hat[,j])$par } else if (betamethod=="transition") { # transition from LS to NP wx <- sweep(x, 1, z.hat[,j], "*") beta[,j] <- SPweight * optim(par=beta[,j], fn=nploglik, y=y, x=x, p=z.hat[,j], bw=bw, res=as.vector(y-x%*%beta), wts=as.vector(z.hat), symm=symm, control=list(fnscale=-1))$par + # NP loglik (1-SPweight) * solve(t(wx) %*% x, t(wx) %*% y) # Weighted least squares SPweight <- min(1, SPweight + (1e-4)*2^(iter-1)) } else { # Nonparametric loglikelihood beta[,j] <- optim(par=beta[,j], fn=nploglik, y=y, x=x, p=z.hat[,j], bw=bw, res=as.vector(y-x%*%beta), wts=as.vector(z.hat), symm=symm, control=list(fnscale=-1))$par #res=as.vector(y-x%*%beta) #plot(res,wkde(x=res, u=res, w=as.vector(z.hat), bw=bw, sym=symm)) #browser() } ## Here, we might try other methods of estimating beta. } ## update the bandwidth, if necssary xbetavec <- as.double(x %*% beta) zhatvec <- as.double(z.hat) if (is.null(bw) || !constbw) { res <- y-xbetavec np.sigma <- sqrt(sum(res^2 * zhatvec)/(n-1)) bw <- bwmult / n^(1/5) * min(np.sigma, wiqr<-wIQR(wt=zhatvec, x=res)/1.34) #print(c(np.sigma, wiqr)) } ## density estimation step if (symm) { ans <- .C(C_KDEsymloc2, n=as.integer(n), m=as.integer(m), mu = xbetavec, y=as.double(y), bw=as.double(bw), z=as.double(z.hat), f=double(n*m)) } else { ans <- .C(C_KDEloc2, n=as.integer(n), m=as.integer(m), mu = xbetavec, y=as.double(y), bw=as.double(bw), z=as.double(z.hat), f=double(n*m)) } fkernel <- matrix(ans$f, ncol=m) lambda.f <- sweep(fkernel, 2, lambda[iter,], "*") ## E-step (for next iteration) z.hat <- lambda.f/rowSums(lambda.f) ## Test convergence criteria finished <- (iter > 1 && SPweight == 1 && (iter >= maxit || max(max(abs(beta-oldbeta)), max(abs(lambda[iter,]-lambda[iter-1,]))) < epsilon )) ## Print message for each iteration if (verbose) { t1 <- proc.time() cat("iteration ", iter, " lambda ", round(lambda[iter,], 4), " bandwidth ", round(bw, 3)) cat(" time", (t1 - t0)[3], "\n") } } ## Print final message after convergence if (verbose) { tt1 <- proc.time() cat("lambda ", round(lambda[iter,], 4)) cat(", total time", (tt1 - tt0)[3], "s\n") } res <- ans$y - ans$mu xx <- res yy <- ans$f if (symm) { xx <- c(xx, -res) # exploiting symmetry yy <- c(yy, yy) } ox <- order(xx) np.sigma <- sqrt(sum(res^2 * ans$z)/(n-1)) loglik <- rep(0, n) for(j in 1:m) { loglik <- loglik + z.hat[,j]*wkde(as.vector(y-x%*%beta[,j]), w=as.vector(z.hat[,j]), bw=bw, sym=symm) } loglik <- sum(log(loglik)) a <- list(x=x, y=y, lambda = lambda[1:iter,], beta = beta, posterior = z.hat, np.stdev = np.sigma, bandwidth=bw, density.x = xx[ox], density.y = yy[ox], symmetric=symm, loglik = loglik, ft="regmixEM") class(a) = "npEM" a } mixtools/R/tauequivnormalmixEM.R0000644000175100001440000000341614342153463016517 0ustar hornikusers## Use an ECM algorithm (in the sense of Meng and Rubin, Biometrika 1993) ## to search for a local maximum of the likelihood surface for a ## univariate finite mixture of normals with possible equality ## constraints on the stdev parameters. ## It is assumed here that there are three components and the three normal means ## are equal to alpha, alpha-delta, and alpha+delta for unknown parameters ## alpha and delta. ## In other words, this function implements the specific model described in ## Thomas et al (2009), Extensions of Reliability Theory. ## It is a modified version of normalmixEM. tauequivnormalmixEM <- function (x, lambda = NULL, mu = NULL, sigma = NULL, k = 3, mean.constr = NULL, sd.constr = NULL, gparam = NULL, epsilon = 1e-08, maxit = 10000, maxrestarts=20, verb = FALSE, fast=FALSE, ECM = TRUE, arbmean = TRUE, arbvar = TRUE) { M <- A <- NULL if (is.null(mean.constr)) { # In this case, we will be fitting a 3-component mixture model with means # constrained to be alpha, alpha-delta, and alpha+delta for # parameters alpha and delta. k <- 3 if (length(mu) != 3) mu <- NULL if (length(sigma) != 3) sigma <- NULL M <- matrix(c(1, 1, 1, 0, -1, 1), 3, 2) # We will also constain the reciprocals of the variances to be # gamma_1+gamma_2, gamma_1, and gamma_1 for positive # parameters gamma_1 and gamma_2. A <- matrix(c(1, 1, 1, 1, 0, 0), 3, 2) } normalmixMMlc(x, lambda = lambda, mu = mu, sigma = sigma, k = k, mean.constr = mean.constr, mean.lincstr = M, var.lincstr = A, gparam = gparam, epsilon = epsilon, maxit = maxit, maxrestarts = maxrestarts, verb = verb) } mixtools/R/FDR_spEM.R0000644000175100001440000001270114342153463014037 0ustar hornikusers################################################################# ## FUNCTIONS FOR FALSE DISCOVERY RATE (FDR) ESTIMATION ## ## USING SEMI-PARAMETRIC EM-LIKE ALGORITHMS ## ## D. CHAUVEAU ## ## mixtools 1.0 addition ## ################################################################# ################################################################# ## EM-like algorithm for a nonparametric univariate mixture model ## - Component 1 known = N(0,1) ## = the pdf of a probit transform of pvalue under H0 ## - component 2 symmetric shifted from a location parameter mu ## NB: stochastic=TRUE not implemented, parameter removed here spEMsymlocN01 <- function(x, mu0=2, bw = bw.nrd0(x), h=bw, eps = 1e-8, maxiter=100, verbose = FALSE, plotf=FALSE){ bw <- h # h is alternative bandwidth argument, for backward compatibility n <- length(x) # if (length(mu0)>1) m <- length(mu0) else m <- mu0 m <- 2 # fixed number of components in this model z.hat <- matrix(0, nrow=n, ncol=m) fkernel <- matrix(0, nrow=n, ncol=m) tt0 <- proc.time() o <- order(x) # for plotting fhat's if requested kmeans <- kmeans(x, mu0) # is this a good init for probit data? for(j in 1:m) { z.hat[kmeans$cluster==j, j] <- 1 } iter <- 0 finished <- FALSE lambda <- matrix(0,maxiter,m) mu <- rep(0,maxiter) # only component 2 mean used in this case while (!finished) { #while (max(abs(change)) > eps & iter < maxiter) { iter <- iter + 1 t0 <- proc.time() ## M-Step lambda[iter,] <- colMeans(z.hat) # mu[iter,] <- apply(sweep(z.hat, 1, x, "*"), 2, mean)/lambda[iter,] mu[iter] <- sum(x*z.hat[,2])/(n*lambda[iter,2]) # ## second component density estimation step evaluated at x_i-mu's ans <- .C(C_KDEsymloc1comp, n=as.integer(n), mu=as.double(mu[iter]), lbd2=as.double(lambda[iter,2]), x=as.double(x), bw=as.double(bw), z=as.double(z.hat), f = double(n)) #add PACKAGE="mixtools" option when integrated # successive plots of fhat's (for debugging mostly) if (plotf) { if (iter==1) plotfunc <- plot else plotfunc <- lines plotfunc(x[o],ans$f[o],type="l", col=iter) } # version lambda_j f_j(xi) specific for component one = N(0,1) # NB: this is the only place where the known component pdf is used lambda.f <- cbind(lambda[iter,1]*dnorm(x), lambda[iter,2]*ans$f) ## E-step (for next iteration) z.hat <- lambda.f/rowSums(lambda.f) finished <- iter >= maxiter if (iter>1) { # This convergence criterion is too simplistic: change <- c(lambda[iter,] - lambda[iter-1,], mu[iter]-mu[iter-1]) finished <- finished | (max(abs(change)) < eps) } if (verbose) { t1 <- proc.time() cat("iteration ", iter, " lambda ", round(lambda[iter,], 4), " mu ", round(mu[iter], 4)) cat(" time", (t1 - t0)[3], "\n") } } if (verbose) { tt1 <- proc.time() cat("lambda ", round(lambda[iter,], 4)) cat(", total time", (tt1 - tt0)[3], "s\n") } return(structure(list(data=x, posteriors=z.hat, lambda=lambda[1:iter,], bandwidth=bw, lambdahat=lambda[iter,], mu = mu[1:iter], muhat = mu[iter], symmetric=TRUE), class="spEMN01")) } ####################################################### # plot mixture pdf for the semiparametric mixture model # with component 1 pdf passed in the knownpdf parameter # uses a weighted kernel density estimate of the nonparametric component 2 # a = object of class "spEMN01" as returned by spEMsymlocNorm plot.spEMN01 <- function(x, bw=x$bandwidth, knownpdf=dnorm, add.plot=FALSE, ...) { t <- seq(min(x$data), max(x$data), len=200) f1 <- x$lambdahat[1]*knownpdf(t) f2 <- x$lambdahat[2]*wkde(x$data-x$muhat, u=t-x$muhat, w=x$post[,2], bw=bw, sym=TRUE) f <- f1+f2 if (!add.plot) plot(t,f1+f2, type="l", ...) else lines(t,f1+f2, ...) lines(t,f1, col=2); lines(t,f2, col=3) } #################################################### # plot and compare FDR for 1 or 2 EM-like strategies # for mixtools 1.0 # post NEEDS to be sorted by p plotFDR <- function(post1, post2=NULL, lg1="FDR 1", lg2=NULL, title=NULL, compH0=1, alpha=0.1, complete.data =NULL, pctfdr=0.3) { n <- dim(post1)[1] cs1 <- cumsum(post1[,compH0]) # local FDR(p_i)'s fdr1 <- cs1/(1:n) # FDR(p_i)'s if (is.null(title)) title <- paste("FDR estimate(s), n=",n) if (!is.null(post2)) { cs2 <- cumsum(post2[,compH0]) # local FDR(p_i)'s fdr2 <- cs2/(1:n) if (is.null(lg2)) lg2 <- "FDR 2" } i1 <- sum(fdr1 pctfdr # cat("index",i1) plot(fdr1[1:i1], type="l", main=title, col=1, ylim=c(0,fdr1[i1]), xlab="index", ylab="probability") if (!is.null(post2)) lines(fdr2[1:i1], col=2) abline(alpha, 0, lty=3) if (!is.null(complete.data)) { # true complete data available V <- cumsum(complete.data[,1]==1) # cumulative nb of items under H0 trueFDR <- V/(1:n) lines(trueFDR[1:i1], lty=2, col=3) if (!is.null(post2)) legend("topleft", c(lg1,lg2,"True FDR"),col=1:3, lty=c(1,1,2)) if (is.null(post2)) legend("topleft", c(lg1,"True FDR"),col=c(1,3), lty=c(1,2)) } else { if (!is.null(post2)) legend("topleft", c(lg1,lg2), col=1:2, lty=c(1,1)) if (is.null(post2)) legend("topleft", lg1, col=1, lty=1) } } mixtools/R/depth.R0000755000175100001440000000243514342153463013612 0ustar hornikusers###################################################################### # the following depth function can compute the depth for # # multi points at one time # ###################################################################### #dyn.load("~fxuan/depth/spherical/sphericaldepth.so") depth <- function(pts,x,Cx=var(x)){ x=x%*%t(chol(solve(Cx))) pts=pts%*%t(chol(solve(Cx))) # y <- .Fortran("mudepth", # as.integer(nrow(x)), # as.integer(nrow(pts)), # as.integer(ncol(x)), # as.single(pts), # as.single(x), # as.integer(1:nrow(pts)), # as.single(1:nrow(pts)), # PACKAGE="mixtools") # Now rewritten in C: y <- .C(C_mudepth, as.integer(nrow(x)), as.integer(nrow(pts)), as.integer(ncol(x)), as.double(pts), as.double(x), integer(nrow(pts)), double(nrow(pts)), PACKAGE="mixtools") count <- y[[6]] n <- nrow(x) # depth <- sqrt(8)*(count-n*(n-1)/4)/sqrt((n*(n-1)))#this is to standardize the depth # depth <- (factorial(n)/(2*factorial(n-2)))^(-1)*count depth <- choose(n,2)^(-1)*count depth } mixtools/R/plotly_seq.npEM.R0000644000175100001440000000720114343053456015532 0ustar hornikusersplotly_seq.npEM <- function(x, col = '#1f77b4' , width = 6, xlab = "Iteration" , xlab.size = 15 , xtick.size = 15, ylab.size = 15 , ytick.size = 15, title.size = 15 , title.x = 0.5 , title.y = 0.95){ r <- NCOL(x$data) n <- NROW(x$data) m <- length(x$lambdahat) iter <- NROW(x$lambda) nbcol <- 1 if (!is.null(x$symmetric) && x$symmetric){nbcol <- 2} # in all cases, plots the lambda's for (j in 1:m){ estim <- paste(round(x$lambdahat[j],3)) # tt <- substitute(expression(paste("sequence of ",lambda[j], # ", estimate ",widehat(lambda[j]),"=", estim, sep=""))) tt <- paste("Sequence of " ,'λ',"",j,"", " (Estimated ","λ","",j,"","=",estim, ")",sep="") # ylabel <- substitute(expression(paste(lambda[j],sep=""))) ylabel <- paste('λ',"",j,"",sep="") plot1 <- plot_ly()%>% add_trace(x = seq(from = 1 , to = length(x$lambda[,j]) , by = 1), y = x$lambda[,j] , type = 'scatter' , mode = 'lines', line = list(width = width , color = col), showlegend = FALSE)%>% add_trace(x = c(0 , iter), y = rep(x$lambdahat[j],2) , type = 'scatter' , mode = 'lines', line = list(width = width , color = 'red' , dash = "dash"), showlegend = FALSE)%>% plotly::layout( title = list(text = tt, x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = xlab, font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = eval(ylabel), font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) print(plot1) } ## for symmetric location spEM case plots mu if (!is.null(x$symmetric) && x$symmetric){ for (j in 1:m){ estim <- paste(round(x$muhat[j],3)) # tt <- substitute(expression(paste("sequence of ",mu[j], # ", estimate ",widehat(mu[j]),"=",estim,sep=""))) tt <- paste("Sequence of " ,'μ',"",j,"", " (Estimated ","μ","",j,"","=",estim, ")",sep="") # ylabel <- substitute(expression(paste(mu[j],sep=""))) ylabel <- paste('μ',"",j,"",sep="") plot2 <- plot_ly()%>% add_trace(x = seq(from = 1 , to = length(x$mu[,j]) , by = 1), y = x$mu[,j] , type = 'scatter' , mode = 'lines', line = list(width = width , color = col), showlegend = FALSE)%>% add_trace(x = c(0 , iter), y = rep(x$muhat[j],2) , type = 'scatter' , mode = 'lines', line = list(width = width , color = 'red' , dash = "dash"), showlegend = FALSE)%>% plotly::layout( title = list(text = tt, x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = xlab, font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = eval(ylabel), font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) print(plot2) } } }mixtools/R/plotly_ellipse.R0000644000175100001440000000527414343036567015555 0ustar hornikusersplotly_ellipse <- function(mu, sigma, alpha=.05, npoints=250, draw=TRUE, cex = 3, col = "#1f77b4", lwd = 3, title = "", title.x = 0.5, title.y = 0.95, title.size = 15, xlab = "X", xlab.size = 15, xtick.size = 15, ylab = "Y", ylab.size = 15, ytick.size = 15 ) { es <- eigen(sigma) e1 <- es$vec%*%diag(sqrt(es$val)) r1 <- sqrt(qchisq(1-alpha,2)) theta <- seq(0,2*pi,len=npoints) v1 <- cbind(r1*cos(theta),r1*sin(theta)) pts=t(mu-(e1%*%t(v1))) updatemenus <- list( list( x = 1.2, y = 1, visible = TRUE, font = list(size=12), active = 0, type= 'dropdown', buttons = list( list( label = "Show Markers", method = "update", args = list(list(visible = c(TRUE, FALSE , FALSE)))), list( label = "Show Lines", method = "update", args = list(list(visible = c(FALSE , TRUE , FALSE)))), list( label = "Show Lines+Markers", method = "update", args = list(list(visible = c(FALSE , FALSE , TRUE))))) ) ) plot <- plot_ly() %>% add_markers(x=pts[,1] , y=pts[,2] , type = 'scatter' , mode = 'markers' , marker = list(color = col , size = cex) , name = 'Data' , showlegend = FALSE) %>% add_trace(x=pts[,1] , y=pts[,2] , type = 'scatter' , mode = 'lines', line = list(color = col , width = lwd), name = "Data" , showlegend = FALSE) %>% add_trace(x=pts[,1] , y=pts[,2] , type = 'scatter' , mode = 'lines+markers', marker = list(color = col , size = cex), line = list(color = col , width = lwd), name = "Data" , showlegend = FALSE) %>% plotly::layout( updatemenus = updatemenus, title = list(text = title, x = title.x, y = title.y, font = list(size=title.size) ), xaxis = list(title = list(text = xlab, font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = ylab, font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) print(plot) invisible(pts) } mixtools/R/testequality.R0000755000175100001440000000405414342153463015242 0ustar hornikuserstest.equality <- function(y, x = NULL, arbmean=TRUE, arbvar=FALSE, mu=NULL, sigma=NULL, beta=NULL, lambda=NULL,...){ if(arbmean==arbvar) stop("Change either 'arbmean' or 'arbvar'!") if(arbmean==FALSE){ w=1 while(w==1){ if(is.null(x)){ H0=normalmixEM(x=y,arbmean=FALSE,arbvar=TRUE, mu=mu, sigma=sigma, lambda=lambda,...) k=length(H0$lambda) # H1=normalmixEM(x=y,arbmean=TRUE,arbvar=TRUE,lambda=H0$lambda,mu=rep(H0$mu,k)*(1:k),sigma=(H0$scale*H0$sigma),...) H1=normalmixEM(x=y,arbmean=TRUE,arbvar=TRUE,lambda=H0$lambda,mu=NULL,sigma=(H0$scale*H0$sigma),...) D=2*(H1$loglik-H0$loglik) df=k-1 alpha=1-pchisq(D,df=df) } else{ H0=regmixEM(y=y,x=x,arbmean=FALSE,arbvar=TRUE,beta=beta, sigma=sigma, lambda=lambda,...) k=length(H0$lambda) # H1=regmixEM(y=y,x=x,arbmean=TRUE,arbvar=TRUE,lambda=H0$lambda,beta=matrix(rep(H0$beta,k),k)*(1:k),sigma=(H0$scale*H0$sigma),...) H1=regmixEM(y=y,x=x,arbmean=TRUE,arbvar=TRUE,lambda=H0$lambda,beta=NULL,sigma=(H0$scale*H0$sigma),...) p=nrow(H1$beta) D=2*(H1$loglik-H0$loglik) df=p*(k-1) alpha=1-pchisq(D,df=df) } if(D<0){ w=1 mu=NULL sigma=NULL lambda=NULL } else w=2 } } if(arbvar==FALSE){ w=1 while(w==1){ if(is.null(x)){ H0=normalmixEM(x=y,arbmean=TRUE,arbvar=FALSE,mu=mu, sigma=sigma, lambda=lambda,...) k=length(H0$lambda) # H1=normalmixEM(x=y,arbmean=TRUE,arbvar=TRUE,lambda=H0$lambda,mu=H0$mu,sigma=rep(H0$sigma,k),...) H1=normalmixEM(x=y,arbmean=TRUE,arbvar=TRUE,lambda=H0$lambda,mu=H0$mu,sigma=NULL,...) D=2*(H1$loglik-H0$loglik) df=k-1 alpha=1-pchisq(D,df=df) } else{ H0=regmixEM(y=y,x=x,arbmean=TRUE,arbvar=FALSE,beta=beta, sigma=sigma, lambda=lambda,...) k=length(H0$lambda) # H1=regmixEM(y=y,x=x,arbmean=TRUE,arbvar=TRUE,lambda=H0$lambda,beta=H0$beta,sigma=rep(H0$sigma,k),...) H1=regmixEM(y=y,x=x,arbmean=TRUE,arbvar=TRUE,lambda=H0$lambda,beta=H0$beta,sigma=NULL,...) D=2*(H1$loglik-H0$loglik) df=k-1 alpha=1-pchisq(D,df=df) } if(D<0){ w=1 mu=NULL sigma=NULL lambda=NULL } else w=2 } } a=list(chi.sq=D, df=df, p.value=alpha) a }mixtools/R/zzz.R0000755000175100001440000000073714342153463013346 0ustar hornikusers.onAttach <- function(lib, pkg){ info <- packageDescription("mixtools") packageStartupMessage( paste('mixtools package, version ', info$Version, ', Released ', info$Date, '\n', 'This package is based upon work supported by the National Science ', 'Foundation under Grant No. SES-0518772 and ', 'the Chan Zuckerberg Initiative: Essential Open Source Software for ', 'Science (Grant No. 2020-255193).\n', sep="") ) } mixtools/R/parse.constraints.R0000755000175100001440000000242514342153463016165 0ustar hornikusersparse.constraints <- function(constr, k=2, allsame=FALSE) { if (!is.null(constr)) { alpha <- category <- rep(NA, k) u <- sum(is.na(constr)) # Number of unconstrained means category[is.na(constr)] <- 1:u numcon <- as.numeric(constr) # All non-numbers become NA here. category[!is.na(numcon)] <- 0 # These means will remain fixed constants alpha[!is.na(numcon)] <- numcon[!is.na(numcon)] w <- which(is.na(numcon) & !is.na(constr)) # w indexes only character constraints if (length(w)>0) { # Process all the character (equality) constraints constr <- as.character(constr) alpha[w] <- constr[w] nc <- nchar(constr)[w] # nc: number of characters (in each constraint) ss <- substr(constr[w], nc, nc) # extract final character category[w] <- u + match(ss, unique(ss)) # make categories for final characters alpha[w] <- substr(alpha[w], 1, nc-1) # Now extract number before final character alpha[w][alpha[w]=="-"] <- "-1" alpha[w][alpha[w]==""] <- "1" } alpha <- as.numeric(alpha) # Entire alpha vector should be numeric or NA now. } else { alpha <- rep(1,k) if(allsame) category <- alpha else category <- 1:k } list(category=category, alpha=alpha) } mixtools/R/spRMMSEM.R0000644000175100001440000003447614342153463014060 0ustar hornikusers########################################################### # semi-parametric Reliability Mixture Models with Censored data # for 2 components # D. Chauveau # ref: Bordes L. and Chauveau D. Computational Statistics (2016) ########################################################### # Simulate from a lognormal scale mixture # like model (3) in compstat paper # lambda = vector of component probabilities # xi = scaling parameter rlnormscalemix <- function(n, lambda=1, meanlog=1, sdlog=1, scale=0.1) { m <- length(lambda) # nb of components z <- sample(m, n, replace = TRUE, prob = lambda) # component indicator x <- rlnorm(n, meanlog, sdlog) x[z==2] <- x[z==2]/scale x } ############################################## # Kaplan-Meier survival estimate # vectorized version ONLY on ** already ordered data ** # cpd = (n,2) matrix where # cpd[,1] = t = ORDERED censored life data = min(x,c) # cpd[,2] = d = censoring indicator, 1=observed 0=censored # returned value = a step function object allowing to evaluate S() # at any point, needed by SEM for computing S(xi*t_i)'s KMod <- function(cpd, already.ordered=TRUE){ # order stat of t and d ordered accordingly if (already.ordered) { n <- dim(cpd)[1] s <- cumprod(1 - cpd[,2]/(n - (1:n) +1)) stepfun(cpd[,1], c(1,s))} # starts with 1 for t<=t(1) } ############################################## ## KM estimate integration # s = a stepfun object as returned by KMod() # returned value = int_0^max(t_i) S(u)du KMintegrate <- function(s) { ks <- knots(s) n <- length(ks) # number of knots=data points ks2 <- c(0,ks[1:(n-1)]) # shifted right hs <- c(1,s(ks)[1:(n-1)]) # heights of survival sum((ks-ks2)*hs) } ################################################ ### HAZARD RATE SMOOTH KERNEL ESTIMATES ### ################################################ # WKDE with Triangular Kernel and global bandwidth, vectorized # returns vector of K_h(t_i-u_j), j=1,...,length(u) # t = vector of data # u = vector of points at which K(u) is computed # w = weights defaults to 1/n, not forced to be normalized # bw=bandwidth, can be a n-vector or a scalar # nb: this is not specific for hazard rate, just a wkde # NB: triang_wkde is the default wkde called by HRkde() for hazard rate triang_wkde <- function(t, u=t, w=rep(1/length(t),length(t)), bw=rep(bw.nrd0(t),length(t))) { n <- length(t); p <- length(u) xx <- outer(t, u, function(a,b) a-b) # K[i,j] = (t_i-u_j) xx <- abs(xx) # not necessarily for all kernels, separated from outer h <- matrix(bw,n,p) # bw repeated over p columns # works also if a scalar bw is passed! xx <- xx/h # now xx is |t_i-u_j|/h_i K <- (xx <= 1)*(1-xx)/bw # K((t-u)/h)/h mw <- matrix(w, nrow=1) # weights for matrix product as.vector(mw %*% K) } ## Hazard Rate kernel density estimate based on *ordered* censored data # weighted kernel density estimate passed as function argument, # defaults to symmetric triangle kernel # cpd = (n,2) matrix where # cpd[,1] = t = ORDERED censored life data = min(x,c) # cpd[,2] = d = censoring indicator, 1=observed 0=censored # u = vector of points at which alpha() is evaluated, # defaults to t itself # bw = bandwidth *vector* for the kernel density estimate # kernelft = kernel definition # return value = alpha(.) evaluated at u_j's # NB: ordered data are necessary from weights definitions # (n-i+1) items at risk etc HRkde <- function(cpd, u = cpd[,1], kernelft = triang_wkde, bw = rep(bw.nrd0(as.vector(cpd[,1])), length(cpd[,1]))){ # gaussian case (not recommended) # if (kernelft==gaussian) HRkdeGauss(cpd,u,bw) else { n <- length(cpd[,1]) aw <- cpd[,2]/(n - (1:n) +1) # weights d(i)/(n-i+1) kernelft(cpd[,1], u, w=aw, bw=bw) # old, non vectorized version (deprecated) # nu <- length(u) # hr <- rep(0,nu) # for (k in 1:nu) { # K <- kernelft(cpd[,1], u[k], bw) # hr[k] <- sum(K*aw) # } # } # hr } ################################################################# ################################################################# ## Stochastic EM algorithm for semiparametric Scaling ## Reliability Mixture Models (RMM) with Censoring, 2 components # t = lifetime data, censored by random c if d is not NULL, in which case # t = min(x,c) and d = I(x <= c) # rate = scaling parameter # centers = initial centers for initial call to kmeans # averaged = TRUE if averaging performed at each iteration (cf Nielsen 2000) # NB: averaging can be done in (at least) 2 ways; # here the current theta for E & M steps is the average over the sequence, # but the theta^next not averaged is stored on the sequence # batchsize = number of last iterations to use for "averaging" unscaled samples # for computing "average" final KM and HR estimates # alpha() and S() # kernelft = kernel used in HRkde for hazard rate nonparametric estimate # # NB: since the sequence of parameters is a stoch. process, the # stopping criterion is usually not satisfied until maxit spRMM_SEM <- function (t, d = NULL, lambda = NULL, scaling = NULL, centers = 2, kernelft = triang_wkde, bw = rep(bw.nrd0(t),length(t)), averaged = TRUE, epsilon = 1e-08, maxit = 100, batchsize = 1, verb = FALSE) { k = 2 # fixed number of components for this model identifiability n <- length(t) if (is.null(d)) { d <- rep(1,n) # but better use specific algo for noncensored data cat("warning: undefined censoring indicator d replaced by 1's") cat(" i.e. all data are assumed observed") cat(" better use instead a specific St-EM algorithm for uncensored data") } ##### Initializations ##### # init function call to do later, in case lambda = scaling = NULL if (is.null(lambda)) lambda <- rep(1/k,k) # not USED for init!? if (is.null(scaling)) scaling <- 1/2 # ToDo better init using centers fro kmeans! # sequences for storing along iterations lambda_seq <- matrix(0, nrow = maxit, ncol = k) lambda_seq[1,] <- lambda scaling_seq <- rep(0,maxit) scaling_seq[1] <- scaling sumNaNs <- 0 # for total nb of NaN's in iterations while computing post # dll <- epsilon+1 # not applicable for SEM versions, always run maxit post <- z <- sumpost <- posthat <- matrix(0, nrow = n, ncol = k) qt=round(maxit/10); pc <- 0 # for printing of % of iteration done if (qt == 0) qt <- 1 # initialization for batch storing if (batchsize > maxit) batchsize <- maxit batch_t <- NULL # for storing batchsize last unscaled samples batch_d <- NULL # and associated event indicators # kmeans method for initial posterior and z matrix kmeans <- kmeans(t, centers=centers) for(j in 1:k) { z[kmeans$cluster==j, j] <- 1 } # init values for Survival s() and hazard rate a() # strategy: use a M-step with z from kmeans result zt <- z*t # recycling t m times => zt[i,] holds zt[,2] <- scaling*zt[,2] # t if comp 1 and xi*t if comp 2 newt <- rowSums(zt) # redressed "unscaled" sample newo <- order(newt) new.od <- cbind(newt,d)[newo,] # ordered data with associated d s <- KMod(new.od) # stepfun object, can be evaluated by s(t) # note: <=> to use KMsurvfit(newt,d) which calls survival package functions a1 <- HRkde(new.od, t, kernelft, bw=bw) # evaluated at the original t's a2 <- HRkde(new.od, scaling*t, kernelft, bw=bw) # and at scaling*t's ####### SEM iterations ####### iter <- 1 # while (dll > epsilon && iter < maxit) { # EM-only version while (iter < maxit) { ### E-step post[,1] <- ((lambda[1]*a1*s(t))^(d))*((lambda[1]*s(t))^(1-d)) post[,2] <- (lambda[2]*scaling*a2*s(scaling*t))^d # observed post[,2] <- post[,2]*(lambda[2]*s(scaling*t))^(1-d) # censored # print(post) rs <- rowSums(post) # post normalized per row post <- sweep(post, 1, rs, "/") # posteriors p_{ij}^t 's # check and solve NaN's: may cause theoretical pbs!? snans <- sum(is.na(post)) if (snans > 0) { post[is.na(post[,1]),] <- 1/k # NaN's replaced by uniform weights sumNaNs <- sumNaNs + snans if (verb) cat(snans, "NaN's in post: ") } sumpost <- sumpost + post ### S-step # ~ matrix of component indicators simu checked OK z <- t(apply(post, 1, function(prob) rmultinom(1, 1, prob))) # cbind(post,z) # checking simulation zt <- z*t # each row of z is 0,1 hence zt holds {0,t} nsets <- colSums(z) # subsets per component sizes ### M-step for scalar parameters newlambda <- nsets/n # or colMeans(post) if EM strategy preferred! lambda_seq[iter+1, ] <- newlambda # update of the scaling (xi) parameter needs building of KM estimates # from each subsample, and integration of both # ToDo: use parallel on 2 cores to perform each subsample task! tsub1 <- t[z[,1]==1]; tsub2 <- t[z[,2]==1] # t subsamples dsub1 <- d[z[,1]==1]; dsub2 <- d[z[,2]==1] # d subsamples o1 <- order(tsub1); od1 <- cbind(tsub1,dsub1)[o1,] o2 <- order(tsub2); od2 <- cbind(tsub2,dsub2)[o2,] km1 <- KMod(od1); km2 <- KMod(od2) newscaling <- KMintegrate(km1)/KMintegrate(km2) scaling_seq[iter+1] <- newscaling # stored for final plotting if (averaged) { scaling <- mean(scaling_seq[1:(iter+1)]) lambda <- colMeans(lambda_seq[1:(iter+1),]) } else { # averaged=FALSE case, just use last update scaling <- newscaling lambda <- newlambda } ### M-step for nonparametric alpha() and s(): # unscaling the sample and order it, # keeping the associated d censoring indicator zt[,2] <- scaling*zt[,2] # unscale t's from component 2 newt <- rowSums(zt) # "unscaled" sample (sum 0 and t_i or scale*t_i ) newo <- order(newt) new.od <- cbind(newt,d)[newo,] # with associated (unchanged) d s <- KMod(new.od) # stepfun object, can be evaluated by s(t) a1 <- HRkde(new.od, t, kernelft, bw=bw) # evaluated at the original t's a2 <- HRkde(new.od, scaling*t, kernelft, bw=bw) # and at scaling*t's ### batch storage: collecting unscaled samples if (iter >= (maxit - batchsize)) { batch_t <- c(batch_t, newt) batch_d <- c(batch_d, d) cat("-- adding unscaled sample at iteration",iter,"\n") } # change <- c(lambda_seq[iter,] - lambda_seq[iter-1,], # scaling_seq[iter]- scaling_seq[iter-1]) # dll <- max(abs(change)) if (verb) { cat("iteration", iter, ": sizes=", nsets," ") cat("lambda_1=",lambda[1], "scaling=",scaling, "\n") } # printing % done b=round(iter/qt); r=iter-b*qt if (r==0) {pc <- pc+10; cat(pc,"% done\n")} iter <- iter + 1 } ###### end of SEM loops over iterations ###### colnames(post) <- colnames(posthat) <- c(paste("comp", ".", 1:k, sep = "")) lambdahat <- colMeans(lambda_seq[1:iter,]) scalinghat <- mean(scaling_seq[1:iter]) posthat <- sumpost/(iter-1) # average posteriors hazard <- HRkde(new.od, kernelft=kernelft, bw=bw) # at final unscaled sample # Would it be better to return the final unscaled sample?? cat(iter, "iterations: lambda=",lambdahat,", scaling=",scalinghat,"\n") if (sumNaNs > 0) cat("warning: ", sumNaNs,"NaN's occured in posterior computations") ###### FINISHING ###### # ToDo: average over batch set of last unscaled samples # compute average estimates via a S+M-step using posthat etc loglik <- sum(log(rs)) # "sort of" loglik with nonparam densities estimated # mimmics the parametric case, just like npEM does z <- t(apply(posthat, 1, function(prob) rmultinom(1, 1, prob))) zt <- z*t zt[,2] <- scalinghat*zt[,2] avgt <- rowSums(zt) # unscaled sample avgo <- order(avgt) avg.od <- cbind(avgt,d)[avgo,] # with associated d shat <- KMod(avg.od) # stepfun object ahat <- HRkde(avg.od, kernelft=kernelft, bw=bw) # eval at the unscaled ordered avgt a=list(t=t, d=d, lambda=lambdahat, scaling=scalinghat, posterior=post, # final posterior probabilities all.lambda=lambda_seq[1:iter,], # sequence of lambda's all.scaling=scaling_seq[1:iter], # sequence of scale loglik=loglik, # analog to parametric loglik, like npEM meanpost=posthat, # posterior proba averaged over iterations survival=s, # Kaplan-Meier last iter estimate (stepfun object) hazard=hazard, # hazard rate final estimate evaluated at final.t final.t=new.od[,1], # last unscaled sample s.hat=shat, # Kaplan-Meier average estimate t.hat= avg.od[,1], # ordered unscaled sample based on meanpost USEFUL?? avg.od=avg.od, # t.hat with associated d (for computing ahat outside) hazard.hat=ahat, # hazard rate average estimate on t.hat batch.t=batch_t, # batch sample t (not ordered) batch.d=batch_d, # associated event indicators just rep(d,batchsize) sumNaNs = sumNaNs, # total nb of NaN's in iterations while computing post ft="spRMM_SEM") class(a) = "spRMM" return(a) } ############################################## ## plot function for spRMM object : remove lognormal true pdf! # sem = spRMM_SEM object # other are true parameters, if available, for plotting references # ToDo: plot true f and S only if true param availables # pass the true pdf (like dlnorm) as well plotspRMM <- function(sem, tmax = NULL){ t <- sem$t ym <- max(sem$all.scaling) par(mfrow=c(2,2)) plot(sem$all.scaling, type="l", ylim=c(0, ym), xlab="iterations", main="scaling", ylab="") plot(sem$all.lambda[,1], ylim=c(0,1), type="l", xlab="iterations", main="weight of component 1",ylab="") # plots of Kaplan-Meier estimates # finding max time for plots if (is.null(tmax)){tmax <- max(sem$scaling*t) + 2} u <- seq(0, tmax, len=200) plot(sem$survival, xlim=c(0,tmax), ylim=c(0,1), pch=20, verticals=F, do.points=F, xlab="time", main="Survival function estimate") # plot(sem$s.hat, pch=20, verticals=F, do.points=F, col=2, add = TRUE) # pdf estimates fhat <- sem$s.hat(sem$t.hat)*sem$hazard.hat ffinal <- sem$survival(sem$final.t)*sem$hazard plot(sem$final.t, ffinal, type="l", col=1, xlim=c(0,tmax), xlab="time", ylab="density", main="Density estimate") } ## S3 method of summary for class "spRMM" summary.spRMM <- function(object, digits = 6, ...) { sem <- object if (sem$ft != "spRMM_SEM") stop("Unknown object of type ", sem$ft) cat("summary of", sem$ft, "object:\n") o <- matrix(NA, nrow = 2, ncol = 2) o[1,] <- sem$lambda o[2,2] <- sem$scaling colnames(o) <- paste("comp",1:2) rownames(o) <- c("lambda", "scaling") print(o, digits = digits, ...) cat("(pseudo) loglik at estimate: ", sem$loglik, "\n") pcc <- round(100*(1-mean(sem$d)), 2) cat(pcc, "% of the data right censored\n") } mixtools/R/npMSL.R0000644000175100001440000005136114342153463013476 0ustar hornikusers# original version, with weighted Silverman bandwidth unique option # has been improved (mid 2014) by a k-fold CV option # the original version is kept as "npMSL_old" in this file ################################################################ ################################################################ ## nonparametric algorithm for Smoothed Likelihood Maximization ## implementing block structure ## and Silverman adaptive bandwidth ## 2014 additions: loglik stores all the sequence, ## post argument for passing an init matrix of posterior ## bwiter argument for the duration of the adaptive bw stage ## can be set to 0 for keeping an initial bw matrix when samebw=FALSE ################################################################ ################################################################ npMSL_old <- function(x, mu0, blockid = 1:ncol(x), bw=bw.nrd0(as.vector(as.matrix(x))), samebw = TRUE, h=bw, eps=1e-8, maxiter=500, bwiter = maxiter, ngrid=200, post=NULL, verb = TRUE){ bw <- h # h is alternative bandwidth argument, for backward compatibility x <- as.matrix(x) n <- nrow(x) # number of subjects r <- ncol(x) # number of measurements in each subject u <- match(blockid, unique(blockid)) B <- max(u) # nb of blocks BlS <- rep(0,B) # block sizes = C_ell in JCGS paper for (ell in 1:B) { BlS[ell] <- sum(u == ell)} if (is.matrix(mu0)) # mu0=centers m <- dim(mu0)[1] else m <- mu0 # mu0=number of clusters if(!samebw && !is.matrix(bw)) { # create initial bandwidth matrix cat("create initial bandwidth matrix\n") bw <- matrix(bw, nrow=max(u), ncol=m) } z.hat <- matrix(0, nrow = n, ncol = m) tt0 <- proc.time() # for total time ## Initial Values if(m == 1) z.hat <- matrix(1, nrow = n, ncol = m) else if(is.null(post)) { kmeans <- kmeans(x, mu0) for(j in 1:m) z.hat[kmeans$cluster==j, j] <- 1 } else { z.hat <- post ## Currently no error-checking is done here } iter <- 0 finished <- FALSE lambda <- matrix(0, nrow = maxiter, ncol = m) loglik <- NULL; loglikseq <- rep(NA,maxiter) total_udfl <- 0; total_nan <- 0 # eventual NaN and underflow in C code tmp <- 1:n # is this needed? xtra <- (max(x)-min(x))/10 grid <- seq(min(x)-xtra, max(x)+xtra, length=ngrid) # f stored on a ngrid by m by B array # f_{g,j,ell} = f_{j ell}(u_g) # f <- array(1/m/diff(grid[1:2]), c(ngrid, m, B)) # this f was not normalized for being uniform over grid Delta <- diff(grid[1:2]) f <- array(1/((ngrid-1)*Delta), c(ngrid, m, B)) oldloglik <- -Inf orderx <- xx <- list() # preparation for adaptive bandwidth for(k in 1:B) { xx[[k]] <- as.vector(x[, u==k]) if (!samebw) { orderx[[k]] = order(xx[[k]]) # only needed for IQR calculation for bw } } ## CftEstep <- ifelse(samebw, "npMSL_Estep", "npMSL_Estep_bw") #Called directly below # CftEstep <- "npMSL_Estep_bw" # temporary, for testing only the M-step ## CftMstep <- ifelse(samebw, "npMSL_Mstep", "npMSL_Mstep_bw") #Called directly below while (!finished) { # Algorithm main iteration loop iter <- iter + 1 bw.old <- bw # is this needed? t0 <- proc.time() nb_udfl=0; # nb underflows, K()*log(0) ~0 cancelled in nems_Estep.c nb_nan=0; # nb nonzero K()*log(0) cancelled in nems_Estep.c ## Note: Enter loop assuming E-step is done -- i.e., z.hat in place ## M-Step lambda[iter, ] <- colMeans(z.hat) ## density estimation in M-step: WKDE-step cs <- colSums(z.hat) z.tmp <- sweep(z.hat, 2, cs, "/") z.tmp[, cs==0] <- 1/NROW(z.tmp) # Just in case ## adaptive bandwidth update IF in adaptive bw stage if (!samebw && iter <= bwiter) { for (ell in 1:B) { r2 <- BlS[ell] # block size = nb of coordinates wts <- apply(z.tmp, 2, function(z) rep(z/r2, r2)) variances <- colSums(wts*outer(xx[[ell]], colSums(wts*xx[[ell]]),'-')^2) iqr <- apply(as.matrix(wts[orderx[[ell]],]), 2, wIQR, xx[[ell]][orderx[[ell]]], already.sorted=TRUE, already.normalized=TRUE) h <- bw[ell, ] <- 0.9 * pmin(sqrt(variances), iqr/1.34) * pmax(1,r2*n*lambda[iter, ])^(-1/5) # Note: Doesn't allow "sample size" < 1. # browser() } } # end of bw adaptive stage if(samebw){ z <- .C(C_npMSL_Mstep, as.integer(ngrid), as.integer(n), as.integer(m), as.integer(r), as.integer(B), as.integer(BlS), as.integer(u), as.double(bw), as.double(x), as.double(grid), new.f=as.double(f), as.double(lambda[iter,]), as.double(z.hat), PACKAGE = "mixtools") } else{ z <- .C(C_npMSL_Mstep_bw, as.integer(ngrid), as.integer(n), as.integer(m), as.integer(r), as.integer(B), as.integer(BlS), as.integer(u), as.double(bw), as.double(x), as.double(grid), new.f=as.double(f), as.double(lambda[iter,]), as.double(z.hat), PACKAGE = "mixtools") } # z=.C(CftMstep, as.integer(ngrid), as.integer(n), # as.integer(m), as.integer(r), # as.integer(B), as.integer(BlS), as.integer(u), # as.double(bw), as.double(x), as.double(grid), # new.f=as.double(f), # as.double(lambda[iter,]), # as.double(z.hat)) f <- array(z$new.f, c(ngrid, m, B)) # check sum(f == 0) # print(apply(f,2:3,sum) * Delta) # print(max(abs(f-f2))) # browser() ## E-step (for next iteration) if(samebw){ z <- .C(C_npMSL_Estep, as.integer(ngrid), as.integer(n), as.integer(m), as.integer(r), as.integer(B), as.integer(u), as.double(bw), as.double(x), as.double(grid), f=as.double(f), as.double(lambda[iter,]), post=as.double(z.hat), loglik = double(1), nb_udfl = as.integer(nb_udfl), nb_nan = as.integer(nb_nan), PACKAGE = "mixtools") } else{ z <- .C(C_npMSL_Estep_bw, as.integer(ngrid), as.integer(n), as.integer(m), as.integer(r), as.integer(B), as.integer(u), as.double(bw), as.double(x), as.double(grid), f=as.double(f), as.double(lambda[iter,]), post=as.double(z.hat), loglik = double(1), nb_udfl = as.integer(nb_udfl), nb_nan = as.integer(nb_nan), PACKAGE = "mixtools") } # z=.C(CftEstep, as.integer(ngrid), as.integer(n), # as.integer(m), as.integer(r), # as.integer(B), as.integer(u), # as.double(bw), # as.double(x), as.double(grid), f=as.double(f), # as.double(lambda[iter,]), post=as.double(z.hat), # loglik = double(1), # nb_udfl = as.integer(nb_udfl), nb_nan = as.integer(nb_nan)) nb_udfl = z$nb_udfl; nb_nan = z$nb_nan; total_udfl <- total_udfl + nb_udfl total_nan <- total_nan + nb_nan z.hat <- matrix(z$post, n, m) if (sum(is.nan(z.hat)) > 0) cat("Error!! NaN in z.hat") # obsolete ? loglik <- loglikseq[iter] <- z$loglik loglikchange <- loglik - oldloglik oldloglik <- loglik finished <- iter >= maxiter if (iter>1 && max(abs(lambda[iter, ] - lambda[iter-1, ])) < eps) finished <- TRUE if (verb) { t1 <- proc.time() cat("iteration", iter, ": lambda ", round(lambda[iter, ], 4)) cat(" obj function", round(loglik, 4)) cat(" (change", round(loglikchange,4), ")") cat(" time", (t1 - t0)[3]) if ((nb_udfl > 0) || (nb_nan >0)) cat("\n ") if (nb_udfl > 0) cat("average underflows=", round(nb_udfl/(n*m*r),3)," ") if (nb_nan >0) cat("average NaNs=", round(nb_nan/(n*m*r),3)) # Note: these average mean nb of nan over ngrid convolution cat("\n") } } # f <- array(z$f, c(ngrid, m, r)) # obsolete in block version if (!samebw) { rownames(bw) <- paste("block", 1:max(u)) colnames(bw) <- paste("component", 1:m) } if (verb) { tt1 <- proc.time() cat("lambda ", round(lambda[iter, ], 4)) cat(", total time", (tt1 - tt0)[3], "s\n") } return(structure(list(data = x, posteriors = z.hat, lambda = lambda[1:iter,], bandwidth = bw, blockid = u, lambdahat = lambda[iter,], f=f, grid = grid, loglik = loglikseq[1:iter], meanUdfl = total_udfl/(n*m*r*iter),# average underflow meanNaN = total_nan/(n*m*r*iter)), # average NaN's class="npEM")) # define a "npMSL" class ? } ## updated late 2014 version ##################################################################### ##################################################################### ## nonparametric algorithm for Smoothed Likelihood Maximization ## implementing block structure ## 2014 latests additions: ## option for Silverman & weighted k-fold CV adaptive bandwidth: ## parameter bwmethod = "S" for Silverman's rule (the default), ## "CV" for Cross-Validation ## loglik now stores all the sequence ## post argument for passing an init matrix of posterior ## bwiter argument for the duration of the adaptive bw stage ## can be set to 0 for keeping an initial bw matrix when samebw=FALSE ###################################################################### ###################################################################### ## preliminary function for computing the weighted version of ## k-fold Cross-Validation # Splitting 1:n in nbsets subsets and return indices # n = total sample size # setsize = size of sets # nseq = explicit 1st and last indices splitsample <- function(n, nbsets=2) { k <- floor(n/nbsets) klast <- n - (nbsets-1)*k setsize <- c(rep(k, nbsets-1), klast) # n per set if (sum(setsize) != n) {cat("warning")} ni <- c(1,cumsum(setsize)+1) # indices for splitting nseq <- matrix(NA, nrow=nbsets, ncol=2) for (j in 1:nbsets) { nseq[j,1] <- ni[j] # 1st index for jth set nseq[j,2] <- ni[j+1]-1 # last index for jth set } a = list(setsize=setsize, nseq=nseq) return(a) } ## computes CV(h) in k-fold CV case # h = bandwidth (first argument for optimizing) # x = sample of data, vector # nbsets = number of folds # w = weights # lower, upper = numerical integration limits, data-driven defaults kfoldCV <- function(h, x, nbsets=2, w = rep(1, length(x)), lower=mean(x)-5*sd(x), upper=mean(x)+5*sd(x)) { n <- length(x) fold <- splitsample(n, nbsets) sumf <- 0 for (k in 1:nbsets) { Sk <- fold$nseq[k,1]:fold$nseq[k,2] # indices of set k learnset <- x[-Sk] # obs not in set k, from which f_h is "learned" evalset <- x[Sk] fk <- wkde(x = learnset, u = evalset, w = w[-Sk], bw = h) sumf <- sumf + sum(fk) } integrand <- function(u,...) {wkde(x, u, bw=h)^2} # computing ||f_h||^2 fh2 <- integrate(integrand, lower=lower, upper=upper)$value return(fh2 - 2*sumf/n) } ## Weighted bw selection by k-fold CV #### ## min search done by call to optimize # x = vector of data # w = weights, defaults to 1, unnormalized wbw.kCV <- function(x, nbfold=5, w = rep(1, length(x)), hmin=0.1*hmax, hmax=NULL) { n <- length(x) if (is.null(hmax)) hmax <- 1.144 * sqrt(var(x))*n^(-1/5) # default hmax as in bw.ucv # computing lower and upper integration limits for ||fh||^2 wm <- weighted.mean(x, w) lowerf <- wm - 5*sd(x); upperf <- wm + 5*sd(x) # maybe use a weighted.sd version as well? fucv <- function(h) kfoldCV(h, x, nbsets=nbfold, w=w, lower=lowerf, upper=upperf) hopt <- optimize(fucv, lower = hmin, upper = hmax)$minimum return(hopt) } ##################################################################### ##################################################################### ## nonparametric algorithm for Smoothed Likelihood Maximization ## implementing block structure ## 2014 latests additions: ## option for Silverman & weighted k-fold CV adaptive bandwidth: ## parameter bwmethod = "S" for Silverman's rule (the default), ## "CV" for Cross-Validation ## loglik now stores all the sequence ## post argument for passing an init matrix of posterior ## bwiter argument for the duration of the adaptive bw stage ## nbfold parameter passed to wbw.kCV, for leave-[n/nbfold]-out CV ## can be set to 0 for keeping an initial bw matrix when samebw=FALSE ###################################################################### ###################################################################### # ToDo: add a nbfold parameter passed to wbw.kCV npMSL <- function(x, mu0, blockid = 1:ncol(x), bw=bw.nrd0(as.vector(as.matrix(x))), samebw = TRUE, bwmethod = "S", h=bw, eps=1e-8, maxiter=500, bwiter = maxiter, nbfold = NULL, ngrid=200, post=NULL, verb = TRUE){ bw <- h # h is alternative bandwidth argument, for backward compatibility x <- as.matrix(x) n <- nrow(x) # number of subjects r <- ncol(x) # number of measurements in each subject u <- match(blockid, unique(blockid)) B <- max(u) # nb of blocks BlS <- rep(0,B) # block sizes = C_ell in JCGS paper for (ell in 1:B) { BlS[ell] <- sum(u == ell)} if (is.matrix(mu0)) # mu0=centers m <- dim(mu0)[1] else m <- mu0 # mu0 = number of clusters if(!samebw && !is.matrix(bw)) { # create initial bandwidth matrix h_lj bw <- matrix(bw, nrow=max(u), ncol=m)} z.hat <- matrix(0, nrow = n, ncol = m) tt0 <- proc.time() # for total time ## Initial Values if(m == 1) z.hat <- matrix(1, nrow = n, ncol = m) else if(is.null(post)) { kmeans <- kmeans(x, mu0) for(j in 1:m) z.hat[kmeans$cluster==j, j] <- 1 } else { z.hat <- post ## Currently no error-checking is done here } if (is.null(nbfold) && bwmethod == "CV") {nbfold <- 5} # default value for nbfold-CV iter <- 0 finished <- FALSE lambda <- matrix(0, nrow = maxiter, ncol = m) loglik <- NULL loglikseq <- rep(NA,maxiter) total_udfl <- 0; total_nan <- 0 # eventual NaN and underflow in C code tmp <- 1:n xtra <- (max(x)-min(x))/10 grid <- seq(min(x)-xtra, max(x)+xtra, length=ngrid) # f stored on a ngrid by m by B array # f_{g,j,ell} = f_{j ell}(u_g) # f <- array(1/m/diff(grid[1:2]), c(ngrid, m, B)) # this f was not normalized for being uniform over grid Delta <- diff(grid[1:2]) f <- array(1/((ngrid-1)*Delta), c(ngrid, m, B)) oldloglik <- -Inf orderx <- xx <- list() # preparation for Silverman adaptive bandwidth for(k in 1:B) { xx[[k]] <- as.vector(x[, u==k]) # data pooled from kth block if (!samebw && bwmethod == "S") { orderx[[k]] = order(xx[[k]]) # only needed for IQR calculation for bw } } ## CftEstep <- ifelse(samebw, "npMSL_Estep", "npMSL_Estep_bw") #Called directly below. # CftEstep <- "npMSL_Estep_bw" # temporary, for testing only the M-step ## CftMstep <- ifelse(samebw, "npMSL_Mstep", "npMSL_Mstep_bw") #Called directly below. while (!finished) { iter <- iter + 1 bw.old <- bw # is this needed? t0 <- proc.time() nb_udfl=0; # nb of underflows log(0) cancelled in nems_Estep.c nb_nan=0; # nb of nonzero K()*log(0) cancelled in nems_Estep.c ## Note: Enter loop assuming E-step is done i.e., z.hat in place ## M-Step lambda[iter, ] <- colMeans(z.hat) ## density estimation in M-step: WKDE-step cs <- colSums(z.hat) z.tmp <- sweep(z.hat, 2, cs, "/") z.tmp[, cs==0] <- 1/NROW(z.tmp) # Just in case ## adaptive bandwidth update - depends on bwmethod and adptbw stage duration in this version if (!samebw && iter <= bwiter) { # adaptive Silverman's rule if (bwmethod == "S") { for (ell in 1:B) { # for each block r2 <- BlS[ell] # block size = nb of coordinates wts <- apply(z.tmp, 2, function(z) rep(z/r2, r2)) variances <- colSums(wts*outer(xx[[ell]], colSums(wts*xx[[ell]]),'-')^2) iqr <- apply(as.matrix(wts[orderx[[ell]],]), 2, wIQR, xx[[ell]][orderx[[ell]]], already.sorted=TRUE, already.normalized=TRUE) h <- bw[ell, ] <- 0.9 * pmin(sqrt(variances), iqr/1.34) * pmax(1,r2*n*lambda[iter, ])^(-1/5) # Note: Doesn't allow "sample size" < 1. } } # adaptive nbfold CV computation, nbfold=5 by default if (bwmethod == "CV") { # k-fold CV for (ell in 1:B) { # for each block r2 <- BlS[ell] # block size = nb of coordinates wts <- apply(z.tmp, 2, function(z) rep(z, r2)) # replicate weights for (j in 1:m) bw[ell,j] <- wbw.kCV(xx[[ell]], nbfold = nbfold, w = wts[,j]) } } # end of CV version } # end of bw adaptive stage if(samebw){ z <- .C(C_npMSL_Mstep, as.integer(ngrid), as.integer(n), as.integer(m), as.integer(r), as.integer(B), as.integer(BlS), as.integer(u), as.double(bw), as.double(x), as.double(grid), new.f=as.double(f), as.double(lambda[iter,]), as.double(z.hat), PACKAGE = "mixtools") } else{ z <- .C(C_npMSL_Mstep_bw, as.integer(ngrid), as.integer(n), as.integer(m), as.integer(r), as.integer(B), as.integer(BlS), as.integer(u), as.double(bw), as.double(x), as.double(grid), new.f=as.double(f), as.double(lambda[iter,]), as.double(z.hat), PACKAGE = "mixtools") } # z=.C(CftMstep, as.integer(ngrid), as.integer(n), # as.integer(m), as.integer(r), # as.integer(B), as.integer(BlS), as.integer(u), # as.double(bw), as.double(x), as.double(grid), # new.f=as.double(f), # as.double(lambda[iter,]), # as.double(z.hat)) f <- array(z$new.f, c(ngrid, m, B)) # check sum(f == 0) # print(apply(f,2:3,sum) * Delta) # print(max(abs(f-f2))) # browser() ## E-step (for next iteration) if(samebw){ z <- .C(C_npMSL_Estep, as.integer(ngrid), as.integer(n), as.integer(m), as.integer(r), as.integer(B), as.integer(u), as.double(bw), as.double(x), as.double(grid), f=as.double(f), as.double(lambda[iter,]), post=as.double(z.hat), loglik = double(1), nb_udfl = as.integer(nb_udfl), nb_nan = as.integer(nb_nan), PACKAGE = "mixtools") } else{ z <- .C(C_npMSL_Estep_bw, as.integer(ngrid), as.integer(n), as.integer(m), as.integer(r), as.integer(B), as.integer(u), as.double(bw), as.double(x), as.double(grid), f=as.double(f), as.double(lambda[iter,]), post=as.double(z.hat), loglik = double(1), nb_udfl = as.integer(nb_udfl), nb_nan = as.integer(nb_nan), PACKAGE = "mixtools") } # z=.C(CftEstep, as.integer(ngrid), as.integer(n), # as.integer(m), as.integer(r), # as.integer(B), as.integer(u), # as.double(bw), # as.double(x), as.double(grid), f=as.double(f), # as.double(lambda[iter,]), post=as.double(z.hat), # loglik = double(1), # nb_udfl = as.integer(nb_udfl), nb_nan = as.integer(nb_nan)) nb_udfl = z$nb_udfl; nb_nan = z$nb_nan; total_udfl <- total_udfl + nb_udfl total_nan <- total_nan + nb_nan z.hat <- matrix(z$post, n, m) if (sum(is.nan(z.hat)) > 0) cat("Error!! NaN in z.hat") # obsolete ? loglik <- loglikseq[iter] <- z$loglik loglikchange <- loglik - oldloglik oldloglik <- loglik finished <- iter >= maxiter if (iter>1 && max(abs(lambda[iter, ] - lambda[iter-1, ])) < eps) finished <- TRUE if (verb) { t1 <- proc.time() cat("iteration", iter, ": lambda ", round(lambda[iter, ], 4)) cat(" obj change", round(loglikchange,4)) cat(" time", (t1 - t0)[3]) if ((nb_udfl > 0) || (nb_nan >0)) cat("\n ") if (nb_udfl > 0) cat("average underflows=", round(nb_udfl/(n*m*r),3)," ") if (nb_nan >0) cat("average NaNs=", round(nb_nan/(n*m*r),3)) # Note: average nb of nan over ngrid convolution cat("\n") } } # f <- array(z$f, c(ngrid, m, r)) # obsolete in block version if (!samebw) { rownames(bw) <- paste("block", 1:max(u)) colnames(bw) <- paste("component", 1:m) } if (verb) { tt1 <- proc.time() cat("lambda ", round(lambda[iter, ], 4)) cat(", total time", (tt1 - tt0)[3], "s\n") } return(structure(list(data = x, posteriors = z.hat, lambda = lambda[1:iter,], bandwidth = bw, blockid = u, lambdahat = lambda[iter,], f=f, grid = grid, loglik = loglikseq[1:iter], meanUdfl = total_udfl/(n*m*r*iter),# average underflow meanNaN = total_nan/(n*m*r*iter)), # average NaN's class="npEM")) # should we define a "npMSL" class ? } mixtools/R/gammamixEM.R0000755000175100001440000002037614343151770014534 0ustar hornikusersgammamixEM <- function(x, lambda = NULL, alpha = NULL, beta = NULL, k = 2, mom.start = TRUE, fix.alpha = FALSE, epsilon = 1e-08, maxit = 1000, maxrestarts = 20, verb = FALSE){ if(!is.null(alpha) & is.numeric(fix.alpha)) stop(paste("Both alpha and fix.alpha cannot be numeric!", "\n")) if(!is.null(lambda)|!is.null(beta)) k <- max(length(lambda),length(beta)) x <- as.vector(x) y <- x^(1/3) n <- length(x) if(is.logical(fix.alpha)&(fix.alpha==FALSE)){ cond <- 1 } else if(is.logical(fix.alpha)&(fix.alpha==TRUE)){ cond <- 2 } else cond <- 3 fn.alpha <- function(alpha,beta,z,x) log(beta)+sum(z*log(x))/sum(z)-digamma(alpha) fn.alpha.2 <- function(alpha,beta,z,x) (log(beta)+sum(z*log(x))/sum(z)-digamma(alpha))^2 fn.beta <- function(z,x,alpha) sum(z)/sum(z*x)*alpha fn.alpha2 <- function(alpha,beta,z,x) sum(z%*%cbind(log(beta)))/length(x)+sum(t(z)%*%cbind(log(x)))/length(x)-digamma(alpha) fn.alpha2.2 <- function(alpha,beta,z,x) (sum(z%*%cbind(log(beta)))/length(x)+sum(t(z)%*%cbind(log(x)))/length(x)-digamma(alpha))^2 if(mom.start){ out <- try(normalmixEM(y,k=k,maxit=5000,epsilon=1e-5,maxrestarts=10),silent=TRUE) if(inherits(out, "try-error", which = TRUE)){ tmp <- gammamix.init(x = x, lambda = lambda, alpha = alpha, beta = beta, k = k) } else{ z <- out$posterior wt.mean <- sapply(1:k,function(i) weighted.mean(x,w=z[,i])) wt.var <- sapply(1:k,function(i) sum(z[,i] * (x - wt.mean[i])^2)/((n-1)*sum(z[,i])/n)) shape.mom <- wt.mean^2/wt.var scale.mom <- wt.var/wt.mean shape.mle <- try(sapply(1:k, function(i) uniroot(fn.alpha,interval=c(0.000001,1000000),beta=1/scale.mom[i],z=z[,i],x=x)$root),silent=TRUE) if(inherits(shape.mle, "try-error", which = TRUE)) shape.mle <- sapply(1:k, function(i) nlminb(shape.mom[i],fn.alpha.2,lower=0,beta=1/scale.mom[i],z=z[,i],x=x)$par) scale.mle <- sapply(1:k, function(i) 1/fn.beta(z=z[,i],x=x,alpha=shape.mle[i])) lambda.mle <- apply(z,2,mean) tmp <- list(lambda=lambda.mle,alpha=scale.mle,beta=shape.mle) } } else tmp <- gammamix.init(x = x, lambda = lambda, alpha = alpha, beta = beta, k = k) lambda.mle <- tmp$lambda scale.mle <- tmp$beta if(cond==2){ shape.mle <- rep(mean(tmp$alpha),k) } else if(cond==1){ shape.mle <- tmp$alpha } else shape.mle <- rep(fix.alpha,k) dens <- function(x, lambda, alpha, beta) { k <- length(lambda) temp = sapply(1:k, function(j) dgamma(x, shape = alpha[j], scale = beta[j])) temp = t(lambda * t(temp)) temp } iter <- 0 mr <- 0 diff <- epsilon + 1 dens1 <- dens(x=x, lambda=lambda.mle, alpha=shape.mle, beta=scale.mle) old.obs.ll <- sum(log(apply(dens1, 1, sum))) ll <- old.obs.ll if(cond==1){ while (diff > epsilon && iter < maxit) { old.shape.mle <- shape.mle old.scale.mle <- scale.mle old.lambda.mle <- lambda.mle z <- dens1/apply(dens1, 1, sum) #M-step shape.mle <- try(sapply(1:k, function(i) uniroot(fn.alpha,interval=c(0.000001,10000),beta=1/old.scale.mle[i],z=z[,i],x=x)$root),silent=TRUE) if(inherits(shape.mle, "try-error", which = TRUE)) shape.mle <- sapply(1:k, function(i) nlminb(old.shape.mle[i],fn.alpha.2,lower=0,beta=1/scale.mle[i],z=z[,i],x=x)$par) scale.mle <- sapply(1:k, function(i) 1/fn.beta(z=z[,i],x=x,alpha=shape.mle[i])) lambda.mle <- apply(z,2,mean) dens1 <- dens(x=x, lambda=lambda.mle, alpha=shape.mle, beta=scale.mle) new.obs.ll <- sum(log(apply(dens1, 1, sum))) diff <- new.obs.ll - old.obs.ll old.obs.ll <- new.obs.ll ll <- c(ll, old.obs.ll) iter = iter + 1 if (verb) { cat("iteration =", iter, " log-lik diff =", diff, " log-lik =", new.obs.ll, "\n") } if(is.na(diff)){ cat("Note: Choosing new starting values.", "\n") if (mr == maxrestarts) stop(paste("Try different number of components?", "\n")) mr <- mr + 1 tmp <- gammamix.init(x = x, lambda = lambda, alpha = alpha, beta = beta, k = k) lambda.mle <- tmp$lambda if(cond==2){ shape.mle <- rep(mean(tmp$alpha),k) } else if(cond==1){ shape.mle <- tmp$alpha } else shape.mle <- rep(fix.alpha,k) scale.mle <- tmp$beta iter <- 0 diff <- epsilon + 1 dens1 <- dens(x=x, lambda=lambda.mle, alpha=shape.mle, beta=scale.mle) old.obs.ll <- sum(log(apply(dens1, 1, sum))) ll <- old.obs.ll } } } else if(cond==2){ while (diff > epsilon && iter < maxit) { old.shape.mle <- shape.mle old.scale.mle <- scale.mle old.lambda.mle <- lambda.mle z <- dens1/apply(dens1, 1, sum) #M-step shape.mle <- try(rep(uniroot(fn.alpha2,interval=c(0.000001,10000),beta=1/old.scale.mle,z=z,x=x)$root,k),silent=TRUE) if(inherits(shape.mle, "try-error", which = TRUE)) shape.mle <- rep(nlminb(old.shape.mle[1],fn.alpha2,lower=0,beta=1/old.scale.mle,z=z,x=x)$par,k) scale.mle <- sapply(1:k, function(i) 1/fn.beta(z=z[,i],x=x,alpha=shape.mle[1])) lambda.mle <- apply(z,2,mean) dens1 <- dens(x=x, lambda=lambda.mle, alpha=shape.mle, beta=scale.mle) new.obs.ll <- sum(log(apply(dens1, 1, sum))) diff <- new.obs.ll - old.obs.ll old.obs.ll <- new.obs.ll ll <- c(ll, old.obs.ll) iter = iter + 1 if (verb) { cat("iteration =", iter, " log-lik diff =", diff, " log-lik =", new.obs.ll, "\n") } if(is.na(diff)){ cat("Note: Choosing new starting values.", "\n") if (mr == maxrestarts) stop(paste("Try different number of components?", "\n")) mr <- mr + 1 tmp <- gammamix.init(x = x, lambda = lambda, alpha = alpha, beta = beta, k = k) lambda.mle <- tmp$lambda if(cond==2){ shape.mle <- rep(mean(tmp$alpha),k) } else if(cond==1){ shape.mle <- tmp$alpha } else shape.mle <- rep(fix.alpha,k) scale.mle <- tmp$beta iter <- 0 diff <- epsilon + 1 dens1 <- dens(x=x, lambda=lambda.mle, alpha=shape.mle, beta=scale.mle) old.obs.ll <- sum(log(apply(dens1, 1, sum))) ll <- old.obs.ll } } } else{ while (diff > epsilon && iter < maxit) { old.scale.mle <- scale.mle old.lambda.mle <- lambda.mle z <- dens1/apply(dens1, 1, sum) #M-step scale.mle <- sapply(1:k, function(i) 1/fn.beta(z=z[,i],x=x,alpha=shape.mle[1])) lambda.mle <- apply(z,2,mean) dens1 <- dens(x=x, lambda=lambda.mle, alpha=shape.mle, beta=scale.mle) new.obs.ll <- sum(log(apply(dens1, 1, sum))) diff <- new.obs.ll - old.obs.ll old.obs.ll <- new.obs.ll ll <- c(ll, old.obs.ll) iter = iter + 1 if (verb) { cat("iteration =", iter, " log-lik diff =", diff, " log-lik =", new.obs.ll, "\n") } if(is.na(diff)){ cat("Note: Choosing new starting values.", "\n") if (mr == maxrestarts) stop(paste("Try different number of components or different value for the fixed shape parameter?", "\n")) mr <- mr + 1 tmp <- gammamix.init(x = x, lambda = lambda, alpha = alpha, beta = beta, k = k) lambda.mle <- tmp$lambda if(cond==2){ shape.mle <- rep(mean(tmp$alpha),k) } else if(cond==1){ shape.mle <- tmp$alpha } else shape.mle <- rep(fix.alpha,k) scale.mle <- tmp$beta iter <- 0 diff <- epsilon + 1 dens1 <- dens(x=x, lambda=lambda.mle, alpha=shape.mle, beta=scale.mle) old.obs.ll <- sum(log(apply(dens1, 1, sum))) ll <- old.obs.ll } } } if (iter == maxit) { cat("WARNING! NOT CONVERGENT!", "\n") } cat("number of iterations=", iter, "\n") theta = rbind(shape.mle, scale.mle) rownames(theta) = c("alpha", "beta") colnames(theta) = c(paste("comp", ".", 1:k, sep = "")) a = list(x = x, lambda = lambda.mle, gamma.pars = theta, loglik = new.obs.ll, posterior = z, all.loglik = ll, ft = "gammamixEM") class(a) = "mixEM" a } mixtools/R/plotMCMC.R0000755000175100001440000000232214342153463014117 0ustar hornikusersplot.mixMCMC <- function(x, trace.plots = TRUE, summary.plots = FALSE, burnin = 2000, ...){ mix.object <- x if (!inherits(mix.object, "mixMCMC")) stop("Use only with \"mixMCMC\" objects!") if(trace.plots==TRUE){ k<-mix.object$components theta<-mix.object$theta p.k=ncol(theta) p=p.k/k name.theta<-colnames(theta) par(mfrow=c(p,k)) for(i in 1:p){ for(j in 1:k){ plot(theta[,(i-1)*k+j],type="l",ylab=name.theta[(i-1)*k+j]) } } } #regmixMH if(is.matrix(mix.object$x) == TRUE && is.null(mix.object$y) == FALSE && summary.plots == TRUE){ y<-mix.object$y n<-length(y) x<-mix.object$x p<-ncol(x) k<-mix.object$components theta<-mix.object$theta if(p!=2 || sum(x[,1])!=n){ stop(paste("This only works for simple linear regression!","\n")) } par(mfrow=c(1,1)) plot(x[,2],y,main="Credible Regions",xlab="Predictor",ylab="Response") #plot(theta[-c(1:burnin),seq(1,2*k-1,by=2)],theta[-c(1:burnin),seq(2,2*k,by=2)],col=0) for(i in 1:k){ #points(theta[-c(1:burnin),2*i-1],theta[-c(1:burnin),2*i],col=(i+1)) regcr(beta=cbind(theta[-c(1:burnin),2*i-1],theta[-c(1:burnin),2*i]),col=(i+1), x=x[,2], plot=TRUE,...) } } } mixtools/R/makemultdata.R0000755000175100001440000000227414342153463015160 0ustar hornikusersmakemultdata = function (..., cuts) { temp = sapply(list(...), length) m = max(temp) g <- length(cuts) + 1 cuts <- sort(cuts) if (sum(temp != m) > 0) { full.data <- function(x, maxm) { if (!missing(x)) { if (length(x) < maxm) { x <- c(x, NA * rep(1, maxm - length(x))) } } else { x <- numeric(0) } x } x = sapply(list(...), full.data, maxm = m) } else { if (sapply(list(...), is.matrix) == 1 | sapply(list(...), is.data.frame) == 1) { x = t(...) } else x = cbind(...) } cutfunc <- function(x, lcut, ucut) { x <- na.omit(x) sum((x <= ucut) * (x > lcut)) } n <- ncol(x) y <- matrix(0, g, n) y[1, ] <- apply(x, 2, cutfunc, ucut = cuts[1], lcut = -Inf) y[g, ] <- apply(x, 2, cutfunc, ucut = Inf, lcut = cuts[g - 1]) if (g > 2) { for (i in 2:(g - 1)) { y[i, ] <- apply(x, 2, cutfunc, ucut = cuts[i], lcut = cuts[i - 1]) } } list(x = t(x), y = t(y)) }mixtools/R/kernT.R0000755000175100001440000000007614342153463013570 0ustar hornikuserskern.T <- function (x, xi, h) { (1-abs((xi-x)/h))/h } mixtools/R/segregmixinit.R0000755000175100001440000000606214342153463015364 0ustar hornikuserssegregmix.init <- function (y, x, lambda = NULL, beta = NULL, s = NULL, k = 2, seg.Z, psi, psi.locs = NULL) { n <- length(y) p <- ncol(x) psi.counts <- apply(psi>0,1,sum) if(is.null(lambda)|is.null(beta)|is.null(s)|is.null(psi.locs)){ if (is.null(psi.locs)) { psi.locs = vector("list",k) psi.locs = lapply(1:k, function(i) if(psi.counts[i]>0) vector("list",psi.counts[i]) else NULL) for(i in 1:k){ if(!is.null(psi.locs[[i]])){ temp.locs <- which(psi[i,]>0) temp.labs=NULL for(j in 1:length(temp.locs)){ psi.locs[[i]][[j]]=sort(runif(psi[i,temp.locs[j]],as.numeric(quantile(x[,temp.locs[j]],.05)),as.numeric(quantile(x[,temp.locs[j]],.95)))) temp.labs=c(temp.labs,colnames(x)[temp.locs[j]]) } names(psi.locs[[i]])=temp.labs } } } else k = length(psi.locs) xnam <- colnames(x) fmla <- as.formula(paste("y ~ ", paste(xnam, collapse= "+"))) TEMP.lm <- lm(fmla,data=x) EM.out <- regmixEM(TEMP.lm$res,TEMP.lm$fit,k=k,epsilon=1e-2) posts = apply(EM.out$post,1,which.max) if (is.null(lambda)) { lambda = EM.out$lambda if(length(unique(posts))!=k) posts=rep(1:k,n)[1:n] } else k = length(lambda) A = round(lambda * n) while (min(A) <= 4) { lambda = runif(k) lambda = lambda/sum(lambda) A = round(lambda * n) } w = cbind(y, x) w.bin = list() for (j in 1:k) { w.bin[[j]] <- w[posts==j, ] } all.w.bin=vector("list",gamma(k+1)) all.inds=perm(k,k) all.X.aug=all.w.bin all.lm.out=all.w.bin avg.res=NULL for(j in 1:length(all.w.bin)){ all.w.bin[[j]]=w.bin[all.inds[j,]] X.aug <- lapply(1:k, function(i) cbind(1,aug.x(w.bin[[all.inds[j,i]]][,-1],unlist(psi.locs[[i]]),psi[i,],delta=NULL))) sapply(X.aug,dim) lm.out <- lapply(1:k, function(i) lm(w.bin[[all.inds[j,i]]][, 1] ~ X.aug[[i]][,-1])) all.X.aug[[j]]=X.aug all.lm.out[[j]]=lm.out avg.res=c(avg.res,mean(as.vector(unlist(lapply(1:k,function(t) lm.out[[t]]$res)))^2)) } IND=which.min(avg.res) w.bin=all.w.bin[[IND]] X.aug=all.X.aug[[IND]] lm.out=all.lm.out[[IND]] s.hyp = lapply(lm.out, anova) s.hyp = as.vector(sqrt(sapply(1:k, function(i) tail(s.hyp[[i]]$Mean,1)))) s.hyp[(s.hyp <= 0) | (is.na(s.hyp) == 1)] = 1 if (is.null(s)) { s = 1/rexp(k, rate = s.hyp) } else k = length(s) if (is.null(beta)) { x.x <- lapply(1:k,function(i) try(solve(t(X.aug[[i]]) %*% X.aug[[i]]),silent=TRUE)) test <- sum(sapply(1:k, function(i) class(x.x[[i]])[1]=="try-error")) if(test>0) stop("Lapack Routine Error") beta.hyp = lapply(lm.out,coef) # matrix(sapply(lm.out, coef), ncol = k) beta = vector("list",k) for (j in 1:k) { beta[[j]] = rnorm(length(beta.hyp[[j]]),mean=as.vector(beta.hyp[[j]]), sd = (s.hyp[j] * sqrt(diag(x.x[[j]])))) } } else k = length(beta) } else{ for(i in 1:k){ if(!is.null(psi.locs[[i]])){ temp.locs <- which(psi[i,]>0) temp.labs=NULL for(j in 1:length(temp.locs)){ temp.labs=c(temp.labs,colnames(x)[temp.locs[j]]) } names(psi.locs[[i]])=temp.labs } } } list(lambda = lambda, beta = beta, s = s, k = k, psi.locs = psi.locs) } mixtools/R/segregmixEM.R0000755000175100001440000002763714343155175014740 0ustar hornikuserssegregmixEM=function (y, x, lambda = NULL, beta = NULL, sigma = NULL, k = 2, seg.Z, psi, psi.locs = NULL, delta = NULL, epsilon = 1e-08, maxit = 10000, verb = FALSE, max.restarts=15) { if (sum(x[,1]==1)==nrow(x)) x=x[,-1] x=data.frame(x) col.names.x <- colnames(x) xnam <- colnames(x) fmla <- as.formula(paste("y ~ ", paste(xnam, collapse= "+"))) if(!is.null(psi.locs)){ psi.counts=apply(psi,1,sum) for(i in 1:k){ if(psi.counts[i]>0){ TEMP <- (is.list(psi.locs[[i]]))&(length(psi.locs[[i]])==sum(psi[i,]>0)) } else{ TEMP <- is.null(psi.locs[[i]]) } if(TEMP==FALSE) stop(paste("You must specify a correct changepoint structure!", "\n")) } } if (!is.null(delta)) { cat("Estimation performed assuming the changepoints are known.", "\n") if (is.null(psi.locs)) { stop(paste("You must specify the changepoints for this setting!", "\n")) } } if ((length(seg.Z) != k) | !inherits(seg.Z, "list", which = TRUE)) { stop(paste("You must specify a list of length k for the segmented relationships!", "\n")) } if (!identical(all.equal(dim(psi),c(k,ncol(x))),TRUE)) { stop(paste("You must specify a matrix with the correct dimension for psi!", "\n")) } if (((length(psi.locs) != k) | !inherits(psi.locs, "list", which = TRUE)) & !is.null(psi.locs)) { stop(paste("You must specify a list of length k for the number of changepoints per predictor in each component!", "\n")) } tot.cp <- apply(psi,1,sum) tmp.ind=1 tmp <- try(suppressWarnings(segregmix.init(y=y, x=x, lambda = lambda, beta = beta, s = sigma, k = k, seg.Z=seg.Z, psi=psi, psi.locs = psi.locs)),silent=TRUE) if(inherits(tmp, "try-error", which = TRUE)){ cat("Generating new initial values.", "\n") while(tmp.ind<=10){ tmp <- try(suppressWarnings(segregmix.init(y=y, x=x, lambda = NULL, beta = NULL, s = NULL, k = k, seg.Z=seg.Z, psi=psi, psi.locs = NULL)),silent=TRUE) tmp.ind <- tmp.ind+1 if(tmp.ind==11) stop(paste("Had to reinitialize algorithm too many times. Reconsider specified model.", "\n")) if(!inherits(tmp, "try-error", which = TRUE)) tmp.ind=20 } } x.old=x x = cbind(1, x) data.x=cbind(y,x) lambda <- tmp$lambda beta <- tmp$beta s <- tmp$s k <- tmp$k psi.locs <- tmp$psi.locs sing <- 0 perms=perm(k,k) perm.ind=nrow(perms) if (is.null(delta)) delta <- lapply(1:k,function(i) NULL) n <- length(y) diff <- 1 iter <- 0 X.aug <- lapply(1:k, function(i) cbind(1,aug.x(x[,-1],unlist(psi.locs[[i]]),psi[i,],delta=delta[[i]]))) X.aug.old <- X.aug psi.locs.old <- psi.locs xbeta <- lapply(1:k, function(i) X.aug[[i]] %*% matrix(beta[[i]],ncol=1)) res <- sapply(1:k, function(i) as.numeric((y - xbeta[[i]])^2)) comp <- t((lambda/sqrt(2 * pi * s^2)) * t(exp(-t(t(res)/(2 * s^2))))) obsloglik <- sum(log(apply(comp, 1, sum))) ll <- obsloglik z = matrix(nrow = n, ncol = k) restarts <- 0 while (diff > epsilon && iter < maxit) { null.beta=0 lambda.old <- lambda beta.old <- beta s.old <- s for (i in 1:n) { for (j in 1:k) { z.denom = c() for (h in 1:k) { z.denom = c(z.denom, (lambda[h]/lambda[j]) * (s[j]/s[h]) * exp(-0.5 * ((1/s[h]^2) * res[i, h] - (1/s[j]^2) * res[i, j]))) } z[i, j] = 1/sum(z.denom) } } z = z/apply(z, 1, sum) z[,k] = 1-apply(as.matrix(z[,-k]),1,sum) z<-round(z,15) z.old <- z lambda.new <- apply(z, 2, mean) if (sum(lambda.new < 1e-08) > 0 || is.na(sum(lambda.new))) { sing <- 1 } else { lm.out <- vector("list",k) psi.temp=psi.locs psi.ind=lapply(1:k,function(i) which(psi[i,]!=0)) for(i in 1:k){ if(is.null(seg.Z[[i]]) | (sum(1-sapply(delta,is.null))>0)){ temp.seg <- lm(fmla,data=data.x,weights=z[,i]) } else temp.seg <- try(suppressWarnings(segmented(lm(fmla,data=data.x,weights=z[,i]),seg.Z=seg.Z[[i]],psi=psi.temp[[i]])),silent=TRUE) if(inherits(temp.seg, "try-error", which = TRUE)){ seq = 1 temp.names = names(psi.locs.old[[i]]) while(seq < 20){ psi.temp2 <- vector("list",length(psi.temp[[i]])) for(ii in 1:length(psi.temp[[i]])){ x.range <- range(data.x[,which(names(data.x)==temp.names[ii])]) psi.temp2[[ii]] <- psi.temp[[i]][[ii]]+sample(c(-1,1),length(psi.temp[[i]][[ii]]),replace=TRUE)*runif(length(psi.temp[[i]][[ii]]),0,diff(x.range)/10) if((any(psi.temp2[[ii]]<=x.range[1]))|(any(psi.temp2[[ii]]>=x.range[2]))) psi.temp2[[ii]]=psi.temp[[i]][[ii]] psi.temp2[[ii]]=sort(psi.temp2[[ii]]) } names(psi.temp2)=temp.names temp.seg <- try(suppressWarnings(segmented(lm(fmla,data=data.x,weights=z[,i]),seg.Z=seg.Z[[i]],psi=psi.temp2[[i]],control=seg.control(it.max=1))),silent=TRUE) if(!inherits(temp.seg, "try-error", which = TRUE)){ seq = seq+1 } else seq=40 } if(seq!=40){ temp.seg <- try(suppressWarnings(segmented(lm(fmla,data=data.x,weights=z[,i]),seg.Z=seg.Z[[i]],psi=psi.temp[[i]],control=seg.control(it.max=1))),silent=TRUE) } } lm.out[[i]]=temp.seg } lambda <- lambda.new if(sum(sapply(lm.out, inherits, "try-error", which=TRUE))>0){ newobsloglik=-Inf } else{ if(sum(1-sapply(delta,is.null))>0){ psi.new <- psi.locs.old } else { psi.new <- psi.locs for(i in 1:k){ if(inherits(lm.out, "segmented", which = TRUE)){ temp.names=names(psi.locs[[i]]) temp.cumsum=cumsum(sapply(psi.locs[[i]],length)) TC.ind = length(temp.cumsum) seg.temp = lm.out[[i]]$psi[,2] psi.new[[i]] = lapply(1:length(psi.locs[[i]]), function(j) as.numeric(lm.out[[i]]$psi[,2])) psi.new[[i]] = vector("list",TC.ind) psi.new[[i]][[1]]=sort(seg.temp[1:temp.cumsum[1]]) if(TC.ind>1) for(j in 2:TC.ind) psi.new[[i]][[j]] = sort(seg.temp[(temp.cumsum[j-1]+1):temp.cumsum[j]]) names(psi.new[[i]])=temp.names } } } X.aug.new <- lapply(1:k, function(i) cbind(1,aug.x(x[,-1],unlist(psi.new[[i]]),psi[i,],delta[[i]]))) lm.out2=lapply(1:perm.ind, function(j) lapply(1:k, function(i) lm(y~X.aug.new[[i]][,-1],weights=z[,perms[j,i]]))) beta.new <- lapply(1:perm.ind, function(j) lapply(lm.out2[[j]],coef)) null.perms <- sapply(1:perm.ind,function(i) all(!is.na(lapply(beta.new,unlist)[[i]]))) null.beta=0 if(sum(null.perms)>0){ xbeta.new <- lapply(1:perm.ind, function(j) lapply(1:k, function(i) X.aug.new[[i]] %*% matrix(beta.new[[j]][[i]],ncol=1))) res <- lapply(1:perm.ind, function(j) sapply(1:k, function(i) (y - xbeta.new[[j]][[i]])^2)) s.new <- lapply(1:perm.ind, function(j) sqrt(sapply(1:k, function(i) sum(z[,perms[j,i]] * (res[[j]][, i]))/sum(z[,perms[j,i]])))) comp <- lapply(1:perm.ind, function(j) lapply(1:k, function(i) lambda.new[i] * dnorm(y, xbeta.new[[j]][[i]], s.new[[j]][i]))) comp <- lapply(1:perm.ind, function(j) sapply(comp[[j]], cbind)) compsum <- lapply(1:perm.ind, function(j) apply(comp[[j]], 1, sum)) newobsloglik <- sapply(1:perm.ind, function(j) sum(log(compsum[[j]]))) newobsloglik[c(1-null.perms)]=-Inf IND <- which.max(newobsloglik) z = z[,perms[IND,]] lambda.new <- apply(z, 2, mean) lambda <- lambda.new beta <- beta.new[[IND]] xbeta <- xbeta.new[[IND]] res <- res[[IND]] X.aug <- X.aug.old s <- s.new[[IND]] psi.locs <- psi.new sing <- sum(s < 1e-08) newobsloglik <- newobsloglik[IND] } else{ newobsloglik=Inf null.beta=1 } } if((newobsloglik0){ xbeta.new <- lapply(1:perm.ind, function(j) lapply(1:k, function(i) X.aug.old[[i]] %*% matrix(beta.new[[j]][[i]],ncol=1))) res <- lapply(1:perm.ind, function(j) sapply(1:k, function(i) (y - xbeta.new[[j]][[i]])^2)) s.new <- lapply(1:perm.ind, function(j) sqrt(sapply(1:k, function(i) sum(z[,perms[j,i]] * (res[[j]][, i]))/sum(z[,perms[j,i]])))) comp <- lapply(1:perm.ind, function(j) lapply(1:k, function(i) lambda.new[i] * dnorm(y, xbeta.new[[j]][[i]], s.new[[j]][i]))) comp <- lapply(1:perm.ind, function(j) sapply(comp[[j]], cbind)) compsum <- lapply(1:perm.ind, function(j) apply(comp[[j]], 1, sum)) newobsloglik <- sapply(1:perm.ind, function(j) sum(log(compsum[[j]]))) newobsloglik[c(1-null.perms)]=-Inf IND <- which.max(newobsloglik) z = z[,perms[IND,]] lambda.new <- apply(z, 2, mean) lambda <- lambda.new beta <- beta.new[[IND]] xbeta <- xbeta.new[[IND]] res <- res[[IND]] X.aug <- X.aug.old s <- s.new[[IND]] psi.locs <- psi.locs.old sing <- sum(s < 1e-08) newobsloglik <- newobsloglik[IND] } else{ newobsloglik=Inf sing=1 } } if(newobsloglik 0 || is.na(newobsloglik) || abs(newobsloglik) == Inf) { cat("Need new starting values due to singularity...", "\n") restarts <- restarts + 1 if (restarts > max.restarts) stop("Too many tries!") tmp.ind=1 while(tmp.ind==1){ if(sum(1-sapply(delta,is.null))>0) psi.temp=psi.locs tmp <- try(suppressWarnings(segregmix.init(y=y, x=x.old, lambda = NULL, beta = NULL, s = NULL, k = k, seg.Z=seg.Z, psi=psi, psi.locs = NULL)),silent=TRUE) if(!inherits(tmp, "try-error", which = TRUE)) tmp.ind=2 } lambda <- tmp$lambda beta <- tmp$beta s <- tmp$s k <- tmp$k psi.locs <- tmp$psi.locs n <- length(y) diff <- 1 iter <- 0 X.aug <- lapply(1:k, function(i) cbind(1,aug.x(x[,-1],unlist(psi.locs[[i]]),psi[i,],delta[[i]]))) xbeta <- lapply(1:k, function(i) X.aug[[i]] %*% matrix(beta[[i]],ncol=1)) res <- sapply(1:k, function(i) as.numeric((y - xbeta[[i]])^2)) comp <- t((lambda/sqrt(2 * pi * s^2)) * t(exp(-t(t(res)/(2 * s^2))))) obsloglik <- sum(log(apply(comp, 1, sum))) ll <- obsloglik } else { diff <- newobsloglik - obsloglik obsloglik <- newobsloglik ll <- c(ll, obsloglik) X.aug.old <- X.aug psi.locs.old <- psi.locs iter <- iter + 1 if (verb) { cat("iteration =", iter, "diff =", diff, "log-likelihood =", obsloglik, "\n") } } } if (iter == maxit) { warning("Maximum number of iterations reached.", call. = FALSE) } if (iter == 1) { cat("Converged in 1 iteration. Consider rerunning with different starting values or smaller stopping criterion.", "\n") } cat("number of iterations=", iter, "\n") names(delta) <- c(paste("comp", ".", 1:k, sep = "")) names(seg.Z) <- c(paste("comp", ".", 1:k, sep = "")) names(psi.locs) <- c(paste("comp", ".", 1:k, sep = "")) names(beta) <- c(paste("comp", ".", 1:k, sep = "")) for(i in 1:k){ names(beta[[i]])[1]="(Intercept)" names(beta[[i]])[2:ncol(x)]=colnames(x)[-1] if(!is.null(psi.locs[[i]])){ for(j in 1:ncol(psi)){ if(psi[i,j]>0 & j==1){ names(beta[[i]])[(ncol(x)+1):(ncol(x)+cumsum(psi[i,])[j])]=c(paste(colnames(x)[j+1], ".", 1:psi[i,j], sep = "")) } else if(psi[i,j]>0) names(beta[[i]])[(ncol(x)+cumsum(psi[i,])[j-1]+1):(ncol(x)+cumsum(psi[i,])[j])]=c(paste(colnames(x)[j+1], ".", 1:psi[i,j], sep = "")) } } } colnames(z) <- c(paste("comp", ".", 1:k, sep = "")) a = list(x = x, y = y, lambda = lambda, beta = beta, sigma = s, seg.Z = seg.Z, psi.locs = psi.locs, delta = delta, loglik = obsloglik, posterior = z, all.loglik = ll, restarts = restarts, ft = "segregmixEM") class(a) = "mixEM" a }mixtools/R/plotseq.npEM.R0000755000175100001440000000306114342153463015027 0ustar hornikusers# plots SEQuence from npEM object # function for plotting the scalar parameters sequences along iterations # if object x comes from npEM, just the x$lambda sequence # if object x comes from spEM, both x$lambda and x$mu sequences plotseq <- function(x, ...) UseMethod("plotseq") plotseq.npEM <- function(x, ...) { # ask <- par(ask=TRUE) r <- NCOL(x$data) n <- NROW(x$data) m <- length(x$lambdahat) iter <- NROW(x$lambda) xlabel <- paste("iterations") nbcol <- 1 if (!is.null(x$symmetric) && x$symmetric) nbcol <- 2 par(mfcol=c(m, nbcol)) # in all cases, plots the lambda's for (j in 1:m) { estim <- paste(round(x$lambdahat[j],3)) tt <- substitute(expression(paste("sequence of ",lambda[j], ", estimate ",widehat(lambda[j]),"=", estim, sep=""))) ylabel <- substitute(expression(paste(lambda[j],sep=""))) plot(x$lambda[,j], type="l", main=eval(tt), xlab=xlabel, ylab=eval(ylabel), ...) lines(c(0,iter),rep(x$lambdahat[j],2),col=2,lty=2) } ## for symmetric location spEM case plots mu if (!is.null(x$symmetric) && x$symmetric) { for (j in 1:m) { estim <- paste(round(x$muhat[j],3)) tt <- substitute(expression(paste("sequence of ",mu[j], ", estimate ",widehat(mu[j]),"=",estim,sep=""))) ylabel <- substitute(expression(paste(mu[j],sep=""))) plot(x$mu[,j], type="l", main=eval(tt), ylab=eval(ylabel), xlab=xlabel, ...) lines(c(0,iter),rep(x$muhat[j],2),col=2,lty=2) } # legend("topright", legend=round(x$muhat,3), fill=2:(m+1)) } # structure (list (call=match.call())) } mixtools/R/regmixmodelsel.R0000755000175100001440000001146114342153463015525 0ustar hornikusersregmixmodel.sel = function (x, y, w=NULL, k = 2, type = c("fixed", "random", "mixed"), ...) { aic <- NULL bic <- NULL caic <- NULL icl <- NULL type <- match.arg(type) AIC <- function(emout, p) { emout$loglik - (p - 1) } BIC <- function(emout, p, n) { emout$loglik - log(n) * (p - 1)/2 } CAIC <- function(emout, p, n) { emout$loglik - (log(n) + 1) * (p - 1)/2 } ICL <- function(emout, p, n) { BIC(emout, p, n) - sum(emout$lambda * log(emout$lambda)) } if (type == "fixed") { p <- function(emout) {length(emout$beta) + length(emout$sigma) + (length(emout$scale)-1)*is.null(emout$scale) +length(emout$lambda)} n <- length(y) for (i in 1:k) { if (i == 1) { a <- glm(y ~ x) beta <- matrix(a$coef, ncol = 1) loglik <- log(prod(dnorm(y, mean = beta[1, ] + as.matrix(x) %*% beta[2:nrow(beta), ], sd = sd(a$res)))) emout <- list(beta = beta, sigma = sd(a$res), lambda = 1, loglik = loglik) } else emout <- regmixEM(y, x, k = i, ...) P = p(emout) aic[i] <- AIC(emout, p=P) bic[i] <- BIC(emout, p=P, n=n) caic[i] <- CAIC(emout, p=P, n=n) icl[i] <- ICL(emout, p=P, n=n) } } else if (type == "random") { p <- function(emout) { if(is.list(emout$R)){ m<-nrow(emout$R[[1]]) v<-length(emout$R) } else { m<-nrow(emout$R) v<-1} length(emout$mu) +(v*m*(m+1)/2)+ length(emout$sigma)+ length(emout$lambda)} n <- sum(sapply(y,length)) for (j in 1:k) { if (j == 1) { a <- lapply(1:length(y), function(i) glm(y[[i]] ~ x[[i]])) aa <- sapply(1:length(a), function(i) as.vector(a[[i]]$res)) b <- sapply(1:length(a), function(i) as.matrix(a[[i]]$coef)) mu <- apply(b, 1, mean) R <- cov(t(b)) a.res <- NULL for (i in 1:length(aa)) { a.res <- c(a.res, aa[[i]]) } sd.a <- sd(a.res) loglik <- sapply(1:length(y), function(i) dmvnorm(as.vector(y[[i]]), b[1, i] + as.matrix(x[[i]]) %*% b[2:nrow(b), i], sd.a^2 * diag(length(y[[i]])))) loglik <- log(prod(loglik)) emout <- list(mu = mu, R = R, sigma = sd.a, lambda = 1, loglik = loglik) } else emout <- regmixEM.mixed(y, x, k = j, ...) P = p(emout) aic[j] <- AIC(emout, p=P) bic[j] <- BIC(emout, p=P, n=n) caic[j] <- CAIC(emout, p=P, n=n) icl[j] <- ICL(emout, p=P, n=n) } } else if (type == "mixed") { p <- function(emout) { if(is.list(emout$R)){ m<-nrow(emout$R[[1]]) v<-length(emout$R) } else { m<-nrow(emout$R) v<-1} length(emout$alpha)+ length(emout$mu) +(v*m*(m+1)/2)+ length(emout$sigma)+ length(emout$lambda)} n <- sum(sapply(y,length)) for (i in 1:k) { if (i == 1) { a <- lapply(1:length(y), function(i) glm(y[[i]] ~ x[[i]] + w[[i]])) aa <- sapply(1:length(a), function(i) as.vector(a[[i]]$res)) alpha <- sapply(1:length(a), function(i) matrix(a[[i]]$coef[(ncol(x[[i]]) + 2):(ncol(x[[i]]) + 1 + ncol(w[[i]]))])) alpha <- apply(as.matrix(alpha), 1, mean) b <- sapply(1:length(a), function(i) matrix(a[[i]]$coef[1:(ncol(x[[i]]) + 1)])) mu <- apply(b, 1, mean) R <- cov(t(b)) a.res <- NULL for (i in 1:length(aa)) { a.res <- c(a.res, aa[[i]]) } sd.a <- sd(a.res) loglik <- sapply(1:length(y), function(i) dmvnorm(as.vector(y[[i]]), b[1, i] + as.matrix(x[[i]]) %*% b[2:nrow(b), i], sd.a^2 * diag(length(y[[i]])))) loglik <- log(prod(loglik)) emout <- list(mu = mu, R = R, alpha = alpha, sigma = sd.a, lambda = 1, loglik = loglik) } else emout <- regmixEM.mixed(y, x, k = i, ...) P = p(emout) aic[i] <- AIC(emout, p=P) bic[i] <- BIC(emout, p=P, n=n) caic[i] <- CAIC(emout, p=P, n=n) icl[i] <- ICL(emout, p=P, n=n) } } out = rbind(aic, bic, caic, icl) Winner = apply(out, 1, function(x) (1:length(x))[x == max(x)]) colnames(out) = 1:k rownames(out) = c("AIC", "BIC", "CAIC", "ICL") cbind(out, Winner) }mixtools/R/rmvnormmix.R0000755000175100001440000000074014342153463014721 0ustar hornikusers# Note: normmixrm.sim is here for backwards compatibility rmvnormmix <- normmixrm.sim <- function(n,lambda=1,mu=0,sigma=1) { m <- length(lambda) # nb of components mu <- matrix(mu, nrow=m) sigma <- matrix(sigma, nrow=m) if ((r <- NCOL(mu)) != NCOL(sigma)) { stop("mu and sigma must have the same number of columns", call.=FALSE) } z <- sample(m,n,replace=TRUE,prob=lambda) # component matrix(rnorm(n*r,mean=as.vector(mu[z,]),sd=as.vector(sigma[z,])),n,r) } mixtools/R/plot.npEM.R0000755000175100001440000000406614342153463014324 0ustar hornikusersplot.spEM <- plot.npEM <- function(x, blocks = NULL, hist=TRUE, addlegend=TRUE, scale = TRUE, title=NULL, breaks="Sturges", ylim=NULL, dens.col, newplot=TRUE, pos.legend="topright", cex.legend=1, ...) { r <- NCOL(x$data) m <- NCOL(x$posteriors) blockid <- x$blockid if (is.null(blocks)) { if(!is.null(blockid)) { blocks <- 1:max(blockid) } else { blocks <- blockid <- 1:r } } ask <- par(ask=(length(unique(blocks))>1)) ylim.orig <- ylim out <- list(x=list(), y=list()) if (!newplot) { hist <- FALSE } for(i in 1:length(blocks)) { coords <- blockid == blocks[i] ylim <- ylim.orig if (is.null(title)) { if (r>1) { tt <- paste(which(coords), collapse=",") tt <- paste("Coordinate", ifelse(sum(coords)>1, "s ", " "), tt, sep="") } else { tt <- "Density Curves" } } else { tt <- rep(title,length(blocks))[i] } dx <- dy <- NULL for (j in 1:m) { d <- density(x, component=j, block=blocks[i], scale=scale) dx <- cbind(dx, d$x) dy <- cbind(dy, d$y) } xx <- as.vector(as.matrix(x$data)[,coords]) if (is.null(ylim)) { ylim=range(dy) if (hist) { ylim[2] <- max(ylim[2], hist(xx, breaks=breaks, plot=FALSE)$density) } } if (!hist && newplot) { pf <- plot # Use plot or hist as plotting fn the 1st time only, then lines } else { pf <- lines } if (hist) { hist(xx, breaks=breaks, prob=TRUE, ylim=ylim, main="", ...) } if (missing(dens.col)) dens.col <- 2:(m+1) dens.col <- rep(dens.col, length.out=m) for (j in 1:m) { pf(dx[,j],dy[,j], type="l", lwd=2, col=dens.col[j], ylim=ylim, ...) pf <- lines } if (addlegend) { legend(pos.legend, legend=round(x$lambdahat,3), fill=dens.col, cex=cex.legend) out$x[[i]]<-dx out$y[[i]]<-dy } if (newplot) { title(main=tt, ...) } } par(ask=ask) invisible(out) } mixtools/R/lambdapert.R0000755000175100001440000000021514342153463014613 0ustar hornikuserslambda.pert <- function (lambda, pert) { temp = logit(lambda) + pert temp2 = inv.logit(temp) new.lambda = temp2/sum(temp2) new.lambda } mixtools/R/flaremixEM.R0000755000175100001440000000101514342153463014530 0ustar hornikusersflaremixEM<-function(y, x, lambda = NULL, beta = NULL, sigma = NULL, alpha = NULL, nu=NULL, epsilon = 1e-04, maxit = 10000, verb = FALSE, restart=50){ j=1 while(j<=length(nu)){ temp=try(try.flare(y=y, x=x, lambda = lambda, beta = beta, sigma = sigma, alpha = alpha, nu=nu[j], epsilon = epsilon, maxit = maxit, verb = verb, restart=restart),silent=TRUE) if(any(class(temp)=="try-error")) j=j+1 else j=2^100 } if(j==(length(nu)+1)) stop(paste("Too many attempts. Select a different barrier constant.","\n")) temp } mixtools/R/plotly_expRMM.R0000644000175100001440000000757314343041730015260 0ustar hornikusersplotly_expRMM <- function(a , title = NULL , rowstyle = TRUE , subtitle=NULL, width = 2 , cex = 2 , col.comp = NULL, legend.text = NULL, legend.text.size = 15, legend.size = 15, title.x = 0.5, title.y = 0.95, title.size = 15, xlab.size = 15, xtick.size = 15, ylab.size = 15, ytick.size = 15 ){ n <- length(a$x) m <- dim(a$all.lambda)[2] if (is.null(col.comp)){ col.comp <- hue_pal()(m) } if (length(col.comp) != m){ print(paste("Please specify",m,"colors in 'col.comp'.")) } pcc <- round(100*(1-mean(a$d)),2) sizes <- paste("n=",n,", ", pcc, "% censored", sep="") if (is.null(subtitle)) { subtitle <- paste("n=",n,", ", pcc, "% censored", sep="")} if (is.null(title)) { tt1 <- "Rate parameters" tt2 <- "Weight parameters" } else {tt1 <- tt2 <- title} # lgd <- expression(xi[1]) ## Cannot be converted to plotly. plot1 <- plot_ly() %>% plotly::layout( legend = list(title=list(text=legend.text), font = list(size=legend.size)), xaxis = list(title = list(text = "Iterations", font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = "Estimates", font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) for (j in 1:m){ plot1 <- plot1 %>% add_trace(x=seq(from = 1 , to = length(a$all.rate[,j]) , by = 1) , y=a$all.rate[,j] , type = 'scatter' , mode = 'lines+markers', marker = list(size = cex , color = col.comp[j]), line = list(width = width , color = col.comp[j]), name = paste("Comp" , j),showlegend = TRUE) } plot2 <- plot_ly() %>% plotly::layout( legend = list(title=legend.text, font = list(size=legend.size)), xaxis = list(title = list(text = "Iterations", font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = "Estimates", font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) for (j in 1:m){ plot2 <- plot2 %>% add_trace(x=seq(from = 1 , to = length(a$all.lambda[,j]) , by = 1) , y=a$all.lambda[,j] , type = 'scatter' , mode = 'lines+markers', marker = list(size = cex , color = col.comp[j]), line = list(width = width , color = col.comp[j]), name = paste("Comp" , j),showlegend = FALSE) } if (rowstyle) { nrow <- 1 x.1 <- 0.25 x.2 <- 0.75 y.1 <- y.2 <- 0.95 share.X <- FALSE } else if (!rowstyle){ nrow <- 2 x.1 <- x.2 <- 0.5 y.1 <- 0.95 y.2 <- 0.45 share.X <- TRUE } plot.all <- subplot( plot1 , plot2 , nrows = nrow , shareX = share.X , shareY = FALSE, titleX = TRUE , titleY = TRUE )%>% plotly::layout(annotations = list( list( x = x.1, y = y.1, font = list(size = title.size), text = paste(tt1 , "\n(", subtitle,")"), xref = "paper", yref = "paper", xanchor = "center", yanchor = "bottom", showarrow = FALSE ), list( x = x.2, y = y.2, font = list(size = title.size), text = paste(tt2 , "\n(", subtitle,")"), xref = "paper", yref = "paper", xanchor = "center", yanchor = "bottom", showarrow = FALSE ) ) ) print(plot.all) }mixtools/R/logisregmixinit.R0000755000175100001440000000207114342153463015717 0ustar hornikuserslogisregmix.init <- function(y, x, N, lambda = NULL, beta = NULL, k = 2){ x <- as.matrix(x) n <- length(y) if (is.null(lambda)) { cond = TRUE while(cond){ lambda = runif(k) lambda = lambda/sum(lambda) if(min(lambda)<0.05) cond=TRUE else cond=FALSE } } else k = length(lambda) p <- ncol(x) w = cbind(y, N, x) w = w[order(w[, 1]), ] w.bin = list() for (j in 1:k) { w.bin[[j]] <- w[max(1, floor((j - 1) * n/k)):ceiling(j * n/k), ] } if (is.null(beta)) { beta.hyp = matrix(sapply(1:k, function(j) glm.fit(w.bin[[j]][, 3:(p + 2)], w.bin[[j]][, 1:2], family = binomial())$coef), ncol = k) sd.hyp = apply(beta.hyp, 1, sd) beta = matrix(0, p, k) for (j in 1:k) { beta[, j] = rnorm(p, mean = as.vector(beta.hyp[, j]), sd = sd.hyp) } } else k = ncol(beta) list(lambda = lambda, beta = beta, k = k) } mixtools/R/plotly_weibullRMM.R0000644000175100001440000001072114343052727016124 0ustar hornikusersplotly_weibullRMM <- function(a, title=NULL, rowstyle=TRUE, subtitle=NULL, width = 3 , col = NULL , title.size = 15 , title.x = 0.5 , title.y = 0.95, xlab = "Iterations" , xlab.size = 15 , xtick.size = 15, ylab = "Estimates" , ylab.size = 15 , ytick.size = 15, legend.size = 15){ n <- length(a$x) m <- dim(a$all.lambda)[2] if (is.null(col)){ col <- hue_pal()(m) } if (length(col) != m){ print("Please specify",m,"colors in 'col'.") } pcc <- round(100*(1-mean(a$d)),2) if (is.null(subtitle)) { subtitle <- paste("n=",n,", ", pcc, "% censored", sep="")} if (is.null(title)) { tt1 <- "Shape parameters"; tt2 <- "Scale parameters" tt3 <- "Weight parameters" } else tt1 <- tt2 <- tt3 <- title plot1 <- plot_ly()%>% add_trace(x = seq(from = 1 , to = length(a$all.shape[,1]) , by = 1), y = a$all.shape[,1] , type = 'scatter' , mode = 'lines', line = list(width = width , color = col[1]), name = "Shape 1",showlegend = TRUE)%>% plotly::layout( legend = list(font = list(size=legend.size)), title = list(text = paste(tt1 , "\n(", subtitle,")"), x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = xlab, font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = ylab, font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) for (j in 2:m){ plot1 <- plot1%>% add_trace(x = seq(from = 1 , to = length(a$all.shape[,j]) , by = 1), y = a$all.shape[,j] , type = 'scatter' , mode = 'lines', line = list(width = width , color = col[j]), name = paste("Shape",j),showlegend = TRUE) } plot2 <- plot_ly()%>% add_trace(x = seq(from = 1 , to = length(a$all.scale[,1]) , by = 1), y = a$all.scale[,1] , type = 'scatter' , mode = 'lines', line = list(width = width , color = col[1]), name = "Scale 1",showlegend = TRUE)%>% plotly::layout( legend = list(font = list(size=legend.size)), title = list(text = paste(tt2 , "\n(", subtitle,")"), x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = xlab, font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = ylab, font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) for (j in 2:m){ plot2 <- plot2%>% add_trace(x = seq(from = 1 , to = length(a$all.scale[,j]) , by = 1), y = a$all.scale[,j] , type = 'scatter' , mode = 'lines', line = list(width = width , color = col[j]), name = paste("Scale",j),showlegend = TRUE) } plot3 <- plot_ly()%>% add_trace(x = seq(from = 1 , to = length(a$all.lambda[,1]) , by = 1), y = a$all.lambda[,1] , type = 'scatter' , mode = 'lines', line = list(width = width , color = col[1]), name = paste('λ',"",1,"" , sep=""),showlegend = TRUE)%>% plotly::layout( legend = list(font = list(size=legend.size)), title = list(text = paste(tt3 , "\n(", subtitle,")"), x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = xlab, font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = ylab, font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) for (j in 2:m){ plot3 <- plot3%>% add_trace(x = seq(from = 1 , to = length(a$all.lambda[,j]) , by = 1), y = a$all.lambda[,j] , type = 'scatter' , mode = 'lines', line = list(width = width , color = col[j]), name = paste('λ',"",j,"" , sep=""),showlegend = TRUE) } print(plot1) print(plot2) print(plot3) }mixtools/R/postbeta.R0000755000175100001440000000347614342153463014335 0ustar hornikuserspost.beta <- function(y, x, p.beta, p.z) { N = length(y) k = ncol(p.z) g = apply(p.z, 1, function(i) (1:length(i))[i == max(i)]) min.int=min(sapply(1:N, function(i) min(p.beta[[i]][1,]))) max.int=max(sapply(1:N, function(i) max(p.beta[[i]][1,]))) min.slp=min(sapply(1:N, function(i) min(p.beta[[i]][2,]))) max.slp=max(sapply(1:N, function(i) max(p.beta[[i]][2,]))) par(mfrow=c(2,2)) #All posterior regression lines. plot(c(min(sapply(x,min)),max(sapply(x,max))),c(min(sapply(y,min)),max(sapply(y,max))),type="n",xlab="x-values",ylab="y-values",main="Data and Posterior Regression Lines") sapply(1:length(x),function(i) points(x[[i]], y[[i]])) for(j in 1:k){ sapply(1:length(p.beta), function(i) abline(coef=p.beta[[i]][,j], col=(j+1))) } #Posterior regression lines chosen according to the membership probabilities. plot(c(min(sapply(x,min)),max(sapply(x,max))),c(min(sapply(y,min)),max(sapply(y,max))),type="n",xlab="x-values",ylab="y-values",main="Data and Most Probable Posterior Regression Lines") sapply(1:length(x),function(i) points(x[[i]], y[[i]])) sapply(1:length(p.beta), function(i) abline(coef=p.beta[[i]][,g[i]], col=(g[i]+1))) #All posterior beta values. plot(c(min.int,max.int),c(min.slp,max.slp),type="n",xlab="Posterior Intercepts",ylab="Posterior Slopes",main="All Posterior Regression Coefficients") for(j in 1:k){ sapply(1:length(p.beta), function(i) points(t(p.beta[[i]][,j]), col=(j+1))) } #Posterior beta values chosen according to the membership probabilities. min.max=c(min(sapply(p.beta,min)),max(sapply(p.beta,max))) plot(c(min.int,max.int),c(min.slp,max.slp),type="n",xlab="Posterior Intercepts",ylab="Posterior Slopes",main="Most Probable Posterior Regression Coefficients") sapply(1:length(p.beta), function(i) points(t(p.beta[[i]][,g[i]]), col=(g[i]+1))) } mixtools/R/kernC.R0000755000175100001440000000010514342153463013540 0ustar hornikuserskern.C <- function (x, xi, h) { (1+cos(pi*(xi-x)/h))/(2*h) } mixtools/R/density.spEM.R0000755000175100001440000000351114342153463015024 0ustar hornikusers# Method for "density" generic: Takes an spEM object and returns # a corresponding KDE for the appropriate component and block, evaluated # at the given set of points. # Does not use the FFT like the density.default function does; still # quite fast, but not optimized for speed density.spEM <- function (x, u = NULL, component=1, block = 1, scale = FALSE, ...) { m <- NCOL(x$posteriors) r <- NCOL(x$data) n <- NROW(x$data) if (is.null(blockid <- x$blockid)) { coords <- 1 u2 <- rep(1, r) } else { u2 <- match(x$blockid, unique(x$blockid)) # convert blockid to integers 1, 2, ... coords <- blockid == block if (!any(coords)) stop("Illegal value of block argument") } stackedx <- x$data[rep(1:n,m),] cs <- colSums(x$posteriors) z.tmp <- sweep(x$posteriors, 2, cs, "/") z.tmp[, cs==0] <- 1/NROW(z.tmp) # Just in case wts <- rep(as.vector(z.tmp),r) mu <- matrix(x$muhat, nrow=m) sigma <- matrix(x$sigmahat, nrow=m) scaledx <- as.vector((stackedx - mu[rep(1:m, each=n), u2])/ sigma[rep(1:m, each=n), u2]) bw <- x$bandwidth if (is.null(u)) { xx <- as.vector(as.matrix(x$data)[, coords]) u = seq(min(xx) - 4 * bw, max(xx) + 4 * bw, len = 250) } # This part isn't used for now: if (!is.null(x$symmetric) && x$symmetric) { d <- wkde(x=scaledx, u=(u-mu[component, block])/sigma[component, block], w=wts, bw=bw, sym=TRUE) / sigma[component, block] } else { d <- wkde(x=scaledx, u=(u-mu[component, block])/sigma[component, block], w=wts, bw=bw) / sigma[component, block] } if (scale) d <- d * x$lambdahat[component] structure(list(x = u, y = d, bw = bw, n = n, call = match.call(), data.name = deparse(substitute(x)), has.na = FALSE), class = "density") } mixtools/R/plotly_mixEM.R0000644000175100001440000003533514343047511015127 0ustar hornikusersplotly_mixEM <-function (x, loglik = TRUE, density = FALSE, xlab1="Iteration", xlab1.size=15 , xtick1.size=15, ylab1="Log-Likelihood", ylab1.size=15 , ytick1.size=15, title1="Observed Data Log-Likelihood", title1.size=15, title1.x = 0.5,title1.y=0.95, col1="#1f77b4", lwd1=3, cex1=6, xlab2=NULL, xlab2.size=15 , xtick2.size=15, ylab2=NULL, ylab2.size=15 , ytick2.size=15, title2=NULL, title2.size=15, title2.x = 0.5,title2.y=0.95, col.hist = "#1f77b4", col2=NULL, lwd2=3, cex2=6, alpha = 0.05, marginal = FALSE){ def.par <- par(ask=(loglik + density > 1), "mar") # only ask and mar are changed mix.object <- x if (!inherits(mix.object, "mixEM")) stop("Use only with \"mixEM\" objects!") ### iteration plot ### if (loglik) { plot.loglik <- plot_ly()%>% add_trace(x= seq(from=1 , to=length(mix.object$all.loglik) , by=1), y= mix.object$all.loglik , type = 'scatter' , mode = 'lines+markers', marker = list(color = col1 , size = cex1), line = list(color = col1 , width = lwd1), name = "Log-Likelihood" , showlegend = FALSE)%>% plotly::layout( title = list(text = title1, x = title1.x, y = title1.y, font = list(size=title1.size) ), xaxis = list(title = list(text = xlab1, font = list(size = xlab1.size)), tickfont = list(size = xtick1.size) ), yaxis = list(title = list(text = ylab1, font = list(size = ylab1.size)), tickfont = list(size = ytick1.size) ) ) print(plot.loglik) } ### density plot ### if (density){ if (mix.object$ft == "logisregmixEM") { if (ncol(mix.object$x) != 2) { stop("The predictors must have 2 columns!") } if (sum((mix.object$y == 1) + (mix.object$y == 0)) != length(mix.object$y)) { stop("The response must be binary!") } k = ncol(mix.object$beta) x = mix.object$x[, 2] if(is.null(title2)) { title2 <- "Most Probable Component Membership" } if(is.null(xlab2)) { xlab2 <- "Predictor" } if(is.null(ylab2)) { ylab2 <- "Response" } if (is.null(col2)){ col2 <- hue_pal()(k) } if (length(col2) != k){ print(paste("Please specify" , k , "colors in 'col2'.")) } plot.density <- plot_ly()%>% add_trace(x=x , y=mix.object$y, type = 'scatter' , mode = 'markers', marker = list(color = col2[apply(mix.object$posterior,1, which.max)] , size = cex2), name = "Data" , showlegend = FALSE)%>% plotly::layout( title = list(text = title2, x = title2.x, y = title2.y, font = list(size=title2.size) ), xaxis = list(title = list(text = xlab2, font = list(size = xlab2.size)), tickfont = list(size = xtick2.size) ), yaxis = list(title = list(text = ylab2, font = list(size = ylab2.size)), tickfont = list(size = ytick2.size) ) ) a = cbind(x, mix.object$y) a = a[order(a[, 1]), ] for (i in 1:k) { plot.density <- add_trace(plot.density, x=a[,1] , y=plogis(mix.object$beta[1, i]+mix.object$beta[2,i] * a[,1]), type = 'scatter' , mode = 'lines', line = list(width = lwd2 , color = col2[i]), name = paste("Component" , i) , showlegend = FALSE) } } if (mix.object$ft == "normalmixEM") { k <- ncol(mix.object$posterior) x <- sort(mix.object$x) a <- hist(x, plot = FALSE) maxy <- max(max(a$density), 0.3989*mix.object$lambda/mix.object$sigma) if(is.null(title2)) { title2 <- "Density Curves" } if(is.null(xlab2)) { xlab2 <- "Data" } if (is.null(col2)){ col2 <- hue_pal()(k) } if (length(col2) != k){ print(paste("Please specify" , k , "colors in 'col2'.")) } plot.density <- plot_ly()%>% add_trace(x=x , type = 'histogram', histnorm = "probability density", name = 'Data' , showlegend = FALSE, marker = list(color = col.hist, line = list(color = col.hist)) )%>% plotly::layout( title = list(text = title2, x = title2.x, y = title2.y, font = list(size=title2.size) ), xaxis = list(title = list(text = xlab2, font = list(size = xlab2.size)), tickfont = list(size = xtick2.size) ), yaxis = list(title = list(text = ylab2, font = list(size = ylab2.size)), tickfont = list(size = ytick2.size), range = c(0 , maxy) ), bargap = 0.01 ) if (length(mix.object$mu) == 1) { arbvar <- TRUE mix.object$sigma <- mix.object$scale * mix.object$sigma arbmean <- FALSE } if (length(mix.object$mu) == k && length(mix.object$sigma) == 1) { arbmean <- TRUE arbvar <- FALSE } if (length(mix.object$sigma) == k && length(mix.object$mu) == k) { arbmean <- TRUE arbvar <- TRUE } for (i in 1:k) { plot.density <- add_trace(plot.density, x=x , y=mix.object$lambda[i] * dnorm(x, mean = mix.object$mu[i * arbmean + (1 - arbmean)], sd = mix.object$sigma[i * arbvar + (1 - arbvar)]), type = 'scatter' , mode = 'lines', line = list(width = lwd2 , color = col2[i]), name = paste("Component" , i) , showlegend = FALSE) } } if (mix.object$ft == "repnormmixEM") { x <- as.vector(as.matrix(mix.object$x)) k <- ncol(mix.object$posterior) x.sort <- sort(x) a <- hist(x.sort, plot = FALSE) maxy <- max(max(a$density), .3989*mix.object$lambda/mix.object$sigma) if (is.null(title2)) { title2 <- "Density Curves" } if(is.null(xlab2)) { xlab2 <- "Data" } if (is.null(col2)){ col2 <- hue_pal()(k) } if (length(col2) != k){ print(paste("Please specify" , k , "colors in 'col2'.")) } plot.density <- plot_ly()%>% add_trace(x=x , type = 'histogram', histnorm = "probability density", name = 'Data' , showlegend = FALSE, marker = list(color = col.hist, line = list(color = col.hist)) )%>% plotly::layout( title = list(text = title2, x = title2.x, y = title2.y, font = list(size=title2.size) ), xaxis = list(title = list(text = xlab2, font = list(size = xlab2.size)), tickfont = list(size = xtick2.size) ), yaxis = list(title = list(text = ylab2, font = list(size = ylab2.size)), tickfont = list(size = ytick2.size), range = c(0 , maxy) ), bargap = 0.01 ) if (length(mix.object$mu) == 1) { arbvar <- TRUE mix.object$sigma = mix.object$scale * mix.object$sigma arbmean <- FALSE } if (length(mix.object$mu) == k && length(mix.object$sigma) == 1) { arbmean <- TRUE arbvar <- FALSE } if (length(mix.object$sigma) == k && length(mix.object$mu) == k) { arbmean <- TRUE arbvar <- TRUE } for (i in 1:k) { plot.density <- add_trace(plot.density, x=x.sort , y=mix.object$lambda[i] * dnorm(x.sort, mean = mix.object$mu[i * arbmean + (1 - arbmean)], sd = mix.object$sigma[i * arbvar + (1 - arbvar)]), type = 'scatter' , mode = 'lines', line = list(width = lwd2 , color = col2[i]), name = paste("Component" , i) , showlegend = FALSE) } } if (mix.object$ft == "regmixEM.mixed") { if (is.null(col2)){ col2 <- hue_pal()(ncol(x$posterior.z)) } if (length(col2) != ncol(x$posterior.z)){ print(paste("Please specify", ncol(x$posterior.z) ,"color in 'col2'.")) } x.1 = mix.object$x n = sum(sapply(x.1, nrow)) x.1.sum = sum(sapply(1:length(x.1), function(i) length(x.1[[i]][,1]))) if (x.1.sum == n) { x = lapply(1:length(x.1), function(i) matrix(x.1[[i]][,-1], ncol = 1)) }else { x = x.1 } plot.density <- plotly_post.beta(x = x, y = mix.object$y, p.beta = mix.object$posterior.beta, p.z = mix.object$posterior.z , cex = cex2,lwd=lwd2, title.size = title2.size, xlab.size = xlab2.size , xtick.size = xtick2.size, ylab.size = ylab2.size , ytick.size = ytick2.size, col.comp = col2) } if (mix.object$ft == "mvnormalmixEM") { x = mix.object$x if (ncol(x) != 2) { stop("The data must have 2 columns!") } post = apply(mix.object$posterior, 1, which.max) k <- ncol(mix.object$posterior) if (is.null(col2)){ col2 <- hue_pal()(k) } if (length(col2) != k){ print(paste("Please specify" ,k," colors in 'col2'.")) } if (is.list(mix.object$sigma)) { sigma = mix.object$sigma } else { sigma = lapply(1:k, function(i) mix.object$sigma) } if (is.list(mix.object$mu)) { mu = mix.object$mu } else { mu = lapply(1:k, function(i) mix.object$mu) } if(is.null(xlab2)) { xlab2 <- "X.1" } if(is.null(ylab2)) { ylab2 <- "X.2" } if (!marginal) { if (is.null(title2)) { title2 <- "Density Curves" } } if (marginal) { title2 <- "" } plot.main <- plot_ly()%>% add_trace(x=mix.object$x[,1] , y=mix.object$x[,2], type = 'scatter' , mode = 'markers', marker = list(color = col2[post] , size = cex2), name = "Data" , showlegend = FALSE)%>% plotly::layout( title = list(text = title2, x = title2.x, y = title2.y, font = list(size=title2.size) ), xaxis = list(title = list(text = xlab2, font = list(size = xlab2.size)), tickfont = list(size = xtick2.size) ), yaxis = list(title = list(text = ylab2, font = list(size = ylab2.size)), tickfont = list(size = ytick2.size) ) ) for (i in 1:k){ plot.main <- add_markers(plot.main, x = mu[[i]][1], y = mu[[i]][2], marker = list(color = "black" , size = cex2+3), name = paste("Center" , i) , showlegend = FALSE) } es.multi <- lapply(sigma, eigen) e1.multi <- lapply(es.multi, function(x){x$vectors%*%diag(sqrt(x$values))}) r1.multi <- sapply(alpha, function(x){sqrt(qchisq(1-x,2))}) theta <- seq(0,2*pi,len=300) v1.multi <- lapply(r1.multi , function(x){cbind(x*cos(theta),x*sin(theta))}) pts.multi <- rep(list(NA),length(sigma)) for (i in 1:length(sigma)){ pts.multi[[i]] <- rep(list(NA) , length(alpha)) for (j in 1:length(alpha)){ pts.multi[[i]][[j]] <- t(mu[[i]]-e1.multi[[i]]%*%t(v1.multi[[j]])) } } for (i in 1:k) { for (j in 1:length(alpha)) { plot.main <- add_trace( plot.main, x=pts.multi[[i]][[j]][,1] , y=pts.multi[[i]][[j]][,2] , type = 'scatter' , mode = 'lines', line = list(color = col2[i] , width = lwd2), name = paste((1-alpha[j])*100,'% Ellipse'),showlegend = FALSE) } } if (!marginal){ plot.density <- plot.main } if (marginal){ x.marginal <- plot_ly()%>% add_trace(x=mix.object$x[, 1], type = 'histogram', name = "Dist X", showlegend = FALSE, marker = list(color = col.hist, line = list(color = col.hist)) )%>% plotly::layout( bargap = 0.01 ) y.marginal <- plot_ly()%>% add_trace(y=mix.object$x[, 2], type = 'histogram', name = "Dist X", showlegend = FALSE, marker = list(color = col.hist, line = list(color = col.hist)) )%>% plotly::layout( bargap = 0.01 ) plot.density <- subplot( x.marginal, plotly_empty(type = 'scatter' , mode = "markers"), plot.main, y.marginal, nrows = 2, heights = c(.2, .8), widths = c(.8,.2), margin = 0, shareX = TRUE, shareY = TRUE) %>% plotly::layout(showlegend = FALSE) } } print(plot.density) # if (mix.object$ft == "expRMM_EM") {plotexpRMM(mix.object, ...)} # all default # if (mix.object$ft == "weibullRMM_SEM") {plotweibullRMM(mix.object, ...)} # all default if (mix.object$ft == "expRMM_EM") {plotly_expRMM(mix.object)} # all default if (mix.object$ft == "weibullRMM_SEM") {plotly_weibullRMM(mix.object)} # all default } par(def.par) # reset ask and mar to original values }mixtools/R/mvnormalmixEM.R0000755000175100001440000001555614342153463015311 0ustar hornikusersmvnormalmixEM = function (x, lambda = NULL, mu = NULL, sigma = NULL, k = 2, arbmean = TRUE, arbvar = TRUE, epsilon = 1e-08, maxit = 10000, verb = FALSE) { if(arbmean == FALSE && arbvar == FALSE){ stop(paste("Must change constraints on mu and/or sigma!","\n")) } x <- as.matrix(x) n <- nrow(x) p <- ncol(x) tmp <- mvnormalmix.init(x = x, lambda = lambda, mu = mu, sigma = sigma, k = k, arbmean=arbmean, arbvar = arbvar) lambda <- tmp$lambda mu<-tmp$mu sigma <- tmp$sigma k = tmp$k diff <- 1 iter <- 0 if (arbmean==FALSE){ comp <- lapply(1:k, function(i) lambda[i] * dmvnorm(x, mu, sigma[[i]])) } else{ if (arbvar==FALSE) { comp <- lapply(1:k, function(i) lambda[i] * dmvnorm(x, mu[[i]], sigma)) } else comp <- lapply(1:k, function(i) lambda[i] * dmvnorm(x, mu[[i]], sigma[[i]])) } comp <- sapply(comp, cbind) compsum <- apply(comp, 1, sum) obsloglik <- sum(log(compsum)) ll <- obsloglik restarts <- 0 while (diff > epsilon & iter < maxit) { if (arbvar) { z = matrix(nrow = n, ncol = k) for (i in 1:n) { for (j in 1:k) { z.denom = c() for (m in 1:k) { z.denom = c(z.denom, lambda[m]/lambda[j] * (det(sigma[[j]])/det(sigma[[m]]))^(0.5) * exp(-0.5 * ((x[i, ] - mu[[m]]) %*% solve(sigma[[m]]) %*% t(t(x[i, ] - mu[[m]])) - (x[i, ] - mu[[j]]) %*% solve(sigma[[j]]) %*% t(t(x[i, ] - mu[[j]]))))) } z[i, j] = 1/sum(z.denom) } } z = z/apply(z,1,sum) # z[,k]=1-apply(as.matrix(z[,(1:(k-1))]),1,sum) sing <- sum(is.nan(z)) lambda.new <- apply(z, 2, mean) if (sum(lambda.new < 1e-08)>0 || is.na(sum(lambda.new))) { sing <- 1 } else { if(arbmean==FALSE) { mu.new <- lapply(1:k, function(j) sapply(1:p, function(i) apply(z * x[, i], 2, sum))[j, ]) mu.new <- apply(sapply(mu.new,as.vector),1,sum)/n mu.new <- lapply(1:k, function(j) mu.new) } else{ mu.new <- lapply(1:k, function(j) sapply(1:p, function(i) apply(z * x[, i], 2, sum))[j, ]/sum(z[, j])) } sigma.new <- lapply(1:k, function(j) matrix(apply(sapply(1:n, function(i) z[i, j] * (x[i, ] - mu.new[[j]]) %*% t(x[i, ] - mu.new[[j]])), 1, sum), p, p)/sum(z[, j])) lambda <- lambda.new mu <- mu.new sigma <- sigma.new comp <- lapply(1:k, function(i) lambda[i] * dmvnorm(x, mu[[i]], sigma[[i]])) comp <- sapply(comp, cbind) compsum <- apply(comp, 1, sum) newobsloglik <- sum(log(compsum)) } } else { z = matrix(nrow = n, ncol = k) sigma.inv = solve(sigma) for (i in 1:n) { for (j in 1:k) { z.denom = c() for (m in 1:k) { z.denom = c(z.denom, lambda[m]/lambda[j] * (det(sigma.inv)/det(sigma.inv))^(0.5) * exp(-0.5 * ((x[i, ] - mu[[m]]) %*% sigma.inv %*% t(t(x[i, ] - mu[[m]])) - (x[i, ] - mu[[j]]) %*% sigma.inv %*% t(t(x[i, ] - mu[[j]]))))) } z[i, j] = 1/sum(z.denom) } } # z[,k]=1-apply(as.matrix(z[,(1:(k-1))]),1,sum) z = z/apply(z,1,sum) sing <- sum(is.nan(z)) lambda.new <- apply(z, 2, mean) if (sum(lambda.new < 1e-08)>0 || is.na(sum(lambda.new))) { sing <- 1 } else { if(arbmean==FALSE) { mu.new <- lapply(1:k, function(j) sapply(1:p, function(i) apply(z * x[, i], 2, sum))[j, ]) mu.new <- apply(sapply(mu.new,as.vector),1,sum)/n mu.new <- lapply(1:k, function(j) mu.new) } else{ mu.new <- lapply(1:k, function(j) sapply(1:p, function(i) apply(z * x[, i], 2, sum))[j, ]/sum(z[, j])) } temp.sig <- lapply(1:k, function(j) matrix(apply(sapply(1:n, function(i) z[i, j] * (x[i, ] - mu.new[[j]]) %*% t(x[i, ] - mu.new[[j]])), 1, sum), p, p)) sigma.new <- matrix(apply(sapply(temp.sig, as.vector), 1, sum), p, p)/n lambda <- lambda.new mu <- mu.new sigma <- sigma.new comp <- lapply(1:k, function(i) lambda[i] * dmvnorm(x, mu[[i]], sigma)) comp <- sapply(comp, cbind) compsum <- apply(comp, 1, sum) newobsloglik <- sum(log(compsum)) } } if (sing > 0 || is.na(newobsloglik) || abs(newobsloglik) == Inf){# || sum(z) != n) { cat("Need new starting values due to singularity...", "\n") restarts <- restarts + 1 if(restarts>15) stop("Too many tries!") tmp <- mvnormalmix.init(x = x, k = k, arbmean=arbmean, arbvar = arbvar) lambda <- tmp$lambda mu <- tmp$mu sigma <- tmp$sigma k = tmp$k diff <- 1 iter <- 0 if (arbvar) { comp <- lapply(1:k, function(i) lambda[i] * dmvnorm(x, mu[[i]], sigma[[i]])) } else comp <- lapply(1:k, function(i) lambda[i] * dmvnorm(x, mu[[i]], sigma)) comp <- sapply(comp, cbind) compsum <- apply(comp, 1, sum) obsloglik <- sum(log(compsum)) ll <- obsloglik } else { diff <- newobsloglik - obsloglik obsloglik <- newobsloglik ll <- c(ll, obsloglik) iter <- iter + 1 if (verb) { cat("iteration=", iter, "diff=", diff, "log-likelihood", obsloglik, "\n") } } } if(arbmean==FALSE) { mu = mu[[1]] } if (iter == maxit) { cat("WARNING! NOT CONVERGENT!", "\n") } colnames(z) <- c(paste("comp", ".", 1:k, sep = "")) cat("number of iterations=", iter, "\n") a=list(x=x, lambda = lambda, mu = mu, sigma = sigma, loglik = obsloglik, posterior = z, all.loglik=ll, restarts=restarts, ft="mvnormalmixEM") class(a) = "mixEM" a } mixtools/R/augx.R0000755000175100001440000000110114342153463013437 0ustar hornikusersaug.x <- function(X,cp.locs,cp,delta = NULL){ X=as.matrix(X) if(is.null(delta)) delta=cp.locs if(length(cp.locs)!=length(delta) | length(cp.locs)!=sum(cp)){ stop(paste("You must specify a correct changepoint structure!", "\n")) } if(sum(cp)==0){ X } else{ new.x=NULL sum.cp=cumsum(cp) for(i in 1:length(cp)){ X.i=matrix(X[,i],ncol=max(1,cp[i]),nrow=length(X[,1])) if(cp[i]!=0){ CPs=cp.locs[(max(1,sum.cp[i-1]+1)):sum.cp[i]] SPs=delta[(max(1,sum.cp[i-1]+1)):sum.cp[i]] new.x=cbind(new.x,t(t(X.i)-SPs)*t(t(X.i)>CPs)) } } cbind(X,new.x) } } mixtools/R/print.npEM.R0000755000175100001440000000077014342153463014500 0ustar hornikusersprint.npEM <- function(x, ...) { n <- NROW(x$data) r <- NCOL(x$data) m <- length(x$lambdahat) cat(paste("Observations:", n, "\n")) cat(paste("Coordinates per observation:", r, "\n")) cat(paste("Mixture components:", m, "\n")) if (r>1) { B <- max(x$blockid) cat(paste("Blocks (of conditionally iid coordinates):", B, "\n\n")) } dp = match(c("data","posteriors", "lambda", "mu"), names(x), nomatch=0) print.default(structure(x[-dp], class=class(x)), ...) invisible(x) } mixtools/R/spEMsymloc.R0000644000175100001440000000564414342153463014603 0ustar hornikusers## EM-like algorithm for a nonparametric univariate mixture model with ## symmetric components from a location family spEMsymloc <- function(x, mu0, bw = bw.nrd0(x), h=bw, eps = 1e-8, maxiter=100, stochastic = FALSE, verbose = FALSE){ bw <- h # h is alternative bandwidth argument, for backward compatibility n <- length(x) if (length(mu0)>1) m <- length(mu0) # mu0=centers else m <- mu0 # when mu0=number of clusters z.hat <- matrix(0, nrow=n, ncol=m) fkernel <- matrix(0, nrow=n, ncol=m) tt0 <- proc.time() lambda <- rep(1/m, m) kmeans <- kmeans(x, mu0) for(j in 1:m) { z.hat[kmeans$cluster==j, j] <- 1 } iter <- 0 if (stochastic) { sumpost <- matrix(0, n, m) } finished <- FALSE lambda <- mu <- matrix(0,maxiter,m) while (!finished) { #while (max(abs(change)) > eps & iter < maxiter) { iter <- iter + 1 t0 <- proc.time() ## M-Step lambda[iter,] <- colMeans(z.hat) mu[iter,] <- apply(sweep(z.hat, 1, x, "*"), 2, mean)/lambda[iter,] ## density estimation step if(stochastic){ z <- t(apply(z.hat, 1, function(prob) rmultinom(1, 1, prob))) ans <- .C(C_KDEsymloc, n=as.integer(n), m=as.integer(m), mu=as.double(mu[iter,]), x=as.double(x), bw=as.double(bw), z=as.double(z), f = double(n*m), PACKAGE="mixtools") } else { ans <- .C(C_KDEsymloc, n=as.integer(n), m=as.integer(m), mu=as.double(mu[iter,]), x=as.double(x), bw=as.double(bw), z=as.double(z.hat), f = double(n*m), PACKAGE="mixtools") } fkernel <- matrix(ans$f, ncol=m) lambda.f <- sweep(fkernel, 2, lambda[iter,], "*") ## E-step (for next iteration) z.hat <- lambda.f/rowSums(lambda.f) finished <- iter >= maxiter if (stochastic) { sumpost <- sumpost + z.hat } else if (iter>1) { # This convergence criterion is too simplistic: change <- c(lambda[iter,] - lambda[iter-1,], mu[iter,]-mu[iter-1,]) finished <- finished | (max(abs(change)) < eps) } if (verbose) { t1 <- proc.time() cat("iteration ", iter, " lambda ", round(lambda[iter,], 4), " mu ", round(mu[iter,], 4)) cat(" time", (t1 - t0)[3], "\n") } } if (verbose) { tt1 <- proc.time() cat("lambda ", round(lambda[iter,], 4)) cat(", total time", (tt1 - tt0)[3], "s\n") } if(stochastic) { return(structure(list(data=x, posteriors=sumpost/iter, lambda=lambda, bandwidth=bw, lambdahat=colMeans(lambda), mu = mu, muhat = colMeans(mu), symmetric=TRUE), class="npEM")) } else { return(structure(list(data=x, posteriors=z.hat, lambda=lambda[1:iter,], bandwidth=bw, lambdahat=lambda[iter,], mu = mu[1:iter,], muhat = mu[iter,], symmetric=TRUE), class="npEM")) } } mixtools/R/normalmixEM.R0000755000175100001440000001362714342153463014743 0ustar hornikusers## Use an ECM algorithm (in the sense of Meng and Rubin, Biometrika 1993) ## to search for a local maximum of the likelihood surface for a ## univariate finite mixture of normals with possible equality ## constraints on the mean and stdev parameters. normalmixEM <- function (x, lambda = NULL, mu = NULL, sigma = NULL, k = 2, mean.constr = NULL, sd.constr = NULL, epsilon = 1e-08, maxit = 1000, maxrestarts=20, verb = FALSE, fast=FALSE, ECM = FALSE, arbmean = TRUE, arbvar = TRUE) { warn <- options(warn=-1) # Turn off warnings x <- as.vector(x) tmp <- normalmix.init(x = x, lambda = lambda, mu = mu, s = sigma, k = k, arbmean = arbmean, arbvar = arbvar) lambda <- tmp$lambda mu <- tmp$mu sigma <- tmp$s k <- tmp$k arbvar <- tmp$arbvar arbmean <- tmp$arbmean if (fast==TRUE && k==2 && arbmean==TRUE) { a <- normalmixEM2comp (x, lambda=lambda[1], mu=mu, sigsqrd=sigma^2, eps=epsilon, maxit=maxit, verb=verb) } else { z <- parse.constraints(mean.constr, k=k, allsame=!arbmean) meancat <- z$category; meanalpha <- z$alpha z <- parse.constraints(sd.constr, k=k, allsame=!arbvar) sdcat <- z$category; sdalpha <- z$alpha ECM <- ECM || any(meancat != 1:k) || any(sdcat != 1) n <- length(x) notdone <- TRUE restarts <- 0 while(notdone) { # Initialize everything notdone <- FALSE tmp <- normalmix.init(x = x, lambda = lambda, mu = mu, s = sigma, k = k, arbmean = arbmean, arbvar = arbvar) lambda <- tmp$lambda mu <- tmp$mu k <- tmp$k sigma <- tmp$s var <- sigma^2 diff <- epsilon+1 iter <- 0 postprobs <- matrix(nrow = n, ncol = k) mu <- rep(mu, k)[1:k] sigma <- rep(sigma,k)[1:k] # Initialization E-step here: z <- .C(C_normpost, as.integer(n), as.integer(k), as.double(x), as.double(mu), as.double(sigma), as.double(lambda), res2 = double(n*k), double(3*k), post = double(n*k), loglik = double(1), PACKAGE = "mixtools") postprobs <- matrix(z$post, nrow=n) res <- matrix(z$res2, nrow=n) ll <- obsloglik <- z$loglik while (diff > epsilon && iter < maxit) { # ECM loop, 1st M-step: condition on sigma, update lambda and mu lambda <- colMeans(postprobs) mu[meancat==0] <- meanalpha[meancat==0] if (max(meancat)>0) { for(i in 1:max(meancat)) { w <- which(meancat==i) if (length(w)==1) { mu[w] <- sum(postprobs[,w]*x) / (n*lambda[w]) } else { tmp <- t(postprobs[,w])*(meanalpha[w]/sigma[w]^2) mu[w] <- meanalpha[w] * sum(t(tmp)*x) / sum(tmp*meanalpha[w]) } } } if (ECM) { # If ECM==FALSE, then this is a true EM algorithm and # so we omit the E-step between the mu and sigma updates # E-step number one: z <- .C(C_normpost, as.integer(n), as.integer(k), as.double(x), as.double(mu), as.double(sigma), as.double(lambda), res2 = double(n*k), double(3*k), post = double(n*k), loglik = double(1), PACKAGE = "mixtools") postprobs <- matrix(z$post, nrow=n) res <- matrix(z$res2, nrow=n) # ECM loop, 2nd M-step: condition on mu, update lambda and sigma lambda <- colMeans(postprobs) # Redundant if ECM==FALSE } sigma[sdcat==0] <- sdalpha[sdcat==0] if (max(sdcat)>0) { for(i in 1:max(sdcat)) { w <- which(sdcat==i) if (length(w)==1) { sigma[w] <- sqrt(sum(postprobs[,w]*res[,w]) / (n*lambda[w])) } else { tmp <- t(postprobs[,w]) / sdalpha[w] sigma[w] <- sdalpha[w] * sqrt(sum(t(tmp) * res[,w])/ (n * sum(lambda[w]))) } } if(any(sigma < 1e-08)) { notdone <- TRUE cat("One of the variances is going to zero; ", "trying new starting values.\n") restarts <- restarts + 1 lambda <- mu <- sigma <- NULL if(restarts>maxrestarts) { stop("Too many tries!") } break } } # E-step number two: z <- .C(C_normpost, as.integer(n), as.integer(k), as.double(x), as.double(mu), as.double(sigma), as.double(lambda), res2 = double(n*k), double(3*k), post = double(n*k), loglik = double(1), PACKAGE = "mixtools") postprobs <- matrix(z$post, nrow=n) res <- matrix(z$res2, nrow=n) newobsloglik <- z$loglik diff <- newobsloglik - obsloglik obsloglik <- newobsloglik ll <- c(ll, obsloglik) iter <- iter + 1 if (verb) { cat("iteration =", iter, " log-lik diff =", diff, " log-lik =", obsloglik, "\n") print(rbind(lambda, mu, sigma)) } } } if (iter == maxit) { cat("WARNING! NOT CONVERGENT!", "\n") } cat("number of iterations=", iter, "\n") if(arbmean == FALSE){ scale.order = order(sigma) sigma.min = min(sigma) postprobs = postprobs[,scale.order] colnames(postprobs) <- c(paste("comp", ".", 1:k, sep = "")) a=list(x=x, lambda = lambda[scale.order], mu = mu, sigma = sigma.min, scale = sigma[scale.order]/sigma.min, loglik = obsloglik, posterior = postprobs, all.loglik=ll, restarts=restarts, ft="normalmixEM") } else { colnames(postprobs) <- c(paste("comp", ".", 1:k, sep = "")) a=list(x=x, lambda = lambda, mu = mu, sigma = sigma, loglik = obsloglik, posterior = postprobs, all.loglik=ll, restarts=restarts, ft="normalmixEM") } } class(a) = "mixEM" options(warn) # Reset warnings to original value a } mixtools/R/repnormmixinit.R0000755000175100001440000000212014342153463015561 0ustar hornikusersrepnormmix.init = function (x, lambda = NULL, mu = NULL, s = NULL, k = 2, arbmean = TRUE, arbvar = TRUE) { n <- ncol(x) m <- nrow(x) y <- apply(x, 2, mean) x <- x[, order(y)] x.bin = list() for (j in 1:k) { x.bin[[j]] <- x[, max(1, floor((j - 1) * n/k)):ceiling(j * n/k)] } if (is.null(s)) { s.hyp = sapply(lapply(x.bin, as.vector), sd) if (arbvar) { s = 1/rexp(k, rate = s.hyp) } else { s.hyp = mean(s.hyp) s = 1/rexp(1, rate = s.hyp) } } if (is.null(s) == FALSE && arbvar == TRUE) { k = length(s) } if (is.null(mu)) { mu.hyp <- sapply(lapply(x.bin, as.vector), mean) mu = rnorm(k, mean = mu.hyp, sd = s) if(arbmean==FALSE){ mu = mean(mu) } } if (is.null(mu)==FALSE && arbmean==TRUE){ k = length(mu) } if (is.null(lambda)) { lambda = runif(k) lambda = lambda/sum(lambda) } else k = length(lambda) list(lambda = lambda, mu = mu, s = s, k = k) }mixtools/R/testmixedequality.R0000755000175100001440000000520314342153463016266 0ustar hornikuserstest.equality.mixed=function (y, x = NULL, w = NULL, arb.R = TRUE, arb.sigma = FALSE, lambda = NULL, mu = NULL, sigma = NULL, R = NULL, alpha = NULL, ...) { if (arb.R == arb.sigma) stop("Change either 'arb.R' or 'arb.sigma'!") v = 1 while (v == 1) { if (arb.R) { H0 = regmixEM.mixed(y = y, x = x, w = w, arb.R = TRUE, arb.sigma = FALSE, lambda = lambda, sigma = sigma, mu = mu, R = R, alpha = alpha, ...) p = nrow(H0$posterior.beta[[1]]) k = length(H0$lambda) if (is.null(w)) alpha = NULL else alpha = H0$alpha # n.i=sapply(y,length) # N=length(y) # tmp=apply(H1$posterior.z*n.i,2,sum) # common.sig=sum(tmp/N*H1$sigma) # H1 = regmixEM.mixed(y = y, x = x, w = w, arb.R = TRUE, # arb.sigma = TRUE, lambda = H0$lambda, sigma = rep(H0$sigma,k), # mu = H0$mu, R = H0$R, alpha = alpha, ...) H1 = regmixEM.mixed(y = y, x = x, w = w, arb.R = TRUE, arb.sigma = TRUE, lambda = H0$lambda, sigma = NULL, mu = H0$mu, R = H0$R, alpha = alpha, ...) D = 2 * (H1$loglik - H0$loglik) df = k - 1 alpha = 1 - pchisq(D, df = df) } else { H0 = regmixEM.mixed(y = y, x = x, w = w, arb.R = FALSE, arb.sigma = TRUE, lambda = lambda, sigma = sigma, mu = mu, R = R, alpha = alpha, ...) p = nrow(H0$posterior.beta[[1]]) k = length(H0$lambda) if (is.null(w)) alpha = NULL else alpha = H0$alpha # N=length(y) # tmp=(apply(H1$posterior.z,2,sum))/N # common.R=matrix(0,ncol=p,nrow=p) # for(i in 1:length(H1$lambda)){ # common.R=common.R+tmp[i]*H1$R[[i]] # } # H1 = regmixEM.mixed(y = y, x = x, w = w, arb.R = TRUE, # arb.sigma = TRUE, lambda = H0$lambda, sigma = H0$sigma, # mu = H0$mu, R = lapply(1:k,function(i) H0$R), alpha = alpha, ...) H1 = regmixEM.mixed(y = y, x = x, w = w, arb.R = TRUE, arb.sigma = TRUE, lambda = H0$lambda, sigma = H0$sigma, mu = H0$mu, R = NULL, alpha = alpha, ...) D = 2 * (H1$loglik - H0$loglik) df = p * (p + 1) * (k - 1)/2 alpha = 1 - pchisq(D, df = df) } if (D < 0) { v = 1 lambda=NULL sigma=NULL mu=NULL R=NULL alpha=NULL} else v = 2 } a = list(chi.sq = D, df = df, p.value = alpha) a } mixtools/R/plotly_spRMM.R0000644000175100001440000000750514343052521015101 0ustar hornikusersplotly_spRMM <- function(sem, tmax = NULL, width = 3 , col = '#1f77b4', cex = 3, title.size = 15 , title.x = 0.5 , title.y = 0.95, xlab.size = 15 , xtick.size=15 , ylab.size = 15 , ytick.size=15){ t <- sem$t ym <- max(sem$all.scaling) plot1 <- plot_ly()%>% add_trace(x = seq(from = 1 , to = length(sem$all.scaling) , by = 1), y = sem$all.scaling , type = 'scatter' , mode = 'lines', line = list(width = width , color = col), showlegend = FALSE)%>% plotly::layout( title = list(text = "Scaling", x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = "Iteration", font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = "", font = list(size = ylab.size)), tickfont = list(size = ytick.size), range = c(0,ym) ) ) plot2 <- plot_ly()%>% add_trace(x = seq(from = 1 , to = length(sem$all.lambda[,1]) , by = 1), y = sem$all.lambda[,1] , type = 'scatter' , mode = 'lines', line = list(width = width , color = col), showlegend = FALSE)%>% plotly::layout( title = list(text = "Weight of Component 1", x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = "Iteration", font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = "", font = list(size = ylab.size)), tickfont = list(size = ytick.size), range = c(0,1) ) ) if (is.null(tmax)){tmax <- max(sem$scaling*t) + 2} u <- seq(0, tmax, len=200) fhat <- sem$s.hat(sem$t.hat)*sem$hazard.hat ffinal <- sem$survival(sem$final.t)*sem$hazard plot3 <- plot_ly()%>% add_trace(x = seq(from = 1 , to = length(sem$survival) , by = 1), y = sem$survival , type = 'scatter' , mode = 'markers', marker = list(size = cex , color = col), showlegend = FALSE)%>% plotly::layout( title = list(text = "Survival Function Estimate", x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = "Time", font = list(size = xlab.size)), tickfont = list(size = xtick.size), range = c(0,tmax) ), yaxis = list(title = list(text = "", font = list(size = ylab.size)), tickfont = list(size = ytick.size), range = c(0,1) ) ) plot4 <- plot_ly()%>% add_trace(x = sem$final.t, y = ffinal , type = 'scatter' , mode = 'lines', line = list(width = width , color = col), showlegend = FALSE)%>% plotly::layout( title = list(text = "Density Estimate", x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = "Time", font = list(size = xlab.size)), tickfont = list(size = xtick.size), range = c(0,tmax) ), yaxis = list(title = list(text = "Density", font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) print(plot1) print(plot2) print(plot3) print(plot4) }mixtools/R/plotly_npEM.R0000644000175100001440000001034514343050142014733 0ustar hornikusersplotly_spEM <- plotly_npEM <- function( x, blocks = NULL, hist=TRUE, addlegend=TRUE, scale = TRUE, title=NULL, breaks="Sturges", dens.col = NULL, newplot=TRUE, ylim = NULL , col.hist = "#1f77b4", width = 3, title.x = 0.5 , title.y = 0.95, title.size = 15, xlab = "X" , xlab.size = 15 , xtick.size = 15, ylab = "Density" , ylab.size = 15 , ytick.size = 15, legend.text = "Posteriors", legend.text.size = 15, legend.size = 15 ){ r <- NCOL(x$data) m <- NCOL(x$posteriors) if(is.null(dens.col)){ dens.col <- hue_pal()(m) } if (length(dens.col) > m){ print(paste("Please specify",m,"colors in 'dens.col'.")) } blockid <- x$blockid if (is.null(blocks)) { if(!is.null(blockid)) { blocks <- 1:max(blockid) } else { blocks <- blockid <- 1:r } } ylim.orig <- ylim out <- list(x=list(), y=list()) if (!newplot) { hist <- FALSE } ############################ plot.all <- plot_ly()%>% plotly::layout( legend = list(title=list(text=legend.text, font=list(size=legend.text.size)), font = list(size=legend.size)), title = list(text = "Densities for Different Posteriors", x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = xlab, font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = ylab, font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) for(i in 1:length(blocks)){ coords <- blockid == blocks[i] ylim <- ylim.orig if (is.null(title)) { if (r>1) { tt <- paste(which(coords), collapse=",") tt <- paste("Coordinate", ifelse(sum(coords)>1, "s ", " "), tt, sep="") } else { tt <- "Density Curves" } } else { tt <- rep(title,length(blocks))[i] } dx <- dy <- NULL for (j in 1:m) { d <- density(x, component=j, block=blocks[i], scale=scale) dx <- cbind(dx, d$x) dy <- cbind(dy, d$y) } xx <- as.vector(as.matrix(x$data)[,coords]) if (is.null(ylim)) { ylim=range(dy) if (hist) { ylim[2] <- max(ylim[2], hist(xx, breaks=breaks, plot=FALSE)$density) } } if (newplot){ plot.new <- plot_ly()%>% plotly::layout( legend = list(title=list(text=legend.text, font=list(size=legend.text.size)), font = list(size=legend.size)), title = list(text = tt, x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = xlab, font = list(size = xlab.size)), tickfont = list(size = xtick.size) ), yaxis = list(title = list(text = ylab, font = list(size = ylab.size)), tickfont = list(size = ytick.size) ) ) for (j in 1:m){ plot.new <- plot.new %>% add_trace(x=dx[,j] , y=dy[,j] , type = 'scatter' , mode = 'lines', line = list(width = width , color = dens.col[j]), name = paste("Posterior",j), showlegend = addlegend) } if (hist){ plot.new <- plot.new%>% add_trace(x=xx , type = 'histogram', histnorm = "probability density", name = 'Data' , showlegend = FALSE, marker = list(color = col.hist, line = list(color = col.hist)) )%>% plotly::layout(bargap = 0.01) } print(plot.new) } else { if (i > 1){addlegend <- FALSE} for (j in 1:m){ plot.all <- plot.all %>% add_trace(x=dx[,j] , y=dy[,j] , type = 'scatter' , mode = 'lines', line = list(width = width , color = dens.col[j]), name = paste("Posterior",j), showlegend = addlegend) } } } if (!newplot){print(plot.all)} }mixtools/R/ddirichlet.R0000755000175100001440000000053114342153463014614 0ustar hornikusersddirichlet <- function (x, alpha) { if (length(x) != length(alpha)) stop("Mismatch between dimensions of x and alpha in ddirichlet().\n") logD <- sum(lgamma(alpha)) - lgamma(sum(alpha)) s <- sum((alpha - 1) * log(x)) pd <- exp(sum(s) - logD) pd[any(x < 0 | x > 1)] <- 0 if(sum(x) != 1) pd <- 0 return(pd) }mixtools/R/matsqrt.R0000755000175100001440000000032714342153463014177 0ustar hornikusersmatsqrt <- function(x) { xe <- eigen(x) xe.v <- xe$values if(all(xe.v >= 0)) { xe.v1 <- diag(sqrt(xe.v)) } xvalue <- cbind(xe$vectors) xvalue.1 <- solve(xvalue) out <- xvalue %*% xe.v1 %*% xvalue.1 out } mixtools/R/dmvnorm.R0000755000175100001440000000177514342153463014176 0ustar hornikusers# Alternative version of dmvnorm to eliminate dependence of mixtools # on additional package 'mvtnorm' # Written (hopefully) to be more efficient than mvtnorm version, which uses both # a call to "eigen" and a call to "mahalanobis", by using only a single # call to the more efficient "qr" (read "Note" under ?qr) # Note: These functions assume that each ROW of y is a separate position vector. # i.e., y is assumed to be nxd, where d=dimension dmvnorm <- function(y, mu=NULL, sigma=NULL) { exp(logdmvnorm(y, mu=mu, sigma=sigma)) } logdmvnorm <- function(y, mu=NULL, sigma=NULL) { if (is.vector(y)) y <- matrix(y, nrow=1) d <- ncol(y) if (!is.null(mu)) y <- sweep(y, 2, mu, '-') if (is.null(sigma)) sigma <- diag(d) k <- d * 1.8378770664093454836 # that constant is log(2*pi) a <- qr(sigma) logdet <- sum(log(abs(diag(a$qr)))) if(nrow(y)==1) mahaldist <- as.vector(y %*% qr.solve(a,t(y))) else mahaldist <- rowSums((y %*% qr.solve(a)) * y) -0.5*(mahaldist + logdet + k) } mixtools/R/poisregmixinit.R0000755000175100001440000000206014342153463015552 0ustar hornikuserspoisregmix.init <- function(y, x, lambda = NULL, beta = NULL, k = 2){ x <- as.matrix(x) n <- length(y) if (is.null(lambda)) { cond = TRUE while(cond){ lambda = runif(k) lambda = lambda/sum(lambda) if(min(lambda)<0.05) cond=TRUE else cond=FALSE } } else k = length(lambda) p <- ncol(x) w = cbind(y, x) w = w[order(w[, 1]), ] w.bin = list() for (j in 1:k) { w.bin[[j]] <- w[max(1, floor((j - 1) * n/k)):ceiling(j * n/k), ] } if (is.null(beta)) { beta.hyp = matrix(sapply(1:k, function(j) glm.fit(w.bin[[j]][, 2:(p + 1)], w.bin[[j]][, 1], family = poisson())$coeff), ncol = k) sd.hyp = apply(beta.hyp, 1, sd) beta = matrix(0, p, k) for (j in 1:k) { beta[, j] = rnorm(p, mean = as.vector(beta.hyp[, j]), sd = sd.hyp) } } else k = ncol(beta) list(lambda = lambda, beta = beta, k = k) } mixtools/R/wquantile.R0000755000175100001440000000066014342153463014515 0ustar hornikuserswquantile <- function(wt=rep(1,length(x)), x, probs, already.sorted=FALSE, already.normalized=FALSE) { if(!already.sorted) { wt <- wt[o<-order(x)] x <- x[o] } if(!already.normalized) { wt <- wt/sum(wt) } x[findInterval(probs,cumsum(wt))] } wIQR <- function(wt=rep(1,length(x)), x, already.sorted=FALSE, already.normalized=FALSE) { diff(wquantile(wt, x, c(.25,.75), already.sorted, already.normalized)) } mixtools/R/regcr.R0000755000175100001440000000537314342153463013614 0ustar hornikusers# Produce credible region for regression lines based on # sample from posterior distribution of beta parameters. # It is assumed that beta, upon entry, is an nx2 matrix, # where the first column gives the intercepts and the # second column gives the slopes. # alpha is the proportion of beta to remove from the posterior. # Thus, 1-alpha is the level of the credible region. # # If nonparametric=TRUE, then the region is based on the convex # hull of the remaining beta after trimming, which is accomplished # using a data depth technique. # # If nonparametric=FALSE, then the region is based on the # asymptotic normal approximation. regcr=function (beta, x, em.beta=NULL, em.sigma=NULL, alpha = 0.05, nonparametric = FALSE, plot = FALSE, xyaxes = TRUE, ...) { if (nonparametric) { beta.old=beta if(is.null(em.sigma) && is.null(em.beta)){ beta=t(matsqrt(solve(cov(beta)))%*%(t(beta)-apply(beta,2,mean))) } else beta=1/sqrt(length(x))*t(em.sigma^(-1)*matsqrt(t(cbind(1,x))%*%cbind(1,x))%*%(t(beta.old)-em.beta)) d = depth(beta, beta) beta = beta.old[order(d), ] d = d[order(d)] n = length(d) trimbeta = beta[-(1:round(n * alpha)), ] h = unique(trimbeta[chull(trimbeta), ]) nh = nrow(h) m = which.max(h[, 2]) h = rbind(h[m:nh, ], h[((1:nh) < m), ], h[m, ]) bound = NULL for (i in 1:nh) { bound = rbind(bound, h[i, ]) bound = rbind(bound, cbind(seq(h[i, 1], h[i + 1, 1], len = 50), seq(h[i, 2], h[i + 1, 2], len = 50))) } beta=trimbeta } else { xbar = apply(beta, 2, mean) n = nrow(beta) cbeta = t(t(beta) - xbar) S = t(cbeta) %*% cbeta/(n - 1) eS = eigen(S) B = eS$vec %*% diag(sqrt(eS$val)) theta = seq(0, 2 * pi, len = 250) v = cbind(cos(theta), sin(theta)) * sqrt(qchisq(1 - alpha, 2)) h = t(B %*% t(v) + xbar) nh = nrow(h) m = which.max(h[, 2]) h = rbind(h[m:nh, ], h[((1:nh) < m), ], h[m, ]) bound = h } z <- length(x) * 5 u <- seq(min(x), max(x), length = z) lower <- c() upper <- c() v <- c() for (j in 1:z) { for (i in 1:nrow(beta)) { v[i] <- as.matrix(beta[, 1][i] + beta[, 2][i] * u[j]) } uv <- cbind(u[j], v) lower <- rbind(lower, uv[order(v), ][1, ]) upper <- rbind(upper, uv[order(v), ][nrow(beta), ]) } if (plot) { if (xyaxes) { lines(upper, ...) lines(lower, ...) } else { lines(bound, ...) } } invisible(list(boundary = bound, upper = upper, lower = lower)) } mixtools/R/normalmixMMlc.R0000644000175100001440000001767114342153463015272 0ustar hornikusers################################################################### ## "EC-MM" algorithm ## to search for a local maximum of the likelihood surface for a ## univariate finite mixture of normals with possible ## linear constraints on the mean and variance parameters. ## ## (EC-MM is ECM in the sense of Meng and Rubin, ## Biometrika 1993, where the M step is replaced by a ## Conditional MM step) ## ## version allowing for linear constraints on the mean ## mu = M beta + C, where M is matrix(k,p) and C is vector() ## C-MM step required for the linear constraint on the Variances ## var.lincstr = matrix A (k,q) s.t. iv = A g, where "i"nverse "v"ar ## iv = k-vector of 1/v_j's, and g = q-vector of unknown parameters ## no fast option, & ECM-MM algorithm forced (no ECM option available) ## init values for gparam are *required* here for the MM algorithm ## # default value for A could be diag(k) so that iv=g normalmixMMlc <- function (x, lambda = NULL, mu = NULL, sigma = NULL, k = 2, mean.constr = NULL, mean.lincstr = NULL, mean.constant = NULL, var.lincstr = NULL, gparam = NULL, epsilon = 1e-08, maxit = 1000, maxrestarts=20, verb = FALSE) { ECM <- TRUE # always required in this case A <- var.lincstr x <- as.vector(x); n <- length(x) tmp <- normalmix.init(x = x, lambda = lambda, mu = mu, s = sigma, k = k) # no arbmean & arbvar parameters lambda <- tmp$lambda; mu <- tmp$mu; sigma <- tmp$s; k <- tmp$k # arbvar <- tmp$arbvar; arbmean <- tmp$arbmean arbmean <- arbvar <- TRUE # forced for parse.constraints() warn <- options(warn=-1) # Turn off warnings (for parsing only) z <- parse.constraints(mean.constr, k=k, allsame=!arbmean) options(warn) # Reset warnings to original value meancat <- z$category; meanalpha <- z$alpha if (!is.null(mean.lincstr)) { # linear constraint on the means M <- mean.lincstr cat("linear constraint mu = M beta + C version\n") p <- dim(M)[2] # nb of columns = size of constr. mean parameter if (dim(M)[1] != k) stop("mean.lincstr and mu dimensions must agree") if (is.null(mean.constant)) C <- matrix(0,k,1) else C <- matrix(mean.constant,k,1) } notdone <- TRUE while(notdone) { # Initialize everything notdone <- FALSE tmp <- normalmix.init(x=x, lambda=lambda, mu=mu, s=sigma, k=k) lambda <- tmp$lambda; mu <- tmp$mu; k <- tmp$k; sigma <- tmp$s q <- dim(A)[2] # nb of inverse variance parameters (gamma) if(is.null(gparam)) g <- rexp(q) else g <- gparam iv <- A %*% g # inverse variances, as a one-column matrix v <- 1/iv # is it necessary to redefined sigma from g here ? sigma <- as.vector(sqrt(v)) diff <- epsilon+1 iter <- 0 postprobs <- matrix(nrow = n, ncol = k) restarts <- 0 mu <- rep(mu, k)[1:k] # is this useful? sigma <- rep(sigma,k)[1:k] # sigma still needed for post computation ## Initialization E-step here: z <- .C(C_normpost, as.integer(n), as.integer(k), as.double(x), as.double(mu), as.double(sigma), as.double(lambda), res2 = double(n*k), double(3*k), post = double(n*k), loglik = double(1), PACKAGE = "mixtools") postprobs <- matrix(z$post, nrow=n) res <- matrix(z$res2, nrow=n) # n,m matrix of squared residuals (x_i-mu_j)^2 ll <- obsloglik <- z$loglik ## EC-MM iterations while (diff > epsilon && iter < maxit) { # ECM loop, 1st M-step: condition on sigma, update lambda and mu : lambda <- colMeans(postprobs) # update for lambda # update for mu, depending on constraint type mu[meancat==0] <- meanalpha[meancat==0] if (max(meancat)>0 && is.null(mean.lincstr)) { # simple constraint for(i in 1:max(meancat)) { w <- which(meancat==i) if (length(w)==1) { mu[w] <- sum(postprobs[,w]*x) / (n*lambda[w]) } else { tmp <- t(postprobs[,w])*(meanalpha[w]/sigma[w]^2) mu[w] <- meanalpha[w] * sum(t(tmp)*x) / sum(tmp*meanalpha[w]) } } } if (!is.null(mean.lincstr)) { # linear constraint mu = M beta + C iv2 <- as.vector(iv) # A1_j = sum_i p_ij x_i/v_j A1 <- apply(postprobs*matrix(x,n,k),2,sum)*iv2 B <- diag(apply(postprobs,2,sum)*iv2) Stemp <- solve(t(M) %*% B %*% M) beta <- Stemp %*% t(M) %*% (A1 - B %*% C) mu <- as.vector(M %*% beta + C) # coerce to vector } # ECM E-step number one: z <- .C(C_normpost, as.integer(n), as.integer(k), as.double(x), as.double(mu), as.double(sigma), as.double(lambda), res2 = double(n*k), double(3*k), post = double(n*k), loglik = double(1), PACKAGE = "mixtools") postprobs <- matrix(z$post, nrow=n) res <- matrix(z$res2, nrow=n) #### ECM loop 2nd M-step: condition on mu, update lambda #### and sigma via the MM step lambda <- colMeans(postprobs) # Update variances with the MM algo on g, conditional on mu # note: code in too much steps/details for debugging # computing q-vector of denominators r0 <- postprobs*res # (i,j)th is p_{ij}*(x_i - mu_j)^2 r1 <- r0 %*% A # r1(n,q) matrix, (i,l) term =\sum_j p_{ij}A_{jl}(x_i - mu_j)^2 den <- colSums(r1) # q-vector of denominators for updating g # computing q-vector of numerators r3 <- matrix(v,nrow=k,ncol=q)*A # (k,q) matrix of v_j.A_{jl} r4 <- postprobs %*% r3 # (n,q) matrix of \sum_j p_{ij} A_{jl} v_j num <- colSums(r4) # # update of gamma parameters which gives iv, v and sigma g.new <- g*(num/den) iv <- A %*% g.new v <- 1/iv # needed for next computation of r3 sigma <- as.vector(sqrt(v)) # needed in next E-steps g <- g.new # iterates ## test for variance degeneration if(any(sigma < 1e-08)) { notdone <- TRUE cat("One of the variances is going to zero; ", "trying new starting values.\n") restarts <- restarts + 1 lambda <- mu <- sigma <- NULL # WHAT TO DO WITH g in this case? if(restarts>maxrestarts) { stop("Too many tries!") } break } # ECM E-step number two: z <- .C(C_normpost, as.integer(n), as.integer(k), as.double(x), as.double(mu), as.double(sigma), as.double(lambda), res2 = double(n*k), double(3*k), post = double(n*k), loglik = double(1), PACKAGE = "mixtools") postprobs <- matrix(z$post, nrow=n) res <- matrix(z$res2, nrow=n) newobsloglik <- z$loglik diff <- newobsloglik - obsloglik # does not increase that one? obsloglik <- newobsloglik ll <- c(ll, obsloglik) iter <- iter + 1 if (verb) { cat("iteration", iter, ": log-lik diff =", round(diff,4), " log-lik =", obsloglik, "\n") } } } # summurizing and returning structure if (iter == maxit) { cat("WARNING! NOT CONVERGENT!", "\n") } cat("number of iterations=", iter, "\n") if(arbmean == FALSE){ scale.order = order(sigma) sigma.min = min(sigma) postprobs = postprobs[,scale.order] colnames(postprobs) <- c(paste("comp", ".", 1:k, sep = "")) a=list(x=x, lambda = lambda[scale.order], mu = mu, sigma = sigma.min, scale = sigma[scale.order]/sigma.min, loglik = obsloglik, posterior = postprobs, all.loglik=ll, restarts=restarts, gamma = g, ft="normalmixMMlc") } else { colnames(postprobs) <- c(paste("comp", ".", 1:k, sep = "")) a=list(x=x, lambda = lambda, mu = mu, sigma = sigma, loglik = obsloglik, posterior = postprobs, all.loglik=ll, restarts=restarts, beta = beta, gamma = g, ft="normalmixMMlc") } class(a) = "mixEM" a } mixtools/R/bootcomp.R0000755000175100001440000007723314343147341014337 0ustar hornikusersboot.comp <- function (y, x = NULL, N = NULL, max.comp = 2, B = 100, sig = 0.05, arbmean = TRUE, arbvar = TRUE, mix.type = c("logisregmix", "multmix", "mvnormalmix", "normalmix", "poisregmix", "regmix", "regmix.mixed", "repnormmix"), hist = TRUE, ...) { mix.type <- match.arg(mix.type) k = max.comp p = 0 sigtest = 1 Q.star = list() i = 0 if (mix.type == "regmix") { Q0 = 0 Q1 = 0 obs.Q = 0 i = 1 while (sigtest == 1 && i <= k) { Q.star[[i]] = 0 if (i == 1) { w = 1 while (w == 1) { H0.fit = lm(y ~ x) beta = coef(H0.fit) Q0[i] = as.numeric(logLik(H0.fit)) H1.fit = try(regmixEM(y = y, x = x, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(H1.fit, "try-error", which = TRUE)) { w = 1 } else { Q1[i] = H1.fit$loglik obs.Q[i] = 2 * (Q1[i] - Q0[i]) if (obs.Q[i] < 0) w = 1 else w = 2 beta = coef(H0.fit) xbeta = cbind(1, x) %*% beta xy.sd = sqrt(sum(H0.fit$res^2)/(length(y) - 2)) j = 0 } } while (j < B) { j = j + 1 y.sim = rnorm(length(y), mean = xbeta, sd = xy.sd) xy.simout = lm(y.sim ~ x) em.out = try(regmixEM(y = y.sim, x = x, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(em.out, "try-error", which = TRUE)) { j = j - 1 } else { Q.star[[i]][j] = 2 * (em.out$loglik - as.numeric(logLik(xy.simout))) if (Q.star[[i]][j] < 0) { j = j - 1 } } } } else { w = 1 while (w == 1) { H0.fit = try(regmixEM(y = y, x = x, k = i, arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) H1.fit = try(regmixEM(y = y, x = x, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(H0.fit, "try-error", which = TRUE) || inherits(H1.fit, "try-error", which = TRUE)) { w = 1 } else { Q0[i] = H0.fit$loglik if (arbmean == FALSE) { scale = H0.fit$scale beta = matrix(rep(H0.fit$beta, i), ncol = i) } else { scale = 1 } Q1[i] = H1.fit$loglik obs.Q[i] = 2 * (Q1[i] - Q0[i]) if (obs.Q[i] < 0) w = 1 else w = 2 } beta.new = H0.fit$beta xbeta.new = cbind(1, x) %*% beta.new j = 0 } while (j < B) { j = j + 1 wt = rmultinom(length(y), size = 1, prob = H0.fit$lambda) if (arbmean == FALSE) { y.sim = sapply(1:length(y), function(i) rnorm(1, mean = xbeta.new, sd = ((scale * H0.fit$sigma)[wt[, i] == 1]))) } else { if (arbvar == FALSE) { y.sim = sapply(1:length(y), function(i) rnorm(1, mean = xbeta.new[i, (wt[, i] == 1)], sd = H0.fit$sigma)) } else { y.sim = sapply(1:length(y), function(i) rnorm(1, mean = xbeta.new[i, (wt[, i] == 1)], sd = H0.fit$sigma[wt[, i] == 1])) } } em.out.0 = try(regmixEM(y = y.sim, x = x, k = i, arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) em.out.1 = try(regmixEM(y = y.sim, x = x, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(em.out.0, "try-error", which = TRUE) || inherits(em.out.1, "try-error", which = TRUE)) { j = j - 1 } else { Q.star[[i]][j] = 2 * (em.out.1$loglik - em.out.0$loglik) if (Q.star[[i]][j] < 0) { j = j - 1 } } } } p[i] = mean(Q.star[[i]] >= obs.Q[i]) sigtest = (p[i] < sig) i = i + 1 } } if (mix.type == "repnormmix") { Q0 = 0 Q1 = 0 obs.Q = 0 i = 1 while (sigtest == 1 && i <= k) { Q.star[[i]] = 0 if (i == 1) { w = 1 while (w == 1) { dens = dnorm(y, mean = mean(y), sd = sd(y)) Q0[i] = sum(log(dens[dens > 0])) H1.fit = try(repnormmixEM(x = y, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(H1.fit, "try-error", which = TRUE)) { w = 1 } else { Q1[i] = H1.fit$loglik obs.Q[i] = 2 * (Q1[i] - Q0[i]) if (obs.Q[i] < 0) { w = 1 } else { w = 2 } j = 0 } } while (j < B) { j = j + 1 y.sim = rmvnormmix(nrow(y), mu = rep(mean(y), ncol(y)), sigma = rep(sd(y), ncol(y))) dens.sim = dnorm(y.sim, mean = mean(y), sd = sd(y)) x.simout = sum(log(dens.sim[dens.sim > 0])) em.out = try(repnormmixEM(x = y.sim, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(em.out, "try-error", which = TRUE)) { j = j - 1 } else { Q.star[[i]][j] = 2 * (em.out$loglik - x.simout) if (Q.star[[i]][j] < 0) { j = j - 1 } } } } else { w = 1 while (w == 1) { H0.fit = try(repnormmixEM(x = y, k = i, arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) H1.fit = try(repnormmixEM(x = y, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(H0.fit, "try-error", which = TRUE) || inherits(H1.fit, "try-error", which = TRUE)) { w = 1 } else { Q0[i] = H0.fit$loglik if (arbmean == FALSE) scale = H0.fit$scale else scale = 1 Q1[i] = H1.fit$loglik obs.Q[i] = 2 * (Q1[i] - Q0[i]) if (obs.Q[i] < 0) { w = 1 } else { w = 2 } } j = 0 } while (j < B) { j = j + 1 wt = rmultinom(length(y), size = 1, prob = H0.fit$lambda) if (arbmean == FALSE) { y.sim = sapply(1:ncol(y), function(i) rnorm(nrow(y), mean = H0.fit$mu, sd = ((scale * H0.fit$sigma)[wt[, i] == 1]))) } else { if (arbvar == FALSE) { y.sim = sapply(1:ncol(y), function(i) rnorm(nrow(y), mean = H0.fit$mu[wt[, i] == 1], sd = H0.fit$sigma)) } else { y.sim = sapply(1:ncol(y), function(i) rnorm(nrow(y), mean = H0.fit$mu[wt[, i] == 1], sd = H0.fit$sigma[wt[, i] == 1])) } } em.out.0 = try(repnormmixEM(x = y.sim, k = i, arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) em.out.1 = try(repnormmixEM(x = y.sim, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(em.out.0, "try-error", which = TRUE) || inherits(em.out.1, "try-error", which = TRUE)) { j = j - 1 } else { Q.star[[i]][j] = 2 * (em.out.1$loglik - em.out.0$loglik) if (Q.star[[i]][j] < 0) { j = j - 1 } } } } p[i] = mean(Q.star[[i]] >= obs.Q[i]) sigtest = (p[i] < sig) i = i + 1 } } if (mix.type == "regmix.mixed") { if (is.list(y)) { if (length(y) != length(x)) stop("Number of elements in lists for x and y must match!") } tt = sapply(1:length(x), function(i) x[[i]][, 1]) beta = t(sapply(1:length(y), function(i) lm(y[[i]] ~ x[[i]])$coef)) y = beta mix.type = "mvnormalmix" } if (mix.type == "mvnormalmix") { Q0 = 0 Q1 = 0 obs.Q = 0 i = 1 while (sigtest == 1 && i <= k) { Q.star[[i]] = 0 if (i == 1) { w = 1 while (w == 1) { y.mean = apply(y, 2, mean) y.cov = cov(y) dens = dmvnorm(y, mu = y.mean, sigma = y.cov) Q0[i] = sum(log(dens[dens > 0])) H1.fit = try(mvnormalmixEM(x = y, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(H1.fit, "try-error", which = TRUE)) { w = 1 } else { Q1[i] = H1.fit$loglik obs.Q[i] = 2 * (Q1[i] - Q0[i]) if (obs.Q[i] < 0) w = 1 else w = 2 j = 0 } } while (j < B) { j = j + 1 y.sim = rmvnorm(nrow(y), mu = apply(y, 2, mean), sigma = y.cov) dens.sim = dmvnorm(y.sim, mu = y.mean, sigma = y.cov) y.simout = sum(log(dens.sim[dens.sim > 0])) em.out = try(mvnormalmixEM(x = y.sim, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(em.out, "try-error", which = TRUE)) { j = j - 1 } else { Q.star[[i]][j] = 2 * (em.out$loglik - y.simout) if (Q.star[[i]][j] < 0) { j = j - 1 } } } } else { w = 1 while (w == 1) { H0.fit = try(mvnormalmixEM(x = y, k = i, ...), silent = TRUE) H1.fit = try(mvnormalmixEM(x = y, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(H0.fit, "try-error", which = TRUE) || inherits(H1.fit, "try-error", which = TRUE)) { w = 1 } else { Q0[i] = H0.fit$loglik if (arbmean == FALSE) { H0.fit$mu = lapply(1:i, function(l) H0.fit$mu) } if (arbvar == FALSE) { H0.fit$sigma = lapply(1:i, function(l) H0.fit$sigma) } Q1[i] = H1.fit$loglik obs.Q[i] = 2 * (Q1[i] - Q0[i]) if (obs.Q[i] < 0) { w = 1 } else { w = 2 } } j <- 0 } while (j < B) { j = j + 1 wt = rmultinom(nrow(y), size = 1, prob = H0.fit$lambda) if (arbmean == FALSE) { y.sim = t(sapply(1:nrow(y), function(i) rmvnorm(1, mu = H0.fit$mu, sigma = H0.fit$sigma[wt[, i] == 1][[1]]))) } else { if (arbvar == FALSE) { y.sim = t(sapply(1:nrow(y), function(i) rmvnorm(1, mu = H0.fit$mu[wt[, i] == 1][[1]], sigma = H0.fit$sigma))) } else { y.sim = t(sapply(1:nrow(y), function(i) rmvnorm(1, mu = H0.fit$mu[wt[, i] == 1][[1]], sigma = H0.fit$sigma[wt[, i] == 1][[1]]))) } } em.out.0 = try(mvnormalmixEM(x = y.sim, k = i, arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) em.out.1 = try(mvnormalmixEM(x = y.sim, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(em.out.0, "try-error", which = TRUE) || inherits(em.out.1, "try-error", which = TRUE)) { j = j - 1 } else { Q.star[[i]][j] = 2 * (em.out.1$loglik - em.out.0$loglik) if (Q.star[[i]][j] < 0) { j = j - 1 } } } } p[i] = mean(Q.star[[i]] >= obs.Q[i]) sigtest = (p[i] < sig) i = i + 1 } } if (mix.type == "normalmix") { Q0 = 0 Q1 = 0 obs.Q = 0 i = 1 while (sigtest == 1 && i <= k) { Q.star[[i]] = 0 if (i == 1) { w = 1 while (w == 1) { dens = dnorm(y, mean = mean(y), sd = sd(y)) Q0[i] = sum(log(dens[dens > 0])) H1.fit = try(normalmixEM(x = y, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(H1.fit, "try-error", which = TRUE)) { w = 1 } else { Q1[i] = H1.fit$loglik obs.Q[i] = 2 * (Q1[i] - Q0[i]) if (obs.Q[i] < 0) { w = 1 } else { w = 2 } j = 0 } } while (j < B) { j = j + 1 y.sim = rnorm(length(y), mean = mean(y), sd = sd(y)) dens.sim = dnorm(y.sim, mean = mean(y), sd = sd(y)) x.simout = sum(log(dens.sim[dens.sim > 0])) em.out = try(normalmixEM(x = y.sim, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(em.out, "try-error", which = TRUE)) { j = j - 1 } else { Q.star[[i]][j] = 2 * (em.out$loglik - x.simout) if (Q.star[[i]][j] < 0) { j = j - 1 } } } } else { w = 1 while (w == 1) { H0.fit = try(normalmixEM(x = y, k = i, arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) H1.fit = try(normalmixEM(x = y, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(H0.fit, "try-error", which = TRUE) || inherits(H1.fit, "try-error", which = TRUE)) { w = 1 } else { Q0[i] = H0.fit$loglik if (arbmean == FALSE) scale = H0.fit$scale else scale = 1 Q1[i] = H1.fit$loglik obs.Q[i] = 2 * (Q1[i] - Q0[i]) if (obs.Q[i] < 0) { w = 1 } else { w = 2 } } j = 0 } while (j < B) { j = j + 1 wt = rmultinom(length(y), size = 1, prob = H0.fit$lambda) if (arbmean == FALSE) { y.sim = sapply(1:length(y), function(i) rnorm(1, mean = H0.fit$mu, sd = ((scale * H0.fit$sigma)[wt[, i] == 1]))) } else { if (arbvar == FALSE) { y.sim = sapply(1:length(y), function(i) rnorm(1, mean = H0.fit$mu[(wt[, i] == 1)], sd = H0.fit$sigma)) } else { y.sim = sapply(1:length(y), function(i) rnorm(1, mean = H0.fit$mu[(wt[, i] == 1)], sd = H0.fit$sigma[wt[, i] == 1])) } } em.out.0 = try(normalmixEM(x = y.sim, k = i, arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) em.out.1 = try(normalmixEM(x = y.sim, k = (i + 1), arbmean = arbmean, arbvar = arbvar, ...), silent = TRUE) if (inherits(em.out.0, "try-error", which = TRUE) || inherits(em.out.1, "try-error", which = TRUE)) { j = j - 1 } else { Q.star[[i]][j] = 2 * (em.out.1$loglik - em.out.0$loglik) if (Q.star[[i]][j] < 0) { j = j - 1 } } } } p[i] = mean(Q.star[[i]] >= obs.Q[i]) sigtest = (p[i] < sig) i = i + 1 } } if (mix.type == "multmix") { Q0 = 0 Q1 = 0 obs.Q = 0 i = 1 while (sigtest == 1 && i <= k) { Q.star[[i]] = 0 if (i == 1) { w = 1 while (w == 1) { m = apply(y, 1, sum) n.i = apply(y, 2, sum) theta = n.i/sum(n.i) Q0[i] = sum(log(exp(apply(y, 1, ldmult, theta = theta)))) H1.fit = try(multmixEM(y = y, k = (i + 1), ...), silent = TRUE) if (inherits(H1.fit, "try-error", which = TRUE)) { w = 1 } else { Q1[i] = H1.fit$loglik obs.Q[i] = 2 * (Q1[i] - Q0[i]) if (obs.Q[i] < 0) { w = 1 } else { w = 2 } j = 0 } } while (j < B) { j = j + 1 y.sim = matrix(0, ncol = ncol(y), nrow = nrow(y)) for (l in 1:length(m)) { y.sim[l, ] <- rmultinom(1, size = m[l], prob = theta) } theta.sim = apply(y.sim, 2, sum)/sum(apply(y.sim, 2, sum)) y.simout = sum(log(exp(apply(y.sim, 1, ldmult, theta = theta)))) em.out = try(multmixEM(y = y.sim, k = (i + 1), ...), silent = TRUE) if (inherits(em.out, "try-error", which = TRUE)) { j = j - 1 } else { Q.star[[i]][j] = 2 * (em.out$loglik - y.simout) if (Q.star[[i]][j] < 0) { j = j - 1 } } } } else { w = 1 while (w == 1) { H0.fit = try(multmixEM(y = y, k = i, ...), silent = TRUE) H1.fit = try(multmixEM(y = y, k = (i + 1), ...), silent = TRUE) if (inherits(H0.fit, "try-error", which = TRUE) || inherits(H1.fit, "try-error", which = TRUE)) { w = 1 } else { theta = H0.fit$theta Q0[i] = H0.fit$loglik Q1[i] = H1.fit$loglik obs.Q[i] = 2 * (Q1[i] - Q0[i]) if (obs.Q[i] < 0) { w = 1 } else { w = 2 } } j = 0 } while (j < B) { j = j + 1 wt = rmultinom(nrow(y), size = 1, prob = H0.fit$lambda) # y.sim = t(sapply(1:nrow(y), function(i) rmultinom(1, # size = n.i[i], prob = H0.fit$theta[(wt[, # i] == 1), ]))) new.y.sim = t(sapply(1:nrow(y), function(i) rmultinom(1, size = n.i, prob = H0.fit$theta[(wt[, i] == 1), ]))) # new.y.sim = 0 em.out.0 = try(multmixEM(y = new.y.sim, k = i, ...), silent = TRUE) em.out.1 = try(multmixEM(y = new.y.sim, k = (i + 1), ...), silent = TRUE) if (inherits(em.out.0, "try-error", which = TRUE) || inherits(em.out.1, "try-error", which = TRUE)) { j = j - 1 } else { Q.star[[i]][j] = 2 * (em.out.1$loglik - em.out.0$loglik) Q.star[[i]][j] if (Q.star[[i]][j] < 0) { j = j - 1 } } } } p[i] = mean(Q.star[[i]] >= obs.Q[i]) sigtest = (p[i] < sig) i = i + 1 } } if (mix.type == "logisregmix") { if (is.null(N)) stop("Number of trials must be specified!") Q0 = 0 Q1 = 0 obs.Q = 0 i = 1 while (sigtest == 1 && i <= k) { Q.star[[i]] = 0 if (i == 1) { w = 1 while (w == 1) { H0.fit = glm(cbind(y, N - y) ~ x, family = binomial()) Q0[i] = logLik(H0.fit) H1.fit = try(logisregmixEM(y = y, x = x, N = N, k = (i + 1), ...), silent = TRUE) if (inherits(H1.fit, "try-error", which = TRUE)) { w = 1 } else { Q1[i] = H1.fit$loglik obs.Q[i] = 2 * (Q1[i] - Q0[i]) if (obs.Q[i] < 0) { w = 1 } else { w = 2 } beta = coef(H0.fit) xbeta = cbind(1, x) %*% beta j = 0 } } while (j < B) { j = j + 1 y.sim = rbinom(length(y), size = N, prob = inv.logit(xbeta)) xy.simout = glm(cbind(y.sim, N - y.sim) ~ x, family = binomial()) em.out = try(logisregmixEM(y = y.sim, x = x, N = N, k = (i + 1), ...), silent = TRUE) if (inherits(em.out, "try-error", which = TRUE)) { j = j - 1 } else { Q.star[[i]][j] = 2 * (em.out$loglik - logLik(xy.simout)) if (Q.star[[i]][j] < 0) { j = j - 1 } } } } else { w = 1 while (w == 1) { H0.fit = try(logisregmixEM(y = y, x = x, N = N, k = i, ...), silent = TRUE) H1.fit = try(logisregmixEM(y = y, x = x, N = N, k = (i + 1), ...), silent = TRUE) if (inherits(H0.fit, "try-error", which = TRUE) || inherits(H1.fit, "try-error", which = TRUE)) { w = 1 } else { Q0[i] = H0.fit$loglik Q1[i] = H1.fit$loglik obs.Q[i] = 2 * (Q1[i] - Q0[i]) if (obs.Q[i] < 0) { w = 1 } else { w = 2 } beta = H0.fit$beta xbeta = cbind(1, x) %*% beta } j = 0 } while (j < B) { j = j + 1 wt = rmultinom(length(y), size = 1, prob = H0.fit$lambda) y.sim = sapply(1:length(y), function(i) rbinom(1, size = N[i], prob = inv.logit(xbeta)[, (wt[, i] == 1)])) em.out.0 = try(logisregmixEM(y = y.sim, x = x, N = N, k = i, ...), silent = TRUE) em.out.1 = try(logisregmixEM(y = y.sim, x = x, N = N, k = (i + 1), ...), silent = TRUE) if (inherits(em.out.0, "try-error", which = TRUE) || inherits(em.out.1, "try-error", which = TRUE)) { j = j - 1 } else { Q.star[[i]][j] = 2 * (em.out.1$loglik - em.out.0$loglik) if (Q.star[[i]][j] < 0) { j = j - 1 } } } } p[i] = mean(Q.star[[i]] >= obs.Q[i]) sigtest = (p[i] < sig) i = i + 1 } } if (mix.type == "poisregmix") { Q0 = 0 Q1 = 0 obs.Q = 0 i = 1 while (sigtest == 1 && i <= k) { Q.star[[i]] = 0 if (i == 1) { w = 1 while (w == 1) { H0.fit = glm(y ~ x, family = poisson()) Q0[i] = logLik(H0.fit) H1.fit = try(poisregmixEM(y = y, x = x, k = (i + 1), ...), silent = TRUE) if (inherits(H1.fit, "try-error", which = TRUE)) { w = 1 } else { Q1[i] = H1.fit$loglik obs.Q[i] = 2 * (Q1[i] - Q0[i]) if (obs.Q[i] < 0) { w = 1 } else { w = 2 } beta = coef(H0.fit) xbeta = cbind(1, x) %*% beta j = 0 } } while (j < B) { j = j + 1 y.sim = rpois(length(y), lambda = exp(xbeta)) xy.simout = glm(y.sim ~ x, family = poisson()) em.out = try(poisregmixEM(y = y.sim, x = x, k = (i + 1), ...), silent = TRUE) if (inherits(em.out, "try-error", which = TRUE)) { j = j - 1 } else { Q.star[[i]][j] = 2 * (em.out$loglik - logLik(xy.simout)) if (Q.star[[i]][j] < 0) { j = j - 1 } } } } else { w = 1 while (w == 1) { H0.fit = try(poisregmixEM(y = y, x = x, k = i, ...), silent = TRUE) H1.fit = try(poisregmixEM(y = y, x = x, k = (i + 1), ...), silent = TRUE) if (inherits(H0.fit, "try-error", which = TRUE) || inherits(H1.fit, "try-error", which = TRUE)) { w = 1 } else { Q0[i] = H0.fit$loglik Q1[i] = H1.fit$loglik obs.Q[i] = 2 * (Q1[i] - Q0[i]) if (obs.Q[i] < 0) { w = 1 } else { w = 2 } beta = H0.fit$beta xbeta = cbind(1, x) %*% beta } j = 0 } while (j < B) { j = j + 1 wt = rmultinom(length(y), size = 1, prob = H0.fit$lambda) y.sim = sapply(1:length(y), function(i) rpois(1, lambda = exp(xbeta)[, (wt[, i] == 1)])) em.out.0 = try(poisregmixEM(y = y.sim, x = x, k = i, ...), silent = TRUE) em.out.1 = try(poisregmixEM(y = y.sim, x = x, k = (i + 1), ...), silent = TRUE) if (inherits(em.out.0, "try-error", which = TRUE) || inherits(em.out.1, "try-error", which = TRUE)) { j = j - 1 } else { Q.star[[i]][j] = 2 * (em.out.1$loglik - em.out.0$loglik) if (Q.star[[i]][j] < 0) { j = j - 1 } } } } p[i] = mean(Q.star[[i]] >= obs.Q[i]) sigtest = (p[i] < sig) i = i + 1 } } if (hist) { if (length(p) == 2) { par(mfrow = c(1, 2)) for (i in 1:length(p)) { hist(Q.star[[i]], xlab = c("Bootstrap Likelihood", "Ratio Statistic"), main = paste(i, "versus", i + 1, "Components")) segments(obs.Q[i], 0, obs.Q[i], B, col = 2, lwd = 2) } } else { g = ceiling(sqrt(length(p))) par(mfrow = c(g, g)) for (i in 1:length(p)) { hist(Q.star[[i]], xlab = c("Bootstrap Likelihood", "Ratio Statistic"), main = paste(i, "versus", i + 1, "Components")) segments(obs.Q[i], 0, obs.Q[i], B, col = 2, lwd = 2) } } } if (p[length(p)] < sig) { cat("Decision: Select", length(p) + 1, "Component(s)", "\n") } else { cat("Decision: Select", length(p), "Component(s)", "\n") } list(p.values = p, log.lik = Q.star, obs.log.lik = obs.Q) }mixtools/R/plotly_mixturegram.R0000644000175100001440000002017614343046315016452 0ustar hornikusersplotly_mixturegram <- function( data, pmbs, method=c("pca","kpca","lda"), all.n=FALSE, id.con=NULL, score=1, iter.max=50, nstart=25, xlab = "K" , xlab.size = 15 , xtick.size = 15, ylab = NULL , ylab.size = 15 , ytick.size = 15, cex = 12 , col.dot = "red" , width = 1 , title = "Mixturegram" , title.size = 15 , title.x = 0.5 , title.y = 0.95 ){ vline <- function(x = 0, color = '#1f77b4') { list( type = "line", y0 = 0, y1 = 1, yref = "paper", x0 = x, x1 = x, line = list(color = '#1f77b4', dash = "dash", width = 1) ) } col.blind=rep(c("#000000", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7", "#7FFF00","#7D26CD"),100) method <- match.arg(method) if(is.null(ylab)){ if (method == "pca"){ylab <- "PC Scores"} else if (method == "kpca"){ylab <- "Kernel PC Scores"} else if (method == "lda"){ylab <- "LDC Scores"} } k=length(pmbs)+1 if (is.null(id.con)) {id.con=lapply(pmbs,function(x) data%*%x/apply(x,2,sum))} ### Find ylim: lim ### ### Regular PCA ### if(method=="pca"){ x.star=c(list(data), lapply(1:(k-1), function(i) cbind(data,pmbs[[i]][,order(id.con[[i]])]))) Data=lapply(x.star,scale) if(score>(ncol(Data[[1]])+1)) { warning(paste("The largest value that can be specified for 'score' is ", ncol(Data[[1]])+1, ", which is what will be used for the mixturegram.",sep="")) } score<-min(score,ncol(x.star[[2]])) if(score==1){ PCA=lapply(Data,function(x) x%*%princomp(x)$loadings[,score]) } else{ PCA <- vector("list",k) PCA[[1]]=Data[[1]]%*%princomp(Data[[1]])$loadings[,1] PCA[2:k]=lapply(1:(k-1),function(i) Data[[(i+1)]]%*%princomp(Data[[(i+1)]])$loadings[,score]) } K=lapply(2:k,function(i) kmeans(PCA[[i]],i,iter.max=iter.max,nstart=nstart)) lim=ceiling(max(abs(unlist(PCA)))) mix.method <- PCA }else{ ### Kernel PCA ### if(method=="kpca"){ x.star=c(list(data), lapply(1:(k-1), function(i) cbind(data,pmbs[[i]][,order(id.con[[i]])]))) Data=lapply(x.star,scale) if(score>(ncol(Data[[1]])+1)) warning(paste("The largest value that can be specified for 'score' is ",ncol(Data[[1]])+1,", which is what will be used for the mixturegram.",sep="")) score<-min(score,ncol(x.star[[2]])) if(score==1){ kPCA=lapply(Data,function(x) cbind(pcv(kpca(x))[,1])) } else{ kPCA <- vector("list",k) kPCA[[1]]=cbind(pcv(kpca(Data[[1]]))[,1]) kPCA[2:k]=lapply(1:(k-1),function(i) cbind(pcv(kpca(Data[[i+1]]))[,score])) } K=lapply(2:k,function(i) kmeans(kPCA[[i]],i,iter.max=iter.max,nstart=nstart)) lim=max(abs(unlist(kPCA)))+0.1 mix.method <- kPCA } else if(method=="lda"){ class=lapply(pmbs, function(post) apply(post,1,which.max)) ldcdata = c(list(as.matrix(data) %*% ldc(data, rep(1,nrow(as.matrix(data))),score=score)), lapply(class, function(class) as.matrix(data) %*% ldc(data, class,score=score))) K=lapply(2:k,function(i) kmeans(ldcdata[[i]],i,iter.max=iter.max,nstart=nstart)) lim=ceiling(max(abs(unlist(ldcdata)))) mix.method <- ldcdata } } plot <- plot_ly()%>% plotly::layout( title = list(text = title, x = title.x, y = title.y, font = list(size=title.size)), xaxis = list(title = list(text = xlab, font = list(size = xlab.size)), tickfont = list(size = xtick.size), range = c(0.25,k+0.25), dtick = 1, tick0 = 1, tickmode = "linear" ), yaxis = list(title = list(text = ylab, font = list(size = ylab.size)), tickfont = list(size = ytick.size), range = c(-lim, lim) ), shapes = lapply(1:k , function(i){vline(i)}) ) Kcol=function(x){ temp=unlist(sapply(1:length(x$size),function(i) rep(rank(x$center)[i],x$size[i]))) index=unlist(sapply(1:length(x$size),function(i) which(x$cluster==i))) K.col=replace(x$cluster,index,temp) } all.K.col=lapply(1:(k-1), function(i) Kcol(K[[i]])) K.col=all.K.col[[k-1]] n=length(K.col) K.centers=c(0, lapply(1:(k-1), function(i) sort(c(K[[i]]$centers)))) if (all.n){ for (i in 1:(k-1)){ for (j in 1:length(mix.method[[i]])){ plot <- plot%>% add_trace(x=c(i , i+1) , y=c(mix.method[[i]][j] , mix.method[[i+1]][j]) , type = 'scatter' , mode = 'lines', line = list(width = width , color = col.blind[K.col][j]), name = paste("Method" , i),showlegend = FALSE) } } for (q in 2:k){ plot <- plot%>% add_trace(x=rep(q,q), y=sort(c(K[[q-1]]$centers)) , type = 'scatter' , mode = 'markers', marker = list(size = cex , color = col.dot), name = paste("Cluster" , q), showlegend = FALSE) } plot <- plot%>% add_trace(x=1, y=mean(mix.method[[1]]) , type = 'scatter' , mode = 'markers', marker = list(size = cex , color = col.dot), name = "Cluster 1",showlegend = FALSE) } else{ ride.medians=sapply(1:k, function(i) unlist(by(c(mix.method[[i]]),col.blind[K.col],median))) prop.mad=sapply(1:k, function(i) unlist(by(c(mix.method[[i]]),col.blind[K.col],mad))) L1=ride.medians-prop.mad U1=ride.medians+prop.mad L2=ride.medians-2*prop.mad U2=ride.medians+2*prop.mad L3=ride.medians-3*prop.mad U3=ride.medians+3*prop.mad srt.colors=rownames(ride.medians) srt.colors1=adjustcolor(srt.colors, alpha.f = 0.7) srt.colors2=adjustcolor(srt.colors, alpha.f = 0.4) srt.colors3=adjustcolor(srt.colors, alpha.f = 0.2) for (l in 1:k){ plot <- plot%>% add_trace( x = c(1:k,k:1), y = c(L3[l,],rev(U3[l,])), type = 'scatter', mode = "lines", fill = 'tozeroy', ## fill type fillcolor = srt.colors3[l], hoveron = 'points+fills', line = list( color = srt.colors3[l] ), text = "Points + Fills", hoverinfo = 'text', showlegend = FALSE )%>% add_trace( x = c(1:k,k:1), y = c(L2[l,],rev(U2[l,])), type = 'scatter', mode = "lines", fill = 'tozeroy', ## fill type fillcolor = srt.colors2[l], hoveron = 'points+fills', line = list( color = srt.colors2[l] ), text = "Points + Fills", hoverinfo = 'text', showlegend = FALSE )%>% add_trace( x = c(1:k,k:1), y = c(L1[l,],rev(U1[l,])), type = 'scatter', mode = "lines", fill = 'tozeroy', ## fill type fillcolor = srt.colors1[l], hoveron = 'points+fills', line = list( color = srt.colors1[l] ), text = "Points + Fills", hoverinfo = 'text', showlegend = FALSE ) } # for (h in 1:(k-1)){ # plot <- plot%>% # add_trace(x=c(rep(h,k),rep((h+1),k)) , # y=c(ride.medians[,h] , ride.medians[,(h+1)]) , type = 'scatter' , mode = 'lines', # line = list(width = width , color = srt.colors), # showlegend = FALSE) # } for (j in 2:k){ plot <- plot%>% add_trace(x=rep(j,j), y=sort(c(K[[j-1]]$centers)) , type = 'scatter' , mode = 'markers', marker = list(size = cex , color = col.dot), name = paste("Cluster" , j),showlegend = FALSE) } plot <- plot%>% add_trace(x=1, y=mean(mix.method[[1]]) , type = 'scatter' , mode = 'markers', marker = list(size = cex , color = col.dot), name = "Cluster 1",showlegend = FALSE) } print(plot) props=c(1,sapply(1:length(K), function(i) K[[i]][[5]]/sum(unlist(K[[i]][5:6])))) print(list(stopping=props)) } mixtools/R/wkde.R0000755000175100001440000000045214342153463013435 0ustar hornikuserswkde <- function(x, u=x, w=rep(1, length(x)), bw=bw.nrd0(as.vector(x)), sym=FALSE) { if (sym) { return((wkde(x, u, w, bw) + wkde(x, -u, w, bw))/2) } Km <- exp(outer(x/bw, u/bw, function(a,b) -(a-b)^2/2)) normw <- matrix(w/sum(w), nrow=1) as.vector(normw %*% Km) / (bw * sqrt(2*pi)) } mixtools/R/regmixEMlambdainit.R0000755000175100001440000000341114342153463016243 0ustar hornikusersregmix.lambda.init = function (y, x, lambda = NULL, beta = NULL, s = NULL, k = 2, addintercept = TRUE, arbmean = TRUE, arbvar = TRUE) { x <- as.matrix(x) n <- length(y) p <- ncol(x) if (addintercept) { x = x[, -1] } else x = x w = cbind(y, x) w = w[order(w[, 1]), ] w.bin = list() for (j in 1:k) { w.bin[[j]] <- w[max(1, floor((j - 1) * n/k)):ceiling(j * n/k), ] } if (addintercept) { lm.out <- lapply(1:k, function(i) lm(w.bin[[i]][, 1] ~ w.bin[[i]][, 2:p])) } else lm.out <- lapply(1:k, function(i) lm(w.bin[[i]][, 1] ~ w.bin[[i]][, 2:(p + 1)] - 1)) if (is.null(s)) { s.hyp = lapply(lm.out, anova) s.hyp = as.vector(sqrt(sapply(1:k, function(i) s.hyp[[i]]$Mean[length(s.hyp[[i]]$Mean)]))) if (arbvar) { s = 1/rexp(k, rate = s.hyp) } else { s.hyp = mean(s.hyp) s = 1/rexp(1, rate = s.hyp) } } if (is.null(s) == FALSE && arbvar == TRUE) { k = length(s) } if (is.null(beta)) { beta.hyp = matrix(sapply(lm.out, coef), ncol = k) beta = matrix(0, nrow = p, ncol = k) for (j in 1:k) { beta[, j] = rnorm(p, mean = as.vector(beta.hyp[, j]), sd = s[arbvar * j + (1 - arbvar)]) } if (arbmean == FALSE) { beta = apply(beta, 1, mean) } } if (is.null(beta) == FALSE && arbmean == TRUE) { k = ncol(beta) } if (is.null(lambda)) { lam = runif(k) lam = lam/sum(lam) for(i in 1:n) {lambda <- rbind(lambda,lam)} } else k = ncol(lambda) list(lambda = lambda, beta = beta, s = s, k = k) }mixtools/R/ldmult.R0000755000175100001440000000107114342153463014002 0ustar hornikusers########################################################################### # log density function of multinomial count vector y with parameter theta # ########################################################################### ldmult<-function(y,theta){ if (any(is.nan(theta)) || any(theta==0)) { # stop ("The theta parameter cannot have a zero component.") out = -Inf } else { if (length(y)==length(theta)+1) theta=c(theta,1-sum(theta)) out=lgamma(1+sum(y)) - sum(lgamma(1+y)) + sum(y*log(theta)) } out } mixtools/R/plotly_mixMCMC.R0000644000175100001440000001204214343041265015333 0ustar hornikusersplotly_mixMCMC <- function( x , trace.plot = TRUE , summary.plot = FALSE , burnin = 2000, credit.region = 0.95, col.cr = NULL, cex.trace = 3 , width.trace = 3 , cex.summary = 3 , width.summary = 1, title.trace = "", title.trace.x = 0.5 , title.trace.y = 0.95, title.trace.size = 15, xlab.trace = "Index" , xlab.trace.size = 15, xtick.trace.size = 15, ylab.trace = NULL , ylab.trace.size = 15, ytick.trace.size = 15, title.summary = "Credible Regions", title.summary.x = 0.5 , title.summary.y = 0.95, title.summary.size = 15, xlab.summary = "Predictor" , xlab.summary.size = 15, xtick.summary.size = 15, ylab.summary = "Response" , ylab.summary.size = 15, ytick.summary.size = 15 ){ mix.object <- x if (!inherits(mix.object, "mixMCMC")){ stop("Use only with \"mixMCMC\" objects!") } if (trace.plot){ k<-mix.object$components theta<-mix.object$theta p.k=ncol(theta) p=p.k/k name.theta<-colnames(theta) for (i in 1:dim(theta)[2]){ if (is.null(ylab.trace)){ ylab.trace <- name.theta[i] } plot.trace <- plot_ly()%>% add_trace(x=seq(from = 1 , to = dim(theta)[1] , by=1) , y=theta[,i] , type = 'scatter' , mode = 'lines+markers', marker = list(size = cex.trace), line = list(width = width.trace), showlegend = FALSE) %>% plotly::layout( title = list(text = title.trace, x = title.trace.x, y = title.trace.y, font = list(size=title.trace.size)), xaxis = list(title = list(text = xlab.trace, font = list(size = xlab.trace.size)), tickfont = list(size = xtick.trace.size)), yaxis = list(title = list(text = ylab.trace, font = list(size = ylab.trace.size)), tickfont = list(size = ytick.trace.size)) ) print(plot.trace) } } if(is.matrix(mix.object$x) == TRUE && is.null(mix.object$y) == FALSE && summary.plot == TRUE){ y<-mix.object$y n<-length(y) x<-mix.object$x p<-ncol(x) k<-mix.object$components theta<-mix.object$theta if(p!=2 || sum(x[,1])!=n){ stop(paste("This only works for simple linear regression!","\n")) } plot.summary <- plot_ly()%>% add_trace(x=x[,2] , y=y , type = 'scatter' , mode = 'markers', marker = list(size = cex.summary), showlegend = FALSE) %>% plotly::layout( title = list(text = paste(credit.region*100, "% " , title.summary ,sep = ""), x = title.summary.x, y = title.summary.y, font = list(size=title.summary.size)), xaxis = list(title = list(text = xlab.summary, font = list(size = xlab.summary.size)), tickfont = list(size = xtick.summary.size) ), yaxis = list(title = list(text = ylab.summary, font = list(size = ylab.summary.size)), tickfont = list(size = ytick.summary.size) ) ) if(is.null(col.cr)){ col.cr <- hue_pal()(k) } if (length(col.cr) != k){ print(paste("Please specify",k,"colors in 'col.cr'.")) } for (i in 1:k){ beta.summary <- cbind(theta[-c(1:burnin),2*i-1],theta[-c(1:burnin),2*i]) xbar = apply(beta.summary, 2, mean) n = nrow(beta.summary) cbeta = t(t(beta.summary) - xbar) S = t(cbeta) %*% cbeta/(n - 1) eS = eigen(S) B = eS$vec %*% diag(sqrt(eS$val)) theta.summary = seq(0, 2 * pi, len = 250) alpha = 1-credit.region v = cbind(cos(theta.summary), sin(theta.summary)) * sqrt(qchisq(1 - alpha,2)) h = t(B %*% t(v) + xbar) nh = nrow(h) m = which.max(h[, 2]) h = rbind(h[m:nh, ], h[((1:nh) < m), ], h[m, ]) bound = h x.summary <- x[,2] z <- length(x.summary) * 5 u <- seq(min(x.summary), max(x.summary), length = z) lower <- c() upper <- c() v <- c() for (q in 1:z) { for (l in 1:nrow(beta.summary)) { v[l] <- as.matrix(beta.summary[, 1][l] + beta.summary[, 2][l] * u[q]) } uv <- cbind(u[q], v) lower <- rbind(lower, uv[order(v), ][1, ]) upper <- rbind(upper, uv[order(v), ][nrow(beta.summary), ]) } plot.summary <- plot.summary%>% add_trace(x=lower[,1] , y=lower[,2] , type = 'scatter' , mode = 'lines', line = list(width = width.summary , color = col.cr[i]), name = paste("Lower Bound for Component",i), showlegend = FALSE)%>% add_trace(x=upper[,1] , y=upper[,2] , type = 'scatter' , mode = 'lines', line = list(width = width.summary , color = col.cr[i]), name = paste("Upper Bound for Component",i), showlegend = FALSE) } print(plot.summary) } }mixtools/R/regmixEM.R0000755000175100001440000001432714342153463014226 0ustar hornikusersregmixEM = function (y, x, lambda = NULL, beta = NULL, sigma = NULL, k = 2, addintercept = TRUE, arbmean = TRUE, arbvar = TRUE, epsilon = 1e-08, maxit = 10000, verb = FALSE) { if(arbmean == FALSE && arbvar == FALSE){ stop(paste("Must change constraints on beta and/or sigma!","\n")) } s = sigma if (addintercept) { x = cbind(1, x) } n <- length(y) p <- ncol(x) tmp <- regmix.init(y = y, x = x, lambda = lambda, beta = beta, s = s, k = k, addintercept = addintercept, arbmean = arbmean, arbvar = arbvar) lambda <- tmp$lambda beta <- tmp$beta s <- tmp$s k <- tmp$k diff <- 1 iter <- 0 xbeta <- x %*% beta res <- (y - xbeta)^2 if(arbmean == FALSE){ res <- sapply(1:k,function(i) res) } # comp <- lapply(1:k, function(i) lambda[i] * dnorm(y, xbeta[,i * arbmean + (1 - arbmean)], # s[i * arbvar + (1 - arbvar)])) # comp <- sapply(comp, cbind) # compsum <- apply(comp, 1, sum) # obsloglik <- sum(log(compsum)) comp <- t((lambda/sqrt(2 * pi * s^2)) * t(exp(-t(t(res)/(2 * s^2))))) obsloglik <- sum(log(apply(comp, 1, sum))) ll <- obsloglik z = matrix(nrow = n, ncol = k) restarts <- 0 while (diff > epsilon && iter < maxit) { for (i in 1:n) { for (j in 1:k) { z.denom = c() for (h in 1:k) { z.denom = c(z.denom, (lambda[h]/lambda[j]) * (s[j * arbvar + (1 - arbvar)]/s[h * arbvar + (1 - arbvar)]) * exp(-0.5 * ((1/s[h * arbvar + (1 - arbvar)]^2) * res[i, h] - (1/s[j * arbvar + (1 - arbvar)]^2) * res[i, j]))) } z[i, j] = 1/sum(z.denom) } } # z[,k]=1-apply(as.matrix(z[,(1:(k-1))]),1,sum) z = z/apply(z,1,sum) lambda.new <- apply(z, 2, mean) if (sum(lambda.new < 1e-08)>0 || is.na(sum(lambda.new))) { sing <- 1 } else { if (arbmean == FALSE) { if (addintercept) { beta.new <- lm(y~x[,-1],weights=apply(t(t(z)/(s^2)),1,sum))$coef } else beta.new <- lm(y~x-1,weights=apply(t(t(z)/(s^2)),1,sum))$coef # beta.new <- sapply(lm.out, coef) # beta.new1 <- apply(t(apply(z,2,sum)*t(beta.new)),1,sum)/n # beta.new2 <- lm(y~x[,-1],weights=apply(t(t(z)/(s^2)),1,sum))$coef # beta.new<-as.vector(solve(t(x) %*% sweep(x, 1, t(t(z)/(s^2)), "*")) %*% apply(t(t(z)/(s^2))*y*x,2,sum) ) } else { if (addintercept) { lm.out <- lapply(1:k, function(i) lm(y ~ x[, -1], weights = z[, i])) } else lm.out <- lapply(1:k, function(i) lm(y ~ x - 1, weights = z[, i])) beta.new <- sapply(lm.out, coef) } xbeta.new <- x %*% beta.new res <- (y - xbeta.new)^2 if(arbmean == FALSE){ res <- sapply(1:k,function(i) res) } if (arbvar) { s.new <- sqrt(sapply(1:k, function(i) sum(z[, i] * (res[, i]))/sum(z[, i]))) } else s.new <- sqrt(sum(z * res)/n) lambda <- lambda.new beta <- beta.new xbeta <- x%*%beta s <- s.new sing <- sum(s < 1e-08) comp <- lapply(1:k, function(i) lambda[i] * dnorm(y, xbeta[,i * arbmean + (1 - arbmean)], s[i * arbvar + (1 - arbvar)])) comp <- sapply(comp, cbind) compsum <- apply(comp, 1, sum) newobsloglik <- sum(log(compsum)) # comp <- t((lambda/sqrt(2 * pi * s^2)) * t(exp(-t(t(res)/(2 * # s^2))))) # newobsloglik <- sum(log(apply(comp, 1, sum))) } if (sing > 0 || is.na(newobsloglik) || newobsloglik < obsloglik || abs(newobsloglik) == Inf){# || sum(z) != n) { cat("Need new starting values due to singularity...", "\n") restarts <- restarts + 1 if(restarts>15) stop("Too many tries!") tmp <- regmix.init(y = y, x = x, k = k, addintercept = addintercept, arbmean = arbmean, arbvar = arbvar) lambda <- tmp$lambda beta <- tmp$beta s <- tmp$s k <- tmp$k diff <- 1 iter <- 0 xbeta <- x %*% beta res <- (y - xbeta)^2 if(arbmean == FALSE){ res <- sapply(1:k,function(i) res) } # comp <- lapply(1:k, function(i) lambda[i] * dnorm(y, xbeta[,i * arbmean + (1 - arbmean)], # s[i * arbvar + (1 - arbvar)])) # comp <- sapply(comp, cbind) # compsum <- apply(comp, 1, sum) # obsloglik <- sum(log(compsum)) comp <- t((lambda/sqrt(2 * pi * s^2)) * t(exp(-t(t(res)/(2 * s^2))))) obsloglik <- sum(log(apply(comp, 1, sum))) ll <- obsloglik } else { diff <- newobsloglik - obsloglik obsloglik <- newobsloglik ll <- c(ll, obsloglik) iter <- iter + 1 if (verb) { cat("iteration=", iter, "diff=", diff, "log-likelihood", obsloglik, "\n") } } } scale.order = order(s) sigma.min = min(s) if (iter == maxit) { cat("WARNING! NOT CONVERGENT!", "\n") } cat("number of iterations=", iter, "\n") if(arbmean == FALSE){ z=z[,scale.order] names(beta) <- c(paste("beta", ".", 0:(p-1), sep = "")) colnames(z) <- c(paste("comp", ".", 1:k, sep = "")) a=list(x=x, y=y, lambda = lambda[scale.order], beta = beta, sigma = sigma.min, scale = s[scale.order]/sigma.min, loglik = obsloglik, posterior = z[,scale.order], all.loglik=ll, restarts = restarts, ft="regmixEM") class(a) = "mixEM" a } else { rownames(beta) <- c(paste("beta", ".", 0:(p-1), sep = "")) colnames(beta) <- c(paste("comp", ".", 1:k, sep = "")) colnames(z) <- c(paste("comp", ".", 1:k, sep = "")) a=list(x=x, y=y, lambda = lambda, beta = beta, sigma = s, loglik = obsloglik, posterior = z, all.loglik=ll, restarts = restarts, ft="regmixEM") class(a) = "mixEM" a } }mixtools/R/repnormmixEM.R0000755000175100001440000001176614342153463015137 0ustar hornikusersrepnormmixEM = function (x, lambda = NULL, mu = NULL, sigma = NULL, k = 2, arbmean = TRUE, arbvar = TRUE, epsilon = 1e-08, maxit = 10000, verb = FALSE) { if(arbmean == FALSE && arbvar == FALSE){ stop(paste("Must change constraints on mu and/or sigma!","\n")) } s = sigma n <- ncol(x) m <- nrow(x) tmp <- repnormmix.init(x = x, lambda = lambda, mu = mu, s = s, k = k, arbmean = arbmean, arbvar = arbvar) lambda <- tmp$lambda mu <- tmp$mu s <- tmp$s s.2 <- s^2 k <- tmp$k diff <- 1 iter <- 0 res <- lapply(1:k, function(i) (x - mu[i * arbmean + (1 - arbmean)])^2) comp <- lapply(1:k, function(i) lambda[i] * (2 * pi * s.2[i * arbvar + (1 - arbvar)])^(-m/2) * exp(-0.5 * apply(res[[i]], 2, sum)/s.2[i * arbvar + (1 - arbvar)])) obsloglik <- sum(log(apply(sapply(comp, rbind), 1, sum))) ll <- obsloglik restarts <- 0 while (diff > epsilon & iter < maxit) { xmu <- lapply(1:k, function(i) apply(res[[i]], 2, sum)) z = matrix(nrow = n, ncol = k) for (i in 1:n) { for (j in 1:k) { z.denom = c() for (h in 1:k) { z.denom = c(z.denom, lambda[h]/lambda[j] * (s[j * arbvar + (1 - arbvar)]/s[h * arbvar + (1 - arbvar)])^m * exp(-0.5 * ((1/s[h * arbvar + (1 - arbvar)]^2) * xmu[[h]][i] - (1/s[j * arbvar + (1 - arbvar)]^2) * xmu[[j]][i]))) } z[i, j] = 1/sum(z.denom) } } z = z/apply(z,1,sum) # z[,k]=1-apply(as.matrix(z[,(1:(k-1))]),1,sum) lambda.new <- apply(z, 2, mean) if (sum(lambda.new < 1e-08)>0 || is.na(sum(lambda.new))) { sing <- 1 } else { if(arbmean){ mu.new <- sapply(1:k, function(i) sum(t(z[, i] * t(x))))/(m * apply(z, 2, sum)) } else { mu.new <- sum(sapply(1:k, function(i) sum(t(z[, i] * t(x)))))/(m * n) } res <- lapply(1:k, function(i) (x - mu.new[i * arbmean + (1 - arbmean)])^2) if (arbvar) { s.new <- sqrt(sapply(1:k, function(i) sum(t(z[, i] * t(res[[i]]))))/(m * apply(z, 2, sum))) } else s.new <- sqrt(sum(sapply(1:k, function(i) sum(t(z[, i] * t(res[[i]])))))/(m * n)) lambda <- lambda.new mu <- mu.new s <- s.new s.2 <- s^2 sing <- sum(is.nan(z)) comp <- lapply(1:k, function(i) lambda[i] * (2 * pi * s.2[i * arbvar + (1 - arbvar)])^(-m/2) * exp(-0.5 * apply(res[[i]], 2, sum)/s.2[i * arbvar + (1 - arbvar)])) newobsloglik <- sum(log(apply(sapply(comp, rbind), 1, sum))) } if (sing > 0 || is.na(newobsloglik) || abs(newobsloglik) == Inf ){#|| sum(z) != n) { cat("Need new starting values due to singularity...", "\n") restarts <- restarts + 1 if(restarts>15) stop("Too many tries!") tmp <- repnormmix.init(x = x, k = k, arbmean = arbmean, arbvar = arbvar) lambda <- tmp$lambda mu <- tmp$mu s <- tmp$s s.2 <- s^2 k <- tmp$k diff <- 1 iter <- 0 res <- lapply(1:k, function(i) (x - mu[i * arbmean + (1 - arbmean)])^2) comp <- lapply(1:k, function(i) lambda[i] * (2 * pi * s.2[i * arbvar + (1 - arbvar)])^(-m/2) * exp(-0.5 * apply(res[[i]], 2, sum)/s.2[i * arbvar + (1 - arbvar)])) obsloglik <- sum(log(apply(sapply(comp, rbind), 1, sum))) ll <- obsloglik } else { diff <- newobsloglik - obsloglik obsloglik <- newobsloglik ll <- c(ll, obsloglik) iter <- iter + 1 if (verb) { cat("iteration=", iter, "diff=", diff, "log-likelihood", obsloglik, "\n") } } } scale.order = order(s) sigma.min = min(s) if (iter == maxit) { cat("WARNING! NOT CONVERGENT!", "\n") } cat("number of iterations=", iter, "\n") if(arbmean == FALSE){ z = z[,scale.order] colnames(z) <- c(paste("comp", ".", 1:k, sep = "")) a=list(x=as.data.frame(x), lambda = lambda[scale.order], mu = mu, sigma = sigma.min, scale = s[scale.order]/sigma.min, loglik = obsloglik, posterior = z[,scale.order], all.loglik=ll, restarts = restarts, ft="repnormmixEM") class(a) = "mixEM" a } else { colnames(z) <- c(paste("comp", ".", 1:k, sep = "")) a=list(x=as.data.frame(x), lambda = lambda, mu = mu, sigma = s, loglik = obsloglik, posterior = z, all.loglik=ll, restarts = restarts, ft="repnormmixEM") class(a) = "mixEM" a } } mixtools/R/summary.mixEM.R0000644000175100001440000000514014342153463015212 0ustar hornikuserssummary.mixEM <- function(object, digits=6, ...){ x <- object o <- switch(x$ft, "multmixEM" = rbind(x$lambda, t(x$theta)), "normalmixEM" = rbind(x$lambda, x$mu, x$sigma), "repnormmixEM" = rbind(x$lambda, x$mu, x$sigma), "regmixEM" = rbind(x$lambda, x$sigma, x$beta), "regmixEM.lambda" = rbind(x$lambda, x$sigma, x$beta), "regmixEM.mixed" = rbind(x$lambda, x$sigma, x$beta), "regmixEM.loc" = rbind(x$sigma, x$beta), "regmixEM.chgpt" = rbind(x$lambda, x$sigma), "logisregmixEM" = rbind(x$lambda, x$beta), "poisregmixEM" = rbind(x$lambda, x$beta), "expRMM_EM" = rbind(x$lambda, x$rate), # Reliability Mixt Model censored exp mixture "weibullRMM_SEM" = rbind(x$lambda, x$shape, x$scale), # RMM censored weibull mixture "mvnormalmixEM" = rbind(x$lambda, matrix(unlist(x$mu), byrow=FALSE, ncol=length(x$lambda))), "normalmixMMlc" = rbind(x$lambda, x$mu, x$sigma), stop("Unknown mixEM object of type ", x$ft)) colnames(o) <- paste("comp",1:ncol(o)) rownames(o) <- switch(x$ft, "multmixEM" = c("lambda", paste("theta", 1:ncol(x$theta), sep="")), "normalmixEM" = c("lambda", "mu", "sigma"), "repnormmixEM" = c("lambda", "mu", "sigma"), "regmixEM" = c("lambda", "sigma", paste("beta", 1:nrow(x$beta), sep="")), "regmixEM.lambda" = c("lambda", "sigma", paste("beta", 1:nrow(x$beta), sep="")), "regmixEM.mixed" = c("lambda", "sigma", paste("beta", 1:nrow(x$beta), sep="")), "regmixEM.loc" = c("sigma", paste("beta", 1:nrow(x$beta), sep="")), "regmixEM.chgpt" = c("lambda", "sigma"), "logisregmixEM" = c("lambda", paste("beta", 1:nrow(x$beta), sep="")), "poisregmixEM" = c("lambda", paste("beta", 1:nrow(x$beta), sep="")), "expRMM_EM" = c("lambda", "rate"), "weibullRMM_SEM" = c("lambda", "shape", "scale"), "mvnormalmixEM" = c("lambda", paste("mu", 1:length(x$mu[[1]]), sep="")), "normalmixMMlc" = c("lambda", "mu", "sigma")) cat("summary of", x$ft, "object:\n") print(o, digits=digits) cat("loglik at estimate: ", x$loglik, "\n") if (x$ft == "expRMM_EM") cat(100*(1-mean(x$d)), "% of the data right censored\n") if (x$ft == "weibullRMM_SEM") cat(100*(1-mean(x$d)), "% of the data right censored\n") } mixtools/R/regmixmixedinit.R0000755000175100001440000000720614342153463015715 0ustar hornikusersregmix.mixed.init <- function(y,x,w=NULL,sigma=NULL,arb.sigma=TRUE, alpha=NULL,lambda=NULL,mu=NULL,R=NULL,arb.R=TRUE,k=2,mixed=FALSE, addintercept.fixed=FALSE,addintercept.random=TRUE){ N <- length(y) n <- sapply(y, length) p <- ncol(x[[1]]) if (addintercept.random) { x = lapply(1:N, function(i) as.matrix(x[[i]][,-1])) } else x=x if(is.null(w)==FALSE && sum(sapply(w,sum))!=0){ q <- ncol(w[[1]]) } if (mixed == TRUE && is.null(alpha)==TRUE) { if (addintercept.fixed) { w.1 = list() w.1 = lapply(1:N,function(i) w[[i]][,-1]) lm.out = lapply(1:N,function(i) lm(y[[i]]~w.1[[i]])) alpha.hyp = apply(matrix(sapply(lm.out,coef),ncol=N),1,mean) sd.hyp = lapply(lm.out,anova) sd.hyp = mean(as.vector(sqrt(sapply(1:N,function(i) sd.hyp[[i]]$Mean[length(sd.hyp[[i]]$Mean)])))) alpha = rnorm(q, mean=alpha.hyp, sd=sd.hyp) } else { w.1 = w lm.out = lapply(1:N,function(i) lm(y[[i]]~w.1[[i]]-1)) alpha.hyp = apply(matrix(sapply(lm.out,coef),ncol=N),1,mean) sd.hyp = lapply(lm.out,anova) sd.hyp = mean(as.vector(sqrt(sapply(1:N,function(i) sd.hyp[[i]]$Mean[length(sd.hyp[[i]]$Mean)])))) alpha = rnorm(q, mean=alpha.hyp, sd=sd.hyp) } } if(mixed==FALSE) { alpha = 0 } y.x = lapply(1:N, function(i) cbind(y[[i]],x[[i]])) a = order(sapply(1:N, function(i) mean(y[[i]]))) y.x = lapply(1:N,function(i) y.x[[a[i]]]) y.x.bin.list = list() y.x.bin = list() for(j in 1:k){ y.x.bin.list[[j]] <- y.x[max(1,floor((j-1)*N/k)):ceiling(j*N/k)] y.x.2 <- NULL for(i in 1:length(y.x.bin.list[[j]])){ y.x.2 <- rbind(y.x.2,y.x.bin.list[[j]][[i]]) } y.x.bin[[j]] <- y.x.2 } if(addintercept.random){ lm.out <- lapply(1:k, function(i) lm(y.x.bin[[i]][,1]~y.x.bin[[i]][,2:p])) lm.out.beta <- lapply(1:k, function(j) lapply(1:length(y.x.bin.list[[j]]), function(i) lm(y.x.bin.list[[j]][[i]][,1]~y.x.bin.list[[j]][[i]][,2:p]))) beta <- lapply(1:k,function(j) matrix(sapply(lm.out.beta[[j]],coef),nrow=p)) } else { lm.out <- lapply(1:k, function(i) lm(y.x.bin[[i]][,1]~y.x.bin[[i]][,2:(p+1)]-1)) lm.out.beta <- lapply(1:k, function(j) lapply(1:length(y.x.bin.list[[j]]), function(i) lm(y.x.bin.list[[j]][[i]][,1]~y.x.bin.list[[j]][[i]][,2:(p+1)]-1))) beta <- lapply(1:k,function(j) matrix(sapply(lm.out.beta[[j]],coef),nrow=p)) } if(is.null(sigma)) { sigma.hyp = lapply(lm.out,anova) sigma.hyp = as.vector(sqrt(sapply(1:k,function(i) sigma.hyp[[i]]$Mean[length(sigma.hyp[[i]]$Mean)]))) if(arb.sigma) { sigma=1/rexp(k,rate=sigma.hyp) } else { sigma.hyp=mean(sigma.hyp) sigma=1/rexp(1,rate=sigma.hyp) } } if(is.null(sigma)==FALSE && arb.sigma==TRUE) { k=length(sigma) } if(is.null(R)) { if(arb.R) { R.hyp = lapply(1:k,function(i) (apply(beta[[i]],1,var))^-1) R=lapply(1:k,function(i) diag(1/rexp(p,rate=R.hyp[[i]]),p)) } else { R.hyp = apply(matrix(sapply(1:k,function(i) (apply(beta[[i]],1,var))^-1),ncol=k),2,mean) R = diag(1/rexp(p,rate=sigma.hyp),p) } } if(is.null(R)==FALSE && arb.R==TRUE) { k=length(R) } if (is.null(mu)) { mu.hyp = lapply(1:k,function(i) apply(beta[[i]],1,mean)) mu = matrix(ncol=k,nrow=p) if(arb.R==TRUE){ for(j in 1:k){ mu[,j] = rmvnorm(1,mu=as.vector(mu.hyp[[j]]),sigma=R[[j]]) } } else { for(j in 1:k){ mu[,j] = rmvnorm(1,mu=as.vector(mu.hyp[[j]]),sigma=R) } } } else k = ncol(mu) if (is.null(lambda)) { lambda = runif(k) lambda = lambda/sum(lambda) } else k = length(lambda) list(sigma=sigma,alpha=alpha,lambda=lambda,mu=mu,R=R,k=k) }mixtools/R/mvnpEM.R0000644000175100001440000002533214342153463013706 0ustar hornikusers### multivariate npEM with multivariate conditionnally independent blocks ### functions for mvnpEM with mvwkde code all in C ###################################################################### ## mvnpEM final (late 2015) version calling C codes for mvwkde's ## both for same and adaptive bandwidths ## adding a default bandwidth matrix passed as an argument ## bwdefault: a r-vector of fixed bandwidths per coordinates ## default to Silverman's rule per coordinates, only when samebw=TRUE ## bw returns the standard deviation of the kernel density ## init= for initialization option (June 2015) ###################################################################### mvnpEM <- function (x, mu0, blockid = 1:ncol(x), samebw = TRUE, bwdefault = apply(x,2,bw.nrd0), init=NULL, eps=1e-8, maxiter = 500, verb = TRUE){ x = as.matrix(x) n = nrow(x); r = ncol(x) bk = blockid #b_k=l indicate the kth coordinate belongs to lth block. B = max(bk) # total number of blocks # ! Caution if blocks are numbered not consecutively, use unique? loglik = NULL tt0 <- proc.time() # for total time # coordinate of X in lth block (block of dl-variate densities) # dl[l] = number of coordinates in l-th block # xx[[j]] = (n,dl[l]) -matrix of block l observations dl=c(); for (l in 1:B){dl[l] = sum(bk==l)} xx = list() for (l in 1:B){ xx[[l]] = as.matrix(x[,bk==l]) # coordinate of X in lth block } if (is.matrix(mu0)) m <- dim(mu0)[1] # mu0 = initial means else m <- mu0 # when mu0 = number of components ## NB initial means used only if kmeans used for init ## z.hat are posterior zij's, initialized using kmeans if (is.null(init)){ z.hat <- matrix(0, nrow = n, ncol = m) if (m == 1) z.hat <- matrix(1, nrow = n, ncol = m) # ?? m can never be 1 else{ kmeans <- kmeans(x, mu0) for(j in 1:m) z.hat[kmeans$cluster==j, j] <- 1} } if (! is.null(init)) {z.hat <- init} # ToDo: check consistency dim (n,m) lambda = matrix(0, maxiter, m) # storing lambda's along iterations finished = FALSE bw=matrix(0,m,r) # only used for adaptbw version if (samebw){ # bw computed once for all iterations and mvwkde calls # bw <- apply(x,2,bw.nrd0) # bw <- bwdefault^2*diag(r) # diagonal bw matrix appropriate for mvwkde bw <- bwdefault*diag(r) # diagonal bw matrix, not variances, appropriate for mvwkde } ## loop iter = 0 #start point while (!finished){ iter = iter + 1 #step "iter + 1" # t0 = proc.time() ################################################################# ## M-step for the Euclidean parameter lambda[iter,] = colMeans(z.hat) #\lambda_j^(t+1) = 1/n* \sum_i^n (p_ij)^t ################################################################# ## Weighted Kernel Density function step # wts[,j] = normalized weights for component j cs <- colSums(z.hat) # or use n*lambda[iter,] to avoid re summing over n ? wts <- sweep(z.hat, 2, cs, "/") wts [, cs==0] <- 1/NROW(wts) if (samebw){ # default samebw=TRUE lambda.f <- matrix(NA,n,m) # lambda.f[i,j] = lambda_j f_j(x_i) fkernel <- matrix(1,n,m) # Faster new version: no loop in j, all is done in C block per block for (l in 1:B) { d = dl[l] tmp=as.matrix(bw[bk==l,bk==l]) # updated here, not sqrt anymore h=as.vector(diag(tmp)); ans <- .C(C_mvwkde_samebw, n = as.integer(n),d = as.integer(d), m = as.integer(m), h = as.double(h), x=as.double(xx[[l]]), u=as.double(xx[[l]]), z=as.double(wts), f=double(n*m)) fl = matrix(ans$f,n,m) # f_jl estimate fkernel <- fkernel*fl # product over blocks } lambda.f <- sweep(fkernel, 2, lambda[iter, ], "*") } # end of samebw case # Adaptive bandwidth case - NOT YET BEST C VERSION (for all j simultaneously ?) if (!samebw) { for (k in 1:r) { # compute adaptive bw h_jk^t # use o <- order(x[,k]) to re-use it twice var <- colSums(wts*outer(x[,k], colSums(wts*x[,k]),'-')^2) iqr <- apply(as.matrix(wts[order(x[,k]),]),2,wIQR, x[,k][order(x[,k])], already.sorted=TRUE, already.normalized=TRUE) bw[,k] <- 0.9*pmin(sqrt(var), iqr/1.34)*pmax(1,n*lambda[iter, ])^(-1/5) } lambda.f <- matrix(NA,n,m) # lambda.f[i,j] = lambda_j f_j(x_i) fkernel <- matrix(1,n,m) #for (j in 1:m){ #lda.f = lambda[iter, j] for (l in 1:B){ d = dl[l]; H = as.matrix(bw[, bk==l]); ans <- .C(C_mvwkde_adaptbw, n = as.integer(n),d = as.integer(d), m = as.integer(m), H = as.double(H), x=as.double(xx[[l]]), u=as.double(xx[[l]]), z=as.double(wts), f=double(n*m)) fl = matrix(ans$f,n,m)# f_jl estimate fkernel <- fkernel*fl # product over blocks } lambda.f <- sweep(fkernel, 2, lambda[iter, ], "*") #} }# end of adaptive case ################################################################ ## E-step (for next iteration) z.hat = lambda.f/rowSums(lambda.f) #p_ij^t, Z_ij^t, update z.hat loglik <- c(loglik,sum(log(rowSums(lambda.f)))) # log-likelihood ## End finished = iter >= maxiter if (iter>1) {maxchange = max(abs(lambda[iter,] - lambda[iter-1,])) finished = finished | (maxchange < eps) } if (verb) { # t1 <- proc.time() cat("iteration", iter, ": lambda ", round(lambda[iter, ], 4),"\n") # cat(" time", (t1 - t0)[3], "\n") } }# End while ##### Output if (verb) { tt1 <- proc.time() # total time ending cat("# iter", iter) cat(", lambda ", round(lambda[iter, ], 4)) cat(", total time", (tt1 - tt0)[3], "s\n") } # final bandwidth output depending on samebw switch if (samebw) bw <- diag(bw) return(structure(list(data = x, posteriors = z.hat, lambda = lambda[1:iter,], blockid = bk, samebw=samebw, bandwidth = bw, lambdahat = lambda[iter,], loglik = loglik), class = "mvnpEM")) } # End function. ####################################################### # plot marginal (univariate) wkde's from mvnpEM output # a plot.mvnpEM method for mvnpEM class # lambda, mu, v: true parameters, for gaussian true models only # ... passed to hist first level plotting plot.mvnpEM <- function(x, truenorm=FALSE, lambda=NULL, mu=NULL, v=NULL, lgdcex =1, ...) { mix.object <- x if (!inherits(mix.object, "mvnpEM")) a <- x x <- a$data; r <- ncol(x); m <- ncol(a$posteriors) rr <- sqrt(r); frr <- floor(rr) if (frr == rr) par(mfrow=c(rr,rr)) else { if (frr*(frr+1) >= r) par(mfrow=c(frr, frr+1)) else par(mfrow=c(frr+1, frr+1))} # if ((r %% 2) == 0) par(mfrow=c(floor(r/2), floor(r/2))) else { # par(mfrow=c(floor(r/2)+1, floor(r/2)+1))} for (k in 1:r) { # for each coord (whatever its block) xx <- x[,k] uk <- seq(min(xx),max(xx),len=100) tt <- paste("block", a$blockid[k],", coord",k) hist(xx, col=8, freq=F, xlab="", main=tt, ...) for (j in 1:m) { wj <- a$post[,j] # weights for component j if (a$samebw) bw <- a$bandwidth[k] else { bw <- a$bandwidth[j,k]} f <- wkde(xx, u=uk, w=wj, bw=bw, sym=F) lines(uk, a$lambdahat[j]*f, col=j) # add true Gaussian marginal if requested/known if (truenorm) { lines(uk,lambda[j]*dnorm(uk,mean=mu[j,k], sd=sqrt(v[j,k,k])), lty=2,lwd=2, col=j)} } if (a$samebw) subt <- paste("same bw:",round(a$bandwidth[k],3)) else { subt <- "adapt bw: " for (j in 1:m) subt <- paste(subt, round(a$bandwidth[j,k],3)) } title(sub=subt) } lgd <- NULL for (j in 1:m) lgd <- c(lgd, paste("comp",j)) legend("topright", lgd, col=1:m, lty=1, cex=lgdcex) } ########################################################### print.mvnpEM <- function(x,...) { n <- NROW(x$data) r <- NCOL(x$data) m <- length(x$lambdahat) cat(paste("Observations:", n, "\n")) cat(paste("Coordinates per observation:", r, "\n")) cat(paste("Mixture components:", m, "\n")) if (r > 1) { B <- max(x$blockid) cat(paste("Blocks (of conditionally iid coordinates):",B, "\n\n")) } dp = match(c("data", "posteriors", "lambda", "mu"), names(x), nomatch = 0) print.default(structure(x[-dp], class = class(x)), ...) invisible(x) } print.summary.mvnpEM <-function (x, digits = 3, ...) { if (x$r > 1) cat(paste(x$n, "observations,", x$r, "coordinates,", x$m, "components, and", x$B, "blocks.\n\n")) else cat(paste(x$n, "univariate observations, and", x$m, "components.\n\n")) cat("Means (and std. deviations) for each component:\n") for (l in 1:x$B) { coords <- 1 if (x$r > 1) { coords <- x$blockid == l cat(paste(" Block #", l, ": Coordinate", sep = "")) cat(ifelse(sum(coords) > 1, "s ", " ")) cat(which(coords)) cat("\n") } if (sum(coords)==1) { for (j in 1:x$m){ cat(paste(" Component", j,": ")) cat(paste(signif(x$means[j,coords], digits), " (", signif(x$variances[[j]][coords,coords],digits), ") ", sep = "")) } cat("\n") } else { for (j in 1:x$m){ cat(paste(" Component", j,": ")) cat(paste(signif(x$means[j,coords ], digits), sep = "")) cat("\n") print(signif(x$variances[[j]][coords,coords], digits)) cat("\n") }} } } summary.mvnpEM <- function(object,...) { n <- NROW(object$data);n r <- NCOL(object$data);r m <- length(object$lambdahat);m B <- max(object$blockid);B mu <- matrix(0, m, r);mu v <- array(0,c(m,r,r));v[1,,];v[2,,] normpost <- sweep(object$post, 2, sums <- colSums(object$post),"/") for (l in 1:B){ coords <- object$blockid == l;coords sc <- sum(coords);sc xx <- as.matrix(object$data[, coords]);xx var<- list();mean<-list() for (j in 1:m){ wts <- normpost[, j] M<-mu[j,coords] <- colSums(wts*as.matrix(xx)) if (sc==1) v[j,coords,coords]<- colSums(wts*outer(as.matrix(xx), colSums(wts*as.matrix(xx)),'-')^2) else{ for (t1 in 1:sc){ for (t2 in 1:sc){ v[j,coords,coords][t1,t2] <- v[j,coords,coords][t2,t1] <- colSums(wts*outer(as.matrix(xx[,t1]), colSums(wts*as.matrix(xx[,t1])),'-') *outer(as.matrix(xx[,t2]), colSums(wts*as.matrix(xx[,t2])),'-'))} } } var[[j]] = v[j,,] } } rownames(mu) <- paste("component",1:m) colnames(mu) <- paste("coordinate", 1:r) names(var) <- paste("component",1:m) ans <- list(n = n, m = m, r = r, B = B, blockid = object$blockid, means = mu, variances = var) class(ans)<-"summary.mvnpEM" ans } mixtools/R/ldc.R0000644000175100001440000000175414342153463013250 0ustar hornikusersldc <- function(data,class,score){ data = as.matrix(data) K = length(unique(class)) # The number of classes (expect the classes to be labeled 1, 2, 3, ..., K-1, K N = dim(data)[1] # The number of samples p = dim(data)[2] # The number of features # Compute the class dependent probabilities and class dependent centroids: Pi = c(table(class))/N M = aggregate(data,list(class),mean)[,-1] # Compute W: W = cov(data) # Compute M* = M W^{-1/2} using the eigen-decomposition of W : e = eigen(W) V = e$vectors W_Minus_One_Half = V %*% diag( 1/sqrt(e$values),nrow=p ) %*% t(V) MStar = as.matrix(M) %*% W_Minus_One_Half # Compute B* the covariance matrix of M* and its eigen-decomposition: if(p>1 & length(Pi)>1){ BStar = cov(MStar) e = eigen(BStar) VStar = e$vectors # 1st linear discriminant coordinate ldc1 = W_Minus_One_Half %*% VStar[,score] } else if(p==1){ ldc1 = c(W_Minus_One_Half) } else ldc1 = W_Minus_One_Half[,score] return(ldc1) } mixtools/NEWS0000755000175100001440000001266514343306274012670 0ustar hornikusersChanges in mixtools 2.0.0 ============================ * 2022-12-05 * Updates included in this major release were due to funding received from the Chan Zuckerberg Initiative: Essential Open Source Software for Science (Grant No. 2020-255193). This has been added to both the DESCRIPTION file and the zzz.R file. * Updated all graphics functions to use plotly. These new functions are prefaced by "plotly_". All of the original plotting functions that used base R graphics are still included in order to maintain backwards compatibility. * Launched a GitHub repo for mixtools, which has been added to DESCRIPTION. Bug requests can be submitted through the repo. * Modified the NAMESPACE to import the necessary functions from the scales package as well as export all of the newly-created plotly graphics functions. * Modified the summary.mixEM() function to fix some output inconsistencies when analyzing results from mvnormalmixEM(). * Changed conditional tests for the class of certain objects to use the inherits() function. The affected functions are boot.comp(), boot.se(), gammamixEM(), and segremixEM(). * Generalized the regmixEM.loc() and lambda() functions to allow multiple predictors. The previous versions only accepted a single predictor even though the documentation mistakenly indicated multiple predictors. The revised functions use a product kernel in the calculation if inputting multiple predictors. Thanks to Julio Trecenti for pointing this out. * Updated links to URLs found in various .Rd files and the CITATION file. * Added Kedai Cheng (UNC - Asheville) as an author of the package. * Resolved issues noted on CRAN regarding escaped LaTeX specials in certain .Rd files. Changes in mixtools 1.2.0 ============================ * 2020-02-05 * Fixed compatibility issues with R 4.0.0. * Modified the NAMESPACE to only import three functions from the kernlab package: kpca(), pcv(), and Q(). * Modified gammamixEM() to reflect the developments in Young, Chen, Hewage, and Nilo-Poyanco (2019). This includes the addition of the argument mom.start to use a method-of-moments starting value strategy, as well as the addition of the fix.alpha argument for estimating a common shape parameter across the different components. * Added the mixturegram() function to construct mixturegrams for determining the number of components, which was introduced by Young, Ke, and Zeng (2018). * Modified the way the mixing proportions were randomly generated in the poisregmix.init() and logisregmix.init() functions. Previously, there was the possibility of generating too small of a mixing component, which could cause numerical instabilities. Thanks to Xiaoqiong Fang for identifying this issue. Changes in mixtools 1.1.0 ============================ * 2017-03-10 * Properly registered native routines for internal C code to conform with R-devel checks. * Fixed some inconsistencies with the S3 methods used. * Added tauequivnormalmixEM() to search for a local maximum of the likelihood surface for a univariate finite mixture of normals with possible equality constraints on the stdev parameters. * Added expRMM_EM() for fitting univariate finite mixtures-of-exponentials with right censoring. Some associated distribution functions for this calculation were also added. * Added weibullRMM_SEM(), which is a stochastic EM algorithm for estimating Reliability Mixture Models (RMM) with censoring. * Added spRMM_SEM(), which is a stochastic EM algorithm for estimating a semiparametric Scaling RMM with censoring. * Corrected an issue with loading WaterdataFull. * Removed dependency on 'boot' package and revised code in the appropriate functions. Thanks to Tim Hesterberg and Karl Millar of Google for this suggestion. * Updated some help files. Changes in mixtools 1.0.4 ============================ * 2016-01-11 * Added mvnpEM() and some related functions, which are multivariate blocks extension to the npEM() function. * Updated some help files. Changes in mixtools 1.0.3 ============================ * 2015-04-17 * Updated the maintainer's contact e-mail. * Added a new npMSL() version, with k-fold cross-validation. * Fixed some errors in the examples due to change in format to the Waterdata dataset. * Updated some references. Changes in mixtools 1.0.2 ============================ * 2014-05-13 * Fixed an indexing error in the boot.comp() function. * Updated some references. Changes in mixtools 1.0.1 ============================ * 2014-01-01 * Fixed a small bug to the boot.comp() function. * Added more complete version of Waterdata dataset, which includes all 579 children originally measured along with age and sex information Changes in mixtools 1.0.0 ============================ * 2013-10-05 * Started a NEWS file as of this version. New capabilities include: * A normalmixMMlc() function was added, for mixtures of univariate Normals with linear constraints on both the means and the variances parameters, requiring a MM-type algorithm. * A spEMsymlocN01() function was added, implementing a specific semiparametric EM-like algorithm for univariate mixture in False Discovery Rate (FDR) estimation, in which setup one component is known and set to the standard normal whereas the second component is semiparametric. Functions for plotting the results from this algorithm and for FDR estimation from its output have also been added. * Some documentation (Rd) files have been updated for examples, and some reference papers in EM-related Rd files have been updated. mixtools/vignettes/0000755000175100001440000000000014762772100014164 5ustar hornikusersmixtools/vignettes/mixtools.bib0000755000175100001440000002217314342153463016527 0ustar hornikusers @incollection{aic, author = {H. Akaike}, title = {Information Theory and an Extension of the Maximum Likelihood Principle}, booktitle = {Second International Symposium on Information Theory}, publisher = {Akademiai Kiado}, year = {1973}, editor = {B. N. Petrov and F. Csaki}, pages = {267--281}, } @Article{Benaglia+Chauveau+Hunter+Young:2009, author = {Tatiana Benaglia and Didier Chauveau and David R. Hunter and Derek Young}, title = {\pkg{mixtools}: An \proglang{R} Package for Analyzing Finite Mixture Models}, journal = {Journal of Statistical Software}, year = {2009}, volume = {32}, number = {6}, pages = {1--29}, url = {http://www.jstatsoft.org/v32/i06/} } @article{benaglia2009, title={{An {E}{M}-Like Algorithm for Semi- and Non-Parametric Estimation in Multivariate Mixtures}}, author={Tatiana Benaglia and Didier Chauveau and David R.~Hunter}, journal={Journal of Computational and Graphical Statistics}, volume={18}, pages = {505--526}, year={2009} } @TECHREPORT{bch:festchrift2009, author={Tatiana Benaglia and Didier Chauveau and David R.~Hunter}, title = {Bandwidth Selection in an {E}{M}-Like Algorithm for Nonparametric Multivariate Mixtures}, year = {2009}, url = {http://hal.archives-ouvertes.fr/hal-00353297}, institution = {HAL}, number = {hal-00353297, version 1} } @article{biern, author = {C. Biernacki and G. Celeux and G. 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} } @article{bordes2007sas, title={{A Stochastic {E}{M} Algorithm for a Semiparametric Mixture Model}}, author={Laurent Bordes and Didier Chauveau and Pierre Vandekerkhove}, journal={Computational Statistics \& Data Analysis}, volume={51}, number={11}, pages={5429--5443}, year={2007}, publisher={Elsevier} } @article{bordes2006set, title={{Semiparametric Estimation of a Two-Component Mixture Model}}, author={Laurent Bordes and St\'ephane Mottelet and Pierre Vandekerkhove}, journal={The Annals of Statistics}, volume={34}, number={3}, pages={1204--1232}, year={2006}, publisher={Institute of Mathematical Statistics} } @article{boz, author = {H. Bozdogan}, title = {Model Selection and Akaike's Information Criterion ({A}{I}{C}): The General Theory and Its Analytical Extensions}, journal = {Psychometrika}, year = {1987}, volume = {52}, number = {3}, pages = {345--370} } @article{cruzmedina2004smm, title={{Semiparametric Mixture Models and Repeated Measures: The Multinomial Cut Point Model}}, author={Isidro Roberto Cruz-Medina and Thomas P.~Hettmansperger and Hoben Thomas}, journal={Journal of the Royal Statistical Society C}, volume={53}, number={3}, pages={463--474}, year={2004}, publisher={Blackwell Synergy} } @article{dempster1977mli, title={{Maximum Likelihood from Incomplete Data Via the {E}{M} Algorithm}}, author={Arthur P.~Dempster and Nan M.~Laird and Donald B.~Rubin}, journal={Journal of the Royal Statistical Society B}, volume={39}, number={1}, pages={1--38}, year={1977}, publisher={JSTOR} } @article{deveaux1989, title={Mixtures of Linear Regressions}, author={R.~D.~de~Veaux}, journal={Computational Statistics and Data Analysis}, volume={8}, pages={227--245}, year={1989} } @book{eftib, author={B. Efron and R. Tibshirani}, title={An Introduction to the Bootstrap}, publisher={Chapman \& Hall}, year={1993}, address={London} } @article{elmore2004ecc, title={{Estimating Component Cumulative Distribution Functions in Finite Mixture Models}}, author={Ryan T.~Elmore and Thomas P.~Hettmansperger and Hoben Thomas}, journal={Communications in Statistics -- Theory and Methods}, volume={33}, number={9}, pages={2075--2086}, year={2004}, publisher={Taylor \& Francis} } @techreport{elmore2003, title={{Identifiability and Estimation in Finite Mixture Models with Multinomial Coefficients}}, author={Ryan T.~Elmore and Shaoli Wang}, institution={Penn State University}, number={03-04}, year={2003} } @Manual{Fraley+Raftery:2009, title = {\pkg{mclust}: Model-Based Clustering and Normal Mixture Modeling}, author = {Chris Fraley and Adrian Raftery}, year = {2009}, note = {\proglang{R}~package version~3.3.1}, url = {http://CRAN.R-project.org/package=mclust}, } @Article{Grun+Leisch:2008, author = {Bettina Gr{\"u}n and Friedrich Leisch}, title = {FlexMix 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/} } @article{hall2005nim, title={{Nonparametric Inference in Multivariate Mixtures}}, author={Peter Hall and A.~Neeman and R.~Pakyari and Ryan T.~Elmore}, journal={Biometrika}, volume={92}, number={3}, pages={667--678}, year={2005}, publisher={Biometrika Trust} } @article{hall2003nec, title={{Nonparametric Estimation of Component Distributions in a Multivariate Mixture}}, author={Peter Hall and X.~H.~Zhou}, journal={The Annals of Statistics}, volume={31}, number={1}, pages={201--224}, year={2003}, publisher={Institute of Mathematical Statistics} } @article{hettmansperger2000ani, title={{Almost Nonparametric Inference for Repeated Measures in Mixture Models}}, author={Thomas P.~Hettmansperger and Hoben Thomas}, journal={Journal of the Royal Statistical Society B}, volume={62}, number={4}, pages={811--825}, year={2000}, publisher={Blackwell Synergy} } @article{hunter2007ims, title={{Inference for Mixtures of Symmetric Distributions}}, author={David R.~Hunter and Shaoli Wang and Thomas P.~Hettmansperger}, journal={The Annals of Statistics}, volume={35}, pages={224--251}, year={2007}, publisher={Institute of Mathematical Statistics} } @article{hurn, author={M. Hurn and A. Justel and C. P. Robert}, title={Estimating Mixtures of Regressions}, journal={Journal of Computational and Graphical Statistics}, year={2003}, volume={12}, number={1}, pages={55--79} } @article{jacobsall, title={Adaptive Mixtures of Local Experts}, author={R. A. Jacobs and M. I. Jordan and S. J. Nowlan and G. E. Hinton}, journal={Neural Computation}, volume={3}, number={1}, year={1991}, pages={79--87} } @Article{jss:Leisch:2004, author = {Friedrich Leisch}, title = {FlexMix: A General Framework for Finite Mixture}, journal = {Journal of Statistical Software}, year = {2004}, volume = {11}, number = {8}, pages = {1--18}, url = {http://www.jstatsoft.org/v11/i08/} } @article{mclach, author={G. J. McLachlan}, title={On Bootstrapping the Likelihood Ratio Test Statistic for the Number of Components in a Normal Mixture}, journal={Journal of the Royal Statistical Society C}, year={1987}, volume={36}, pages={318--324} } @book{mclachlan2000fmm, title={{Finite Mixture Models}}, author={Geoffrey J.~McLachlan and D.~Peel}, year={2000}, publisher={John Wiley \& Sons}, address={New York} } @article{quandt1972sr, title={{The Estimation of the Parameters of a Linear Regression System Obeying Two Separate Regimes}}, author={R.~E.~Quandt}, journal={Journal of the American Statistical Association}, volume={67}, number={338}, pages={306--310}, year={1972}, publisher={American Statistical Association} } @article{quandtram1978sr, title={{Estimating Mixtures of Normal Distributions and Switching Regressions}}, author={R.~E.~Quandt and J.~B.~Ramsey}, journal={Journal of the American Statistical Association}, volume={73}, number={364}, pages={730--738}, year={1978}, publisher={American Statistical Association} } @Manual{r2009, title = {\proglang{R}: {A} Language and Environment for Statistical Computing}, author = {{\proglang{R} Development Core Team}}, organization = {\proglang{R} Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2009}, note = {{ISBN} 3-900051-07-0}, url = {http://www.R-project.org/} } @article{schw, author = {G. Schwarz}, title = {Estimating the Dimension of a Model}, journal = {The Annals of Statistics}, year = {1978}, volume = {6}, number = {2}, pages = {461--464} } @book{silverman1986des, title={{Density Estimation for Statistics and Data Analysis}}, author={Bernard W.~Silverman}, year={1986}, publisher={Chapman \& Hall/CRC} } @TECHREPORT{young2009mor, author={Derek S.~Young and David R.~Hunter}, title = {Mixtures of Regressions with Predictor-Dependent Mixing Proportions}, year = {2009}, url = {http://www.stat.psu.edu/reports/}, institution = {Penn State University}, number = {09-03} } @PHDTHESIS{youngphd, AUTHOR = {D. S. Young}, TITLE = {A Study of Mixtures of Regressions}, SCHOOL = {The Pennsylvania State University}, YEAR = {2007}, note = {Unpublished} } mixtools/vignettes/mixtools.Rnw0000755000175100001440000021573414762763100016551 0ustar hornikusers\documentclass[nojss]{jss} \usepackage{amsmath} \usepackage{amssymb} %% need no \usepackage{Sweave.sty} %\VignetteIndexEntry{mixtools for mixture models} %% macros (Didier) \newcommand{\CF}{{\mathcal F}} \newcommand{\CN}{{\mathcal N}} \def\Bg{\mathbf{g}} \def\Bh{\mathbf{h}} \def\Bk{\mathbf{k}} \def\Bx{\mathbf{x}} \def\By{\mathbf{y}} \def\Bc{\mathbf{c}} \def\BC{\mathbf{C}} \def\Bz{\mathbf{z}} \newcommand{\argmax}{\mathop{\mbox{argmax}}} \def\bP{\mathbb{P}} % Probability \def\I{\mathbb I} % indicator function \def\bE{\mathbb{E}} % expectation \def\bR{\mathbb{R}} % real line \newcommand{\f}{{\vec\theta}} \newcommand{\lb}{{\lambda}} \def\post{{p}} \def\defn{{\stackrel{\rm def}{=}}} \def\vec#1{\mathchoice{\mbox{\boldmath$\displaystyle\bf#1$}} {\mbox{\boldmath$\textstyle\bf#1$}} {\mbox{\boldmath$\scriptstyle\bf#1$}} {\mbox{\boldmath$\scriptscriptstyle\bf#1$}}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% declarations for jss.cls %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% almost as usual \author{Tatiana Benaglia \\ Pennsylvania State University \And Didier Chauveau \\ Universit\'e d'Orl\'eans \AND David R.~Hunter \\ Pennsylvania State University \And Derek S. Young \\ Pennsylvania State University} \title{\pkg{mixtools}: An \proglang{R} Package for Analyzing Finite Mixture Models} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Tatiana Benaglia, Didier Chauveau, David R.~Hunter, Derek Young} %% comma-separated \Plaintitle{mixtools: An R Package for Analyzing Mixture Models} %% without formatting \Shorttitle{mixtools for Mixture Models} %% a short title (if necessary) %% an abstract and keywords \Abstract{ The \pkg{mixtools} package for \proglang{R} provides a set of functions for analyzing a variety of finite mixture models. These functions include both traditional methods, such as EM algorithms for univariate and multivariate normal mixtures, and newer methods that reflect some recent research in finite mixture models. In the latter category, \pkg{mixtools} provides algorithms for estimating parameters in a wide range of different mixture-of-regression contexts, in multinomial mixtures such as those arising from discretizing continuous multivariate data, in nonparametric situations where the multivariate component densities are completely unspecified, and in semiparametric situations such as a univariate location mixture of symmetric but otherwise unspecified densities. Many of the algorithms of the \pkg{mixtools} package are EM algorithms or are based on EM-like ideas, so this article includes an overview of EM algorithms for finite mixture models. } \Keywords{cutpoint, EM algorithm, mixture of regressions, model-based clustering, nonparametric mixture, semiparametric mixture, unsupervised clustering} %, keywords, comma-separated, not capitalized, \proglang{Java}} \Plainkeywords{keywords, comma-separated, not capitalized, Java} %% without formatting %% at least one keyword must be supplied %% publication information %% NOTE: Typically, this can be left commented and will be filled out by the technical editor %% \Volume{13} %% \Issue{9} %% \Month{September} %% \Year{2004} %% \Submitdate{2004-09-29} %% \Acceptdate{2004-09-29} %% The address of (at least) one author should be given %% in the following format: \Address{ Didier Chauveau\\ Laboratoire MAPMO - UMR 7349 - F\'ed\'eration Denis Poisson\\ Universit\'e d'Orl\'eans\\ BP 6759, 45067 Orl\'eans cedex 2, FRANCE.\\ E-mail: \email{didier.chauveau@univ-orleans.fr} \\ URL: \url{http://www.univ-orleans.fr/mapmo/membres/chauveau/}\\ \\ David R.~Hunter\\ Department of Statistics\\ 326 Thomas Building\\ Pennsylvania State University\\ University Park, PA 16802\\ Telephone: +1/814-863-0979\\ Fax: +1/814-863-7114\\ E-mail: \email{dhunter@stat.psu.edu} \\ URL: \url{http://www.stat.psu.edu/~dhunter/}\\ \\ Tatiana Benaglia\\ Department of Statistics, Penn State (see above)\\ E-mail: \email{tab321@stat.psu.edu} \\ \\ Derek Young\\ Department of Statistics, Penn State (see above)\\ E-mail: \email{dsy109@psu.edu} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/1/31336-5053 %% Fax: +43/1/31336-734 %% for those who use Sweave please include the following line (with % symbols): %% need no \usepackage{Sweave.sty} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} \SweaveOpts{concordance=FALSE} %% include your article here, just as usual %% Note that you should use the \pkg{}, \proglang{} and \code{} commands. \section[Introduction to finite mixtures and mixtools]{Introduction to finite mixtures and \pkg{mixtools}} %% Note: If there is markup in \(sub)section, then it has to be escape %% as above. \label{s:intro} Authors' note: The original version of this vignette was produced using an article that appears in the {\it Journal of Statistical Software} (URL: \url{http://www.jstatsoft.org/}); see \citet{Benaglia+Chauveau+Hunter+Young:2009}. Populations of individuals may often be divided into subgroups. Yet even when we observe characteristics of these individuals that provide information about their subgroup memberships, we may not actually observe these memberships {\em per se}. The basic goal of the tools in the \pkg{mixtools} package (version 0.4.3, as of this writing) for \proglang{R} \citep{r2009} is to examine a sample of measurements to discern and describe subgroups of individuals, even when there is no observable variable that readily indexes into which subgroup an individual properly belongs. This task is sometimes referred to as ``unsupervised clustering'' in the literature, and in fact mixture models may be generally thought of as comprising the subset of clustering methods known as ``model-based clustering''. The \pkg{mixtools} package is available from the Comprehensive \proglang{R} Archive Network at \url{http://CRAN.R-project.org/package=mixtools}. Finite mixture models may also be used in situations beyond those for which clustering of individuals is of interest. For one thing, finite mixture models give descriptions of entire subgroups, rather than assignments of individuals to those subgroups (though the latter may be accomplished using mixture models). Indeed, even the subgroups may not necessarily be of interest; sometimes finite mixture models merely provide a means for adequately describing a particular distribution, such as the distribution of residuals in a linear regression model where outliers are present. Whatever the goal of the modeler when employing mixture models, much of the theory of these models involves the assumption that the subgroups are distributed according to a particular parametric form --- and quite often this form is univariate or multivariate normal. While \pkg{mixtools} does provide tools for traditional fitting of finite mixtures of univariate and multivariate normal distributions, it goes well beyond this well-studied realm. Arising from recent research whose goal is to relax or modify the assumption of multivariate normality, \pkg{mixtools} provides computational techniques for finite mixture model analysis in which components are regressions, multinomial vectors arising from discretization of multivariate data, or even distributions that are almost completely unspecified. This is the main feature that distinguishes \pkg{mixtools} from other mixture-related \proglang{R} packages, also available from the Comprehensive \proglang{R} Archive Network at \url{http://CRAN.R-project.org/}, such as \pkg{mclust} \citep{Fraley+Raftery:2009} and \pkg{flexmix} \citep{jss:Leisch:2004, Grun+Leisch:2008}. We briefly mention these two packages in Sections~\ref{section:EMexample} and \ref{section:pdmp}, respectively. To make the mixture model framework more concrete, suppose the possibly vector-valued random variables $\vec X_1, \ldots, \vec X_n$ are a simple random sample from a finite mixture of $m>1$ arbitrary distributions, which we will call {\em components} throughout this article. The density of each $\vec X_i$ may be written \begin{equation} \label{mvmixture} g_{\f}(\vec x_i) = \sum_{j=1}^m\lambda_j\phi_j(\vec x_i), \quad \vec x_i\in\bR^r, \end{equation} where $\f=(\vec\lambda, \vec \phi) = (\lambda_1, \ldots, \lambda_m, \phi_1, \ldots, \phi_m)$ denotes the parameter and the $\lambda_m$ are positive and sum to unity. We assume that the $\phi_j$ are drawn from some family $\cal F$ of multivariate density functions absolutely continuous with respect to, say, Lebesgue measure. The representation \eqref{mvmixture} is not identifiable if no restrictions are placed on $\cal F$, where by ``identifiable'' we mean that $g_{\f}$ has a {\em unique} representation of the form \eqref{mvmixture} and we do not consider that ``label-switching'' --- i.e., reordering the $m$ pairs $(\lambda_1, \phi_1), \ldots, (\lambda_m, \phi_m)$ --- produces a distinct representation. In the next sections we will sometimes have to distinguish between {\em parametric} and more general {\em nonparametric} situations. This distinction is related to the structure of the family $\CF$ of distributions to which the component densities $\phi_j$ in model \eqref{mvmixture} belong. We say that the mixture is {\em parametric} if $\CF$ is a parametric family, $\CF = \{\phi(\cdot|\vec\xi), \vec\xi\in\bR^d\}$, indexed by a ($d$-dimensional) Euclidean parameter $\vec\xi$. A parametric family often used is the univariate Gaussian family $\CF = \{\phi(\cdot|\mu,\sigma^2)=\mbox{density of }\CN(\mu,\sigma^2), (\mu,\sigma^2)\in\bR\times\bR^+_*\}$, in which case the model parameter reduces to $\f = (\vec \lambda, (\mu_1,\sigma^2_1),\ldots,(\mu_m,\sigma^2_m))$. For the multivariate case, a possible parametric model is the {\em conditionally i.i.d.\ normal model}, for which $\CF=\{\phi(\vec x_i) = \prod_{k=1}^r f(x_{ik}), \mbox{$f(t)$ density of $\CN(\mu,\sigma^2)$}\}$ (this model is included in \pkg{mixtools}; see Section~\ref{ss:nbcomp}). An example of a (multivariate) nonparametric situation is $\CF=\{\phi(\vec x_i) = \prod_{k=1}^r f(x_{ik}), \mbox{$f(t)$ a univariate density on $\bR$}\}$, in which case $\vec\f$ consists in a Euclidean part ($\vec\lb$) and a nonparametric part $(f_1,\ldots,f_m)$. As a simple example of a dataset to which mixture models may be applied, consider the sample depicted in Figure \ref{geyser}. In the Old Faithful dataset, measurements give time in minutes between eruptions of the Old Faithful geyser in Yellowstone National Park, USA. These data are included as part of the \pkg{datasets} package in \proglang{R} \citep{r2009}; type \code{help("faithful")} in \proglang{R} for more details. <>= library(mixtools) data(faithful) attach(faithful) @ \setkeys{Gin}{width=0.6\textwidth} \begin{figure}[h] \centering <>= hist(waiting, main="Time between Old Faithful eruptions", xlab="Minutes", ylab="", cex.main=1.5, cex.lab=1.5, cex.axis=1.4) @ \caption{The Old Faithful dataset is clearly suggestive of a two-component mixture of symmetric components.} \label{geyser} \end{figure} For the Old Faithful eruption data, a two-component mixture model is clearly a reasonable model based on the bimodality evident in the histogram. This example is analyzed by \citet{hunter2007ims}, who compare a standard normal-mixture method for fitting it with a novel semiparametric approach. Both approaches are included in \pkg{mixtools}; see Sections \ref{section:EMexample} and \ref{section:SPexample} of this article. In Section~\ref{section:EM} of the current article we review the well-known class of EM algorithms for finite mixture models, a common thread that runs throughout much of the rest of the article. The remaining sections discuss various categories of functions found in the \pkg{mixtools} package, from cutpoint methods that relax distributional assumptions for multivariate data by discretizing the data (Section~\ref{section:cut}), to semi- and non-parametric methods that eliminate distributional assumptions almost entirely depending on what the identifiability of the model allows (Section~\ref{section:np}), to methods that handle various mixtures of regressions (Section~\ref{section:reg}). Finally, Section \ref{section:misc} describes several miscellaneous features of the \pkg{mixtools} package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{EM algorithms for finite mixtures} \label{section:EM} \subsection{Missing data setup} Much of the general methodology used in \pkg{mixtools} involves the representation of the mixture problem as a particular case of maximum likelihood estimation (MLE) when the observations can be viewed as incomplete data. This setup implies consideration of two sample spaces, the sample space of the (incomplete) observations, and a sample space of some ``complete'' observations, the characterization of which being that the estimation can be performed explicitly at this level. For instance, in parametric situations, the MLE based on the complete data may exist in closed form. Among the numerous reference papers and monographs on this subject are, e.g., the original EM algorithm paper by \citet{dempster1977mli} and the finite mixture model book by \citet{mclachlan2000fmm} and references therein. We now give a brief description of this setup as it applies to finite mixture models in general. The (observed) data consist of $n$ i.i.d. observations $\vec x = (\vec x_1,\ldots,\vec x_n)$ from a density $g_\f$ given by \eqref{mvmixture}. It is common to denote the density of the sample by $\Bg_\f$, the $n$-fold product of $g_\f$, so that we write simply $\Bx\sim \Bg_\f$. In the missing data setup, $\Bg_\f$ is called the incomplete-data density, and the associated log-likelihood is $L_{\Bx}(\f) = \sum_{i=1}^n \log g_\f(\vec x_i)$. The (parametric) ML estimation problem consists in finding $\hat\f_{\Bx} = \argmax_{\f\in\Phi} L_{\Bx}(\f)$, or at least finding a local maximum --- there are certain well-known cases in which a finite mixture model likelihood is unbounded \citep{mclachlan2000fmm}, but we ignore these technical details for now. Calculating $\hat\f_{\Bx}$ even for a parametric finite mixture model is known to be a difficult problem, and considering $\Bx$ as incomplete data resulting from non-observed complete data helps. The associated complete data is denoted by $\Bc = (\vec c_1,\ldots, \vec c_n)$, with density $\Bh_\f(\Bc)=\prod_{i=1}^n h_\f(\vec c_i)$ (there exists a many-to-one mapping from $\Bc$ to $\Bx$, representing the loss of information). In the model for complete data associated with model~\eqref{mvmixture}, each random vector $\vec C_i = (\vec X_i,\vec Z_i)$, where $\vec Z_i = (Z_{ij},j=1,\ldots m)$, and $Z_{ij}\in\{0,1\}$ is a Bernoulli random variable indicating that individual $i$ comes from component $j$. Since each individual comes from exactly one component, this implies $\sum_{j=1}^m Z_{ij}=1$, and $$ \Prob(Z_{ij} = 1) = \lambda_{j},\quad (\vec X_i|Z_{ij}=1) \sim \phi_j, \quad j=1,\ldots,m. $$ The complete-data density for one observation is thus $$ h_\f(\vec c_i) = h_\f(\vec x_i,\vec z_i) = \sum_{j=1}^m \I_{z_{ij}}\lb_j \phi_j (\vec x_i), $$ In the parametric situation, i.e.\ when $\CF$ is a parametric family, it is easy to check that the complete-data MLE $\hat\f_{\Bc}$ based on maximizing $\log \Bh_\f(\Bc)$ is easy to find, provided that this is the case for the family $\CF$. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{EM algorithms} \label{sec:EM} An EM algorithm iteratively maximizes, instead of the observed log-likelihood $L_{\Bx}(\f)$, the operator $$ Q(\f | \f^{(t)}) = \E \left[\log \Bh_\f(\BC)|\Bx,\f^{(t)} \right], $$ where $\f^{(t)}$ is the current value at iteration~$t$, and the expectation is with respect to the distribution $\Bk_\f(\Bc|\Bx)$ of $\Bc$ given $\Bx$, for the value $\f^{(t)}$ of the parameter. The iteration $\f^{(t)} \to \f^{(t+1)}$ is defined in the above general setup by \begin{enumerate} \item E-step: compute $Q(\f | \f^{(t)})$ \item M-step: set $\f^{(t+1)} = \argmax_{\f\in\Phi}Q(\f | \f^{(t)})$ \end{enumerate} For finite mixture models, the E-step does not depend on the structure of $\CF$, since the missing data part is only related to the $\Bz$'s: $$ \Bk_\f(\Bc|\Bx) = \prod_{i=1}^n k_\f(\vec z_i|\vec x_i). $$ The $\Bz$ are discrete, and their distribution is given via Bayes' theorem. The M-step itself can be split in two parts, the maximization related to $\vec\lb$, which does not depend on $\CF$, and the maximization related to $\vec \phi$, which has to be handled specifically (say, parametrically, semi- or non-parametrically) for each model. Hence the EM algorithms for the models handled by the \pkg{mixtools} package share the following common features: \begin{enumerate} \item{\bf E-step:\ } Calculate the ``posterior'' probabilities (conditional on the data and $\vec\theta^{(t)}$) of component inclusion, \begin{equation}\label{posteriors} \post_{ij}^{(t)} \, \defn \, \Prob_{\vec\theta^{(t)}}(Z_{ij}=1| \vec x_i) = \frac{\lambda_j^{(t)} \phi_{j}^{(t)}(\vec x_{i})} {\sum_{j'=1}^m\lambda_{j'}^{(t)} \phi_{j'}^{(t)}(\vec x_{i})} \end{equation} for all $i=1,\ldots, n$ and $j=1, \ldots, m$. Numerically, it can be dangerous to implement equation (\ref{posteriors}) exactly as written due to the possibility of the indeterminant form $0/0$ in cases where $\vec x_i$ is so far from any of the components that all $\phi_{j'}^{(t)}(\vec x_i)$ values result in a numerical underflow to zero. Thus, many of the routines in \pkg{mixtools} actually use the equivalent expression \begin{equation}\label{altposteriors} \post_{ij}^{(t)} = \left[ 1 + \sum_{j'\ne j} \frac{ \lambda_{j'}^{(t)} \phi_{j'}^{(t)}(\vec x_{i})} {\lambda_j^{(t)} \phi_{j}^{(t)}(\vec x_{i})} \right]^{-1} \end{equation} or some variant thereof. \item{\bf M-step for $\vec\lb$:\ } Set \begin{equation}\label{lambda} \lambda_j^{(t+1)} = \frac1n\sum_{i=1}^n \post_{ij}^{(t)} , \quad\mbox{for $j=1, \ldots, m$.} \end{equation} \end{enumerate} \subsection{An EM algorithm example} \label{section:EMexample} As an example, we consider the univariate normal mixture analysis of the Old Faithful waiting data depicted in Figure \ref{geyser}. This fully parametric situation corresponds to a mixture from the univariate Gaussian family described in Section~\ref{s:intro}, where the $j$th component density $\phi_j(x)$ in \eqref{mvmixture} is normal with mean $\mu_j$ and variance $\sigma_j^2$. This is a special case of the general mixture-of-normal model that is well-studied in the literature and for which other software, such as the \pkg{mclust} \citep{Fraley+Raftery:2009} package for \proglang{R}, may also be used for parameter estimation. The M-step for the parameters $(\mu_j,\sigma^2_j)$, $j=1,\ldots,m$ of this EM algorithm for such mixtures of univariate normals is straightforward, and can be found, e.g., in \citet{mclachlan2000fmm}. The function \code{normalmixEM} implements the algorithm in \pkg{mixtools}. Code for the Old Faithful example, using most of the default values (e.g., stopping criterion, maximum number of iterations), is simply <>= wait1 <- normalmixEM(waiting, lambda = .5, mu = c(55, 80), sigma = 5) @ The code above will fit a 2-component mixture (because \code{mu} is a vector of length two) in which the standard deviations are assumed equal (because \code{sigma} is a scalar instead of a vector). See \code{help("normalmixEM")} for details about specifying starting values for this EM algorithm. <>= plot(wait1, density=TRUE, cex.axis=1.4, cex.lab=1.4, cex.main=1.8, main2="Time between Old Faithful eruptions", xlab2="Minutes") @ \setkeys{Gin}{width=0.49\textwidth} \begin{figure}[!h] \centering <>= for(i in 1:2){ file=paste("geyserEM", i, ".pdf", sep="") pdf(file=file, paper="special", width=6, height=6) plot(wait1, whichplots=i, cex.axis = 1.4, cex.lab = 1.4, cex.main = 1.8, main2 = "Time between Old Faithful eruptions", xlab2 = "Minutes") dev.off() cat("\\includegraphics{", file, "}\n", sep="") } @ \caption{The Old Faithful waiting data fitted with a parametric EM algorithm in \pkg{mixtools}. Left: the sequence of log-likelihood values; Right: the fitted Gaussian components.} \label{geyserEM} \end{figure} The \code{normalmixEM} function returns an object of class \code{"mixEM"}, and the \code{plot} method for these objects delivers the two plots given in Figure \ref{geyserEM}: the sequence $t\mapsto L_{\Bx}(\f^{(t)})$ of observed log-likelihood values and the histogram of the data with the $m$ ($m=2$ here) fitted Gaussian component densities of $\CN(\hat\mu_j,\hat\sigma^2_j)$, $j=1,\ldots,m$, each scaled by the corresponding $\hat\lambda_j$, superimposed. The estimator $\hat{\vec\theta}$ can be displayed by typing, e.g., <>= wait1[c("lambda", "mu", "sigma")] @ Alternatively, the same output may be obtained using the \code{summary} method: <>= summary(wait1) @ \section{Cutpoint methods} \label{section:cut} Traditionally, most literature on finite mixture models has assumed that the density functions $\phi_j(\vec x)$ of equation (\ref{mvmixture}) come from a known parametric family. However, some authors have recently considered the problem in which $\phi_j(\vec x)$ is unspecified except for some conditions necessary to ensure the identifiability of the parameters in the model. One such set of conditions is as follows: \citet{hettmansperger2000ani}; \citet{cruzmedina2004smm}; and \citet{elmore2004ecc} treat the case in which $\phi_j(\vec x)$ equals the product $f_j(x_i)\cdots f_j(x_r)$ for some univariate density function $f_j$. Thus, conditional on knowing that $\vec X$ comes from the $j$th mixture component, the coordinates of $\vec X$ are independent and identically distributed. For this reason, this case is called the conditionally i.i.d.\ model. The authors named above have developed an estimation method for the conditionally i.i.d.\ model. This method, the {\em cutpoint approach}, discretizes the continuous measurements by replacing each $r$-dimensional observation, say $\vec X_i= (x_{i1}, \ldots, x_{ir})$, by the $p$-dimensional multinomial vector $(n_1, \ldots, n_p)$, where $p\ge2$ is chosen by the experimenter along with a set of cutpoints $-\infty = c_0 < c_1 < \cdots < c_p=\infty$, so that for $a=1, \ldots, p$, \[ n_a = \sum_{k=1}^r I\{c_{a-1} < x_{ik} \le c_a\}. \] Note that the multinomial distribution is guaranteed by the conditional i.i.d.\ assumption, and the multinomial probability of the $a$th category is equal to $\theta_a \equiv P_{}(c_{a-1}>= data("Waterdata") cutpts <- 10.5*(-6:6) watermult <- makemultdata(Waterdata, cuts = cutpts) @ Once the multinomial data have been created, we may apply the \code{multmixEM} function to estimate the multinomial parameters via an EM algorithm. <>= set.seed(15) theta4 <- matrix(runif(56), ncol = 14) theta3 <- theta4[1:3,] mult3 <- multmixEM(watermult, lambda = rep(1, 3)/3, theta = theta3) mult4 <- multmixEM (watermult, lambda = rep (1, 4) / 4, theta = theta4) @ Finally, \code{compCDF} calculates and plots the estimated distribution functions of equation (\ref{ecdf}). Figure \ref{WDcutpoint} gives plots for both a 3-component and a 4-component solution; these plots are very similar to the corresponding plots in Figures 1 and 2 of \citet{elmore2004ecc}. <>= cdf3 <- compCDF(Waterdata, mult3$posterior, lwd=2, lab=c(7, 5, 7), xlab="Angle in degrees", ylab="Component CDFs", main="Three-Component Solution") cdf4 <- compCDF(Waterdata, mult4$posterior, lwd=2, lab=c(7, 5, 7), xlab="Angle in degrees", ylab="Component CDFs", main="Four-Component Solution") @ <>= pdf(file="WDcutpoint3comp.pdf", paper="special", width=8, height=8) cdf3 <- compCDF(Waterdata, mult3$posterior, lwd=3, xlab="Angle in degrees", lab=c(7, 5, 7), ylab="Component CDFs", main="Three-Component Solution", cex.axis=1.4, cex.lab=1.5, cex.main=1.5) ltext <- paste(round(mult3$lam*100, 1), "%", sep="") legend("bottomright", legend=ltext, pch=15:17, cex=1.5, pt.cex=1.35) y <- compCDF(Waterdata, mult3$posterior, x=cutpts, makeplot=F) for(i in 1:3) points(cutpts, y[i,], pch=14+i, cex=1.35) dev.off() pdf(file="WDcutpoint4comp.pdf", paper="special", width=8, height=8) cdf4 <- compCDF(Waterdata, mult4$posterior, lwd=3, xlab="Angle in degrees", lab=c(7, 5, 7), ylab="Component CDFs", main="Four-Component Solution", cex.axis=1.4, cex.lab=1.5, cex.main=1.5) ltext <- paste(round(mult4$lam*100,1), "%", sep="") legend("bottomright", legend=ltext, pch=15:18, cex=1.5, pt.cex=1.35) y <- compCDF(Waterdata, mult4$posterior, x=cutpts, makeplot=F) for(i in 1:4) points(cutpts, y[i,], pch=14+i, cex=1.35) dev.off() @ \begin{figure}[!h] \centering \includegraphics[width=0.49\textwidth]{WDcutpoint3comp} \includegraphics[width=0.49\textwidth]{WDcutpoint4comp} \caption{Empirical cumulative distribution function (CDF) estimates for the three- and four-component multinomial cutpoint models for the water-level data; compare Figures 1 and 2 of \citet{elmore2004ecc}. The 13 cutpoints used are indicated by the points in the plots, and the estimated mixing proportions for the various components are given by the legend. } \label{WDcutpoint} \end{figure} As with the output of \code{normalmixEM} in Section~\ref{section:EM}, it is possible to summarize the output of the \code{multmixEM} function using the \code{summary} method for \code{mixEM} objects: <>= summary(mult4) @ \section{Nonparametric and semiparametric methods} \label{section:np} In this section, we consider nonparametric multivariate finite mixture models. The first algorithm presented here was introduced by \citet{benaglia2009} as a generalization of the stochastic semiparametric EM algorithm of \citet{bordes2007sas}. Both algorithms are implemented in \pkg{mixtools}. \subsection{EM-like algorithms for mixtures of unspecified densities} \label{section:EMlike} Consider the mixture model described by equation \eqref{mvmixture}. If we assume that the coordinates of the $\vec X_i$ vector are {\em conditionally independent}, i.e. they are independent conditional on the subpopulation or component ($\phi_1$ through $\phi_m$) from which $\vec X_i$ is drawn, the density in \eqref{mvmixture} can be rewritten as: \begin{equation} \label{mvmixture2} g_{\vec\theta}(\vec x_i) = \sum_{j=1}^m\lambda_j\prod_{k=1}^rf_{jk}(x_{ik}), \end{equation} where the function $f(\cdot)$, with or without subscripts, will always denote a univariate density function. Here we do not assume that $f_{jk}(\cdot)$ comes from a family of densities that may be indexed by a finite-dimensional parameter vector, and we estimate these densities using nonparametric density techniques. That is why we say that this algorithm is a fully nonparametric approach. The density in equation \eqref{mvmixture2} allows for a different distribution for each component and each coordinate of $\vec X_i$. Notice that if the density $f_{jk}(\cdot)$ does not depend on $k$, we have the case in which the $\vec X_i$ are not only conditionally independent but identically distributed as well. These are the two extreme cases. In order to encompass both the conditionally i.i.d. case and the more general case \eqref{mvmixture2} simultaneously in one model, we allow that the coordinates of $\vec X_i$ are conditionally independent and there exist {\em blocks} of coordinates that are also identically distributed. If we let $b_k$ denote the block to which the $k$th coordinate belongs, where $1\le b_k\le B$ and $B$ is the total number of such blocks, then equation \eqref{mvmixture2} is replaced by \begin{equation}\label{rmgeneral} g_{\vec\theta} (\vec x_i) = \sum_{j=1}^m \lambda_j \prod_{k=1}^r f_{j{b_k}} (x_{ik}). \end{equation} The indices $i$, $j$, $k$, and $\ell$ will always denote a generic individual, component (subpopulation), coordinate (repeated measurement), and block, respectively. Therefore, we will always have $1\le i\le n$, $1\le j\le m$, $1\le k\le r$, and $1\le\ell\le B$. The EM algorithm to estimate model \eqref{rmgeneral} has the E-step and M-step described in Section~\ref{sec:EM}. In equation (\ref{posteriors}), we have $\phi_j^{(t)}(\vec x_i) = \prod_{k=1}^r f_{jb_k}^{(t)}(x_{ik})$, where $f_{j\ell}^{(t)}(\cdot)$ is obtained by a weighted nonparametric (kernel) density estimate, given by: \begin{enumerate} \addtocounter{enumi}{2} \item{\bf Nonparametric (Kernel) density estimation step:\ } For any real $u$, define for each component $j\in\{1, \ldots, m\}$ and each block $\ell\in\{1, \ldots, B\}$ \begin{equation} \label{densest} f_{j\ell}^{t+1}(u) = \frac {1}{nh_{j\ell} C_\ell\lambda_{j}^{t+1}} \sum_{k=1}^r \sum_{i=1}^n \post_{ij}^{(t)} I\{b_k=\ell\} K\left(\frac{u-x_{ik}}{h_{j\ell}}\right), \end{equation} where $K(\cdot)$ is a kernel density function, $h_{j\ell}$ is the bandwidth for the $j$th component and $\ell$th block density estimate, and $C_\ell$ is the number of coordinates in the $\ell$th block. \end{enumerate} The function \code{npEM} implements this algorithm in \pkg{mixtools}. This function has an argument \code{samebw} which, when set to \code{TRUE} (the default), takes $h_{j\ell} = h$, for all $1 \le j \le m$ and $1\le\ell\le B$, that is, the same bandwidth for all components and blocks, while \code{samebw = FALSE} allows a different bandwidth for each component and each block, as detailed in \citet{bch:festchrift2009}. This function will, if called using \code{stochastic = TRUE}, replace the deterministic density estimation step (\ref{densest}) by a {\em stochastic} density estimation step of the type proposed by \citet{bordes2007sas}: First, generate $\vec Z^{(t)}_{i} = (Z^{(t)}_{i1}, \ldots, Z^{(t)}_{im})$ as a multivariate random vector with a single trial and success probability vector $\vec p_i^{(t)} = (p_{i1}^{(t)}, \ldots, p_{1m}^{(t)})$, then in the M-step for $\lambda_{j}^{t+1}$ in equation~(\ref{lambda}), replace $p^{(t)}_{ij}$ by $Z^{(t)}_{ij}$ and let \[ f_{j\ell}^{t+1}(u) = \frac {1}{nh_{j\ell} C_\ell\lambda_{j}^{t+1}} \sum_{k=1}^r \sum_{i=1}^n Z_{ij}^{(t)} I\{b_k=\ell\} K\left(\frac{u-x_{ik}}{h_{j\ell}}\right). \] In other words, the stochastic versions of these algorithms re-assign each observation randomly at each iteration, according to the $p_{ij}^{(t)}$ values at that iteration, to one of the $m$ components, then the density estimate for each component is based only on those observations that have been assigned to it. Because the stochastic algorithms do not converge the way a deterministic algorithm often does, the output of \code{npEM} is slightly different when \code{stochastic = TRUE} than when \code{stochastic = FALSE}, the default. See the corresponding help file for details. \citet{benaglia2009} also discuss specific cases of model (\ref{rmgeneral}) in which some of the $f_{jb_k}(\cdot)$ densities are assumed to be the same except for a location and scale change. They refer to such cases as semiparametric since estimating each $f_{jb_k}(\cdot)$ involves estimating an unknown density as well as multiple location and scale parameters. For instance, equation (17) of \citet{benaglia2009} sets \begin{equation} \label{spEM} f_{j\ell}(x) = \frac{1}{\sigma_{j\ell}}f \left( \frac{x-\mu_{j\ell}}{\sigma_{j\ell}} \right), \end{equation} where $\ell=b_k$ for a generic $k$. The \pkg{mixtools} package implements an algorithm for fitting model (\ref{spEM}) in a function called \code{spEM}. Details on the use of this function may be obtained by typing \code{help("spEM")}. Implementation of this algorithm and of that of the \code{npEM} function requires updating the values of $f_{jb_k}(x_{ik})$ for all $i$, $j$, and $k$ for use in the E-step (\ref{posteriors}). To do this, the \code{spEM} algorithm keeps track of an $n\times m$ matrix, called $\Phi$ here, where \[ \Phi_{ij} \equiv \phi_j(\vec x_i) = \prod_{k=1}^r f_{jb_k}(x_{ik}). \] The density estimation step of equation (\ref{densest}) updates the $\Phi$ matrix for the $(t+1)$th iteration based on the most recent values of all of the parameters. For instance, in the case of model (\ref{spEM}), we obtain \begin{eqnarray*} \Phi_{ij}^{t+1} &=& \prod_{\ell=1}^B\prod_{k:b_k=\ell} \frac{1}{\sigma_{j\ell}^{t+1}} f^{t+1} \left( \frac{x-\mu_{j\ell}^{t+1}}{\sigma_{j\ell}^{t+1}} \right) \\ &=& \prod_{\ell=1}^B \prod_{k:b_k=\ell} \frac{1}{\sigma_{j\ell}^{t+1}} \sum_{i'=1}^n \frac{p_{ij}^{t+1}}{hrn\lambda_j^{t+1}} \sum_{k'=1}^r K\left[ \frac{\left(\frac{x_{ik}-\mu_{j\ell}^{t+1}}{\sigma_{j\ell}^{t+1}} \right) - (x_{i'k'} - \mu_{j\ell}^{t+1})} {h\sigma_{j\ell}^{t+1}} \right]. \end{eqnarray*} \subsection{A univariate symmetric, location-shifted semiparametric example} \label{section:SPexample} Both \citet{hunter2007ims} and \citet{bordes2006set} study a particular case of model (\ref{mvmixture}) in which $x$ is univariate and \begin{equation} \label{spmodel} g_{\vec \theta}(x) = \sum_{j=1}^m\lambda_j \phi(x-\mu_j), \end{equation} where $\phi(\cdot)$ is a density that is assumed to be completely unspecified except that it is symmetric about zero. Because each component distribution has both a nonparametric part $\phi(\cdot)$ and a parametric part $\mu_j$, we refer to this model as semiparametric. Under the additional assumption that $\phi(\cdot)$ is absolutely continuous with respect to Lebesgue measure, \citet{bordes2007sas} propose a stochastic algorithm for estimating the model parameters, namely, $(\vec\lambda, \vec\mu, \phi)$. This algorithm is implemented by the \pkg{mixtools} function \code{spEMsymloc}. This function also implements a nonstochastic version of the algorithm, which is the default and which is a special case of the general algorithm described in Section~\ref{section:EMlike}. <>= pdf(file="spsymmfig1.pdf", paper="special", width=8, height=8) par(mar=0.1+c(5,4.2,4,1.8)) plot(wait1, which = 2, cex.axis = 1.4, cex.lab = 1.5, cex.main = 1.5, main2 = "Time between Old Faithful eruptions", xlab2 = "Minutes") wait2 <- spEMsymloc(waiting, mu0 = c(55, 80)) plot(wait2, lty = 2, newplot = FALSE, addlegend = FALSE) dev.off() pdf(file="spsymmfig2.pdf", paper="special", width=8, height=8) par(mar=0.1+c(5,4.2,4,1.8)) wait2a <- spEMsymloc(waiting, mu0 = c(55, 80), bw = 1) wait2b <- spEMsymloc(waiting, mu0 = c(55, 80), bw = 6) plot(wait2a, lty = 1, addlegend = FALSE, cex.axis = 1.4, cex.lab = 1.5, cex.main = 1.5, title = "Time between Old Faithful eruptions", xlab = "Minutes") plot(wait2b, lty = 2, newplot = FALSE, addlegend = FALSE) dev.off() @ \begin{figure}[h] \centering \includegraphics[height=3in,width=3in]{spsymmfig1} \includegraphics[height=3in,width=3in]{spsymmfig2} \caption{The Old Faithful dataset, fit using different algorithms in \pkg{mixtools}. Left: the fitted Gaussian components (solid) and a semiparametric fit assuming model (\ref{spmodel}) with the default bandwidth of $4.0$ (dashed); Right: the same model (\ref{spmodel}) using bandwidths of $1.0$ (solid) and $6.0$ (dashed).} \label{spsymmfig} \end{figure} As noted in Figure \ref{geyser}, model (\ref{spmodel}) appears to be an appropriate model for the Old Faithful waiting times dataset. Here, we provide code that applies the \code{spEMsymloc} function to these data. First, we display the normal mixture solution of Figure \ref{geyserEM} with a semiparametric solution superimposed, in Figure \ref{spsymmfig}(a): <>= plot(wait1, which = 2, cex.axis = 1.4, cex.lab = 1.4, cex.main = 1.8, main2 = "Time between Old Faithful eruptions", xlab2 = "Minutes") wait2 <- spEMsymloc(waiting, mu0 = c(55, 80)) plot(wait2, lty = 2, newplot = FALSE, addlegend = FALSE) @ Because the semiparametric version relies on a kernel density estimation step (\ref{densest}), it is necessary to select a bandwidth for this step. By default, \code{spEMsymloc} uses a fairly simplistic approach: It applies ``Silverman's rule of thumb'' \citep{silverman1986des} to the entire dataset using the \code{bw.nrd0} function in \proglang{R}. For the Old Faithful waiting time dataset, this bandwidth is about~$4$: <>= bw.nrd0(waiting) @ But the choice of bandwidth can make a big difference, as seen in Figure \ref{spsymmfig}(b). <>= wait2a <- spEMsymloc(waiting, mu0 = c(55, 80), bw = 1) wait2b <- spEMsymloc(waiting, mu0 = c(55, 80), bw = 6) plot(wait2a, lty = 1, addlegend = FALSE, cex.axis = 1.4, cex.lab = 1.4, cex.main = 1.8, xlab = "Minutes", title = "Time between Old Faithful eruptions") plot(wait2b, lty = 2, newplot = FALSE, addlegend = FALSE) @ We find that with a bandwidth near $2$, the semiparametric solution looks quite close to the normal mixture solution of Figure \ref{geyserEM}. Reducing the bandwidth further results in the ``bumpiness'' exhibited by the solid line in Figure \ref{spsymmfig}(b). On the other hand, with a bandwidth of 8, the semiparametric solution completely breaks down in the sense that algorithm tries to make each component look similar to the whole mixture distribution. We encourage the reader to experiment by changing the bandwidth in the above code. \subsection{A trivariate Gaussian example} \label{ss:trigauss} As a first simple, nonparametric example, we simulate a Gaussian trivariate mixture with independent repeated measures and a shift of location between the two components in each coordinate, i.e., $m=2$, $r=3$, and $b_k=k$, $k=1,2,3$. The individual densities $f_{jk}$ are the densities of $\CN(\mu_{jk},1)$, with component means $\vec\mu_1 = (0,0,0)$ and $\vec\mu_2=(3,4,5)$. This example was introduced by \citet{hall2005nim} then later reused by \citet{benaglia2009} for comparison purposes. Note that the parameters in this model are identifiable, since \citet{hall2003nec} showed that for two components ($m=2$), identifiability holds in model~\eqref{mvmixture} is under mild assumptions as long as $r\ge3$, even in the most general case in which $b_k=k$ for all $k$. A function \code{ise.npEM} has been included in \pkg{mixtools} for numerically computing the integrated squared error (ISE) relative to a user-specified true density for a selected estimated density $\hat f_{jk}$ from \code{npEM} output. Each density $\hat f_{jk}$ is computed using equation~(\ref{densest}) together with the posterior probabilities after convergence of the algorithm, i.e., the final values of the $\post_{ij}^t$ (when \code{stochastic = FALSE}). We illustrate the usage of \code{ise.npEM} in this example by running a Monte Carlo simulation for $S$ replications, then computing the square root of the mean integrated squared error (MISE) for each density, where \[ {\rm MISE} = \frac{1}{S}\sum_{s=1}^S \int \left(\hat f_{jk}^{(s)}(u)-f_{jk}(u)\right)^2\,du,\quad j=1,2 \mbox{ and } k=1,2,3. \] For this example, we first set up the model true parameters with $S=100$ replications of $n=300$ observations each: <>= m <- 2; r <- 3; n <- 300; S <- 100 lambda <- c(0.4, 0.6) mu <- matrix(c(0, 0, 0, 3, 4, 5), m, r, byrow = TRUE) sigma <- matrix(rep(1, 6), m, r, byrow = TRUE) @ Next, we set up ``arbitrary'' initial centers, a matrix for storing sums of integrated squared errors, and an integer storing the number of suspected instances of label switching that may occur during the replications: <>= centers <- matrix(c(0, 0, 0, 4, 4, 4), 2, 3, byrow = TRUE) ISE <- matrix(0, m, r, dimnames = list(Components = 1:m, Blocks = 1:r)) nblabsw <- 0 @ Finally, we run the Monte Carlo simulation, using the \code{samebw = FALSE} option since it is more appropriate for this location-shift model: <>= set.seed(1000) for (mc in 1:S) { x <- rmvnormmix(n, lambda, mu, sigma) a <- npEM(x, centers, verb = FALSE, samebw = FALSE) if (a$lambda[1] > a$lambda[2]) nblabsw <- nblabsw + 1 for (j in 1:m) { for (k in 1:r) { ISE[j, k] <- ISE[j, k] + ise.npEM(a, j, k, dnorm, lower = mu[j, k] - 5, upper = mu[j, k] + 5, plots = FALSE, mean = mu[j, k], sd = sigma[j, k])$value #$ } } } MISE <- ISE/S print(sqMISE <- sqrt(MISE)) @ We can examine the \code{npEM} output from the last replication above using <>= summary(a) @ We can also get plots of the estimated component densities for each block (recall that in this example, block $\ell$ consists only of coordinate $\ell$) using the \code{plot} function. The resulting plots are given in Figure~\ref{fig:gausstrivariate}. <>= plot(a) @ <>= pdf("gauss3rm.pdf", paper="special", width=10, height=5) par(mfrow=c(1,3), ask=F) plot(a) dev.off() @ \begin{figure}[h] \centering \includegraphics[width=.99\textwidth]{gauss3rm} \caption{Output of the \code{npEM} algorithm for the trivariate Gaussian model with independent repeated measures.} \label{fig:gausstrivariate} \end{figure} \subsection{A more general multivariate nonparametric example} \label{sec:generalmv} In this section, we fit a more difficult example, with non-multimodal mixture densities (in block \#2), heavy-tailed distributions, and different scales among the coordinates. The model is multivariate with $r=5$ repeated measures and $m=2$ components (hence identifiability holds; cf.\ \citet{hall2003nec} as cited in Section~\ref{ss:trigauss}). The $5$ repeated measures are grouped into $B=2$ blocks, with $b_1=b_2=b_3=1$ and $b_4=b_5=2$. Block $1$ corresponds to a mixture of two noncentral Student $t$ distributions, $t'(2,0)$ and $t'(10,8)$, where the first parameter is the number of degrees of freedom, and the second is the non-centrality. Block~2 corresponds to a mixture of Beta distributions, ${\cal B}(1,1)$ (which is actually the uniform distribution over $[0,1]$) and ${\cal B}(1,5)$. The first component weight is $\lambda_1 = 0.4$. The true mixtures are depicted in Figure~\ref{fig:true5rm}. <>= pdf("truepdf5rm_block1.pdf") par(mar=0.1+c(5,4.2,4,1.5)) x <- seq(-10, 25, len=250) plot(x, .4* dt(x, 2, 0) + .6 * dt(x, 10, 8), type="l", lwd=3, col=2, cex.axis=1.4, cex.lab=1.5, cex.main=1.5, main="Block 1", xlab="", ylab="Density") lines (x, .4*dt(x, 2, 0), lwd=4, lty=2) lines (x, .6*dt(x, 10, 8), lwd=4, lty=2) dev.off() pdf("truepdf5rm_block2.pdf") par(mar=0.1+c(5,4.2,4,1.5)) x <- seq(0, 1, len=250) plot(x, .4 + .6 * dbeta(x, 1, 5), type="l", lwd=3, col=2, cex.axis=1.4, cex.lab=1.5, cex.main=1.5, main="Block 2", xlab="", ylab="Density", ylim= c(0, 3.4)) lines (x, rep(.4, 250), lwd=4, lty=2) lines (x, .6*dbeta(x, 1, 5), lwd=4, lty=2) dev.off() @ \begin{figure}[h] \centering \includegraphics[height=2.5in,width=2.5in]{truepdf5rm_block1} \includegraphics[height=2.5in,width=2.5in]{truepdf5rm_block2} \caption{True densities for the mixture of Section~\ref{sec:generalmv}, with individual component densities (scaled by $\lambda_j$) in dotted lines and mixture densities in solid lines. The noncentral $t$ mixture of coordinates 1 through 3 is on the left, the beta mixture of coordinates 4 and 5 on the right.} \label{fig:true5rm} \end{figure} To fit this model in \pkg{mixtools}, we first set up the model parameters: <>= m <- 2; r <- 5 lambda <- c(0.4, 0.6) df <- c(2, 10); ncp <- c(0, 8) sh1 <- c(1, 1) ; sh2 <- c(1, 5) @ Then we generate a pseudo-random sample of size $n=300$ from this model: <>= n <- 300; z <- sample(m, n, rep = TRUE, prob = lambda) r1 <- 3; z2 <- rep(z, r1) x1 <- matrix(rt(n * r1, df[z2], ncp[z2]), n, r1) r2 <- 2; z2 <- rep(z, r2) x2 <- matrix(rbeta(n * r2, sh1[z2], sh2[z2]), n, r2) x <- cbind(x1, x2) @ For this example in which the coordinate densities are on different scales, it is obvious that the bandwidth in \code{npEM} should depend on the blocks and components. We set up the block structure and some initial centers, then run the algorithm with the option \code{samebw = FALSE}: <>= id <- c(rep(1, r1), rep(2, r2)) centers <- matrix(c(0, 0, 0, 1/2, 1/2, 4, 4, 4, 1/2, 1/2), m, r, byrow = TRUE) b <- npEM(x, centers, id, eps = 1e-8, verb = FALSE, samebw = FALSE) @ Figure~\ref{fig:npEM5rm} shows the resulting density estimates, which may be obtained using the plotting function included in \pkg{mixtools}: <>= plot(b, breaks = 15) @ % plot(b, breaks = 15, cex.main = 1.5, cex.lab = 1.5, cex.axis = 1.4, % cex.legend = 1.5) <>= pdf("npEM5rm.pdf", width=8, height=5) par(mfrow=c(1,2)) plot(b, breaks = 15) dev.off() @ \begin{figure}[h] \centering \includegraphics[width=.95\textwidth]{npEM5rm} \caption{Result of plotting \code{npEM} output for the example of Section~\ref{sec:generalmv}. Since $n=300$, the histogram on the left includes 900 observations and the one on the right includes 600.} \label{fig:npEM5rm} \end{figure} Finally, we can compute the ISE of the estimated density relative to the truth for each block and component. The corresponding output is depicted in Figure \ref{fig:ISEnpEM5rm}. <>= par(mfrow=c(2,2)) for (j in 1:2){ ise.npEM(b, j, 1, truepdf = dt, lower = ncp[j] - 10, upper = ncp[j] + 10, df = df[j], ncp = ncp[j]) ise.npEM(b, j, 2, truepdf = dbeta, lower = -0.5, upper = 1.5, shape1 = sh1[j], shape2 = sh2[j]) } @ <>= options(warn=-1) pdf("ISEnpEM5rm.pdf", width=8, height=8) par(mfrow = c(2, 2)) for (j in 1:2){ ise.npEM(b, j, 1, truepdf = dt, lower = ncp[j] - 10, upper = ncp[j] + 10, df = df[j], ncp = ncp[j]) ise.npEM(b, j, 2, truepdf = dbeta, lower = -0.5, upper = 1.5, shape1 = sh1[j], shape2 = sh2[j]) } dev.off() @ \begin{figure}[h] \centering \includegraphics[height=5in,width=6in]{ISEnpEM5rm} \caption{\code{ise.npEM} output for the 5-repeated measures example; the true densities are $f_{11}\equiv t'(2,0)$, $f_{21}\equiv t'(10,8)$, $f_{12}\equiv {\cal U}_{(0,1)}$, $f_{22}\equiv {\cal B}(1,5)$.} \label{fig:ISEnpEM5rm} \end{figure} \section{Mixtures of regressions} \label{section:reg} \subsection{Mixtures of linear regressions} Consider a mixture setting where we now assume $\textbf{X}_{i}$ is a vector of covariates observed with a response $Y_{i}$. The goal of mixtures of regressions is to describe the conditional distribution of $Y_{i}|\textbf{X}_{i}$. Mixtures of regressions have been extensively studied in the econometrics literature and were first introduced by \citet{quandt1972sr} as the \textit{switching regimes} (or \textit{switching regressions}) problem. A switching regimes system is often compared to \textit{structural change} in a system \citep{quandtram1978sr}. A structural change assumes the system depends deterministically on some observable variables, but switching regimes implies one is unaware of what causes the switch between regimes. In the case where it is assumed there are two heterogeneous classes, \citet{quandt1972sr} characterized the switching regimes problem ``by assuming that nature chooses between regimes with probabilities $\lambda$ and $1-\lambda$''. Suppose we have $n$ independent univariate observations, $y_{1},\ldots,y_{n}$, each with a corresponding vector of predictors, $\textbf{x}_{1},\ldots,\textbf{x}_{n}$, with $\textbf{x}_{i}=(x_{i,1},\ldots,x_{i,p})^\top$ for $i=1,\ldots,n$. We often set $x_{i,1}=1$ to allow for an intercept term. Let $\textbf{y}=(y_{1},\ldots,y_{n})^\top$ and let $\underline{\textbf{X}}$ be the $n\times p$ matrix consisting of the predictor vectors. Suppose further that each observation $(y_{i}, \vec x_i)$ belongs to one of $m$ classes. Conditional on membership in the $j$th component, the relationship between $y_{i}$ and $\textbf{x}_{i}$ is the normal regression model \begin{equation}\label{regmodel} y_{i}=\textbf{x}_{i}^\top\vec{\beta}_{j}+\epsilon_{i}, \end{equation} where $\epsilon_{i}\thicksim \CN(0,\sigma^{2}_{j})$ and $\vec{\beta}_{j}$ and $\sigma_{j}^{2}$ are the $p$-dimensional vector of regression coefficients and the error variance for component $j$, respectively. Accounting for the mixture structure, the conditional density of $y_{i}|\vec x_i$ is \begin{equation}\label{mor} g_{\vec\theta}(y_{i}|\textbf{x}_{i})=\sum_{j=1}^{m}\lambda_{j} \phi(y_{i} | \textbf{x}_{i}^\top\vec{\beta}_{j},\sigma^{2}_{j}), \end{equation} where $\phi(\cdot|\textbf{x}^\top\vec{\beta}_{j},\sigma^{2}_{j})$ is the normal density with mean $\textbf{x}^\top\vec\beta$ and variance $\sigma^2$. Notice that the model parameter for this setting is $\vec\theta=(\vec\lambda,(\vec{\beta}_{1},\sigma^2_{1}),\ldots,(\vec{\beta}_{m},\sigma^2_{m}))$. The mixture of regressions model (\ref{mor}) differs from the well-known mixture of multivariate normals model $(Y_{i},\textbf{X}_{i}^\top)^\top\thicksim \sum_{j=1}^{m}\lambda_{j}\CN_{p+1}(\vec{\mu}_{j},\Sigma_{j})$ because model (\ref{mor}) makes no assertion about the marginal distribution of $\textbf{X}_{i}$, whereas the mixture of multivariate normals specifies that $\textbf{X}_{i}$ itself has a mixture of multivariate normals distribution. <>= data("CO2data") attach(CO2data) pdf("gnpdata.pdf") par(mar=0.1+c(5,4.2,4,1.5)) plot(GNP, CO2, xlab="Gross National Product", ylab=expression(paste(CO[2]," per Capita")), cex.lab=1.5, cex.main=1.5, cex.axis=1.4, main="1996 GNP and Emissions Data") text(GNP, CO2, country, adj=c(.5,-.5)) dev.off() @ \begin{figure}[h] \centering \includegraphics[height=3in,width=3in]{gnpdata.pdf} \caption{1996 data on gross national product (GNP) per capita and estimated carbon dioxide ($\textrm{CO}_{2}$) emissions per capita. Note that ``CH'' stands for Switzerland, not China.} \label{gnpdata} \end{figure} As a simple example of a dataset to which a mixture of regressions models may be applied, consider the sample depicted in Figure \ref{gnpdata}. In this dataset, the measurements of carbon dioxide ($\textrm{CO}_{2}$) emissions are plotted versus the gross national product (GNP) for $n=28$ countries. These data are included \pkg{mixtools}; type \code{help("CO2data")} in \proglang{R} for more details. \citet{hurn} analyzed these data using a mixture of regressions from the Bayesian perspective, pointing out that ``there do seem to be several groups for which a linear model would be a reasonable approximation.'' They further point out that identification of such groups could clarify potential development paths of lower GNP countries. \subsection{EM algorithms for mixtures of regressions} A standard EM algorithm, as described in Section~\ref{section:EM}, may be used to find a local maximum of the likelihood surface. \citet{deveaux1989} describes EM algorithms for mixtures of regressions in more detail, including proposing a method for choosing a starting point in the parameter space. The E-step is the same as for any finite mixture model EM algorithm; i.e., the $p_{ij}^{(t)}$ values are updated according to equation (\ref{posteriors})---or, in reality, equation (\ref{altposteriors})---where each $\phi_j^{(t)}(\vec x_i)$ is replaced in the regression context by $\phi(y_i | \vec x_i^\top\vec\beta_j, \sigma_j^2)$: \begin{equation}\label{regposteriors} \post_{ij}^{(t)} = \left[ 1 + \sum_{j'\ne j} \frac{ \lambda_{j'}^{(t)} \phi(y_i | \vec x_i^\top\vec\beta_{j'}, \sigma_{j'}^2)}{\lambda_j^{(t)} \phi(y_i | \vec x_i^\top\vec\beta_j, \sigma_j^2)} \right]^{-1} \end{equation} The update to the $\lambda$ parameters in the M-step, equation (\ref{lambda}), is also the same. Letting $\textbf{W}_{j}^{(t)}=\textrm{diag}(\post_{1j}^{(t)},\ldots,\post_{nj}^{(t)})$, the additional M-step updates to the $\vec\beta$ and $\sigma$ parameters are given by \begin{eqnarray}\label{betaEM} \vec{\beta}_{j}^{(t+1)} &=& (\underline{\textbf{X}}^\top\textbf{W}_{j}^{(t)}\underline{\textbf{X}})^{-1}\underline{\textbf{X}}^\top \textbf{W}_{j}^{(t)}\textbf{y} \quad \mbox{and} \\ \label{sigma} \sigma_{j}^{2(t+1)} &=& \frac{\biggl\|\textbf{W}_{j}^{1/2(t)}(\textbf{y}-\underline{\textbf{X}}^\top\vec{\beta}_{j}^{(t+1)})\biggr\|^{2}}{\mbox{tr}(\textbf{W}_{j}^{(t)})}, \end{eqnarray} where $\|\textbf{A}\|^{2}=\textbf{A}^\top\textbf{A}$ and $\mbox{tr}(\textbf{A})$ means the trace of the matrix $\textbf{A}$. Notice that equation (\ref{betaEM}) is a weighted least squares (WLS) estimate of $\vec{\beta}_{j}$ and equation (\ref{sigma}) resembles the variance estimate used in WLS. Allowing each component to have its own error variance $\sigma_j^2$ results in the likelihood surface having no maximizer, since the likelihood may be driven to infinity if one component gives a regression surface passing through one or more points exactly and the variance for that component is allowed to go to zero. A similar phenomenon is well-known in the finite mixture-of-normals model where the component variances are allowed to be distinct \citep{mclachlan2000fmm}. However, in practice we observe this behavior infrequently, and the \pkg{mixtools} functions automatically force their EM algorithms to restart at randomly chosen parameter values when it occurs. A local maximum of the likelihood function, a consistent version of which is guaranteed to exist by the asymptotic theory as long as the model is correct and all $\lambda_j$ are positive, usually results without any restarts. The function \code{regmixEM} implements the EM algorithm for mixtures of regressions in \pkg{mixtools}. This function has arguments that control options such as adding an intercept term, \code{addintercept = TRUE}; forcing all $\vec\beta_j$ estimates to be the same, \code{arbmean = FALSE} (for instance, to model outlying observations as having a separate error variance from the non-outliers); and forcing all $\sigma_j^2$ estimates to be the same, \code{arbvar = FALSE}. For additional details, type \code{help("regmixEM")}. As an example, we fit a 2-component model to the GNP data shown in Figure \ref{gnpdata}. \citet{hurn} and \citet{youngphd} selected 2 components for this dataset using model selection criteria, Bayesian approaches to selecting the number of components, and a bootstrapping approach. The function \code{regmixEM} will be used for fitting a 2-component mixture of regressions by an EM algorithm: <>= data("CO2data") attach(CO2data) @ <>= CO2reg <- regmixEM(CO2, GNP, lambda = c(1, 3) / 4, beta = matrix(c(8, -1, 1, 1), 2, 2), sigma = c(2, 1)) @ We can then pull out the final observed log-likelihood as well as estimates for the 2-component fit, which include $\hat{\lambda}$, $\hat{\vec{\beta}}_{1}$, $\hat{\vec{\beta}}_{2}$, $\hat{\sigma}_{1}$, and $\hat{\sigma}_{2}$: <>= summary(CO2reg) @ The reader is encouraged to alter the starting values or let the internal algorithm generate random starting values. However, this fit seems appropriate and the solution is displayed in Figure \ref{co2EM} along with 99\% Working-Hotelling Confidence Bands, which are constructed automatically by the \code{plot} method in this case by assigning each point to its most probable component and then fitting two separate linear regressions: <>= plot(CO2reg, density = TRUE, alpha = 0.01, cex.main = 1.5, cex.lab = 1.5, cex.axis = 1.4) @ \setkeys{Gin}{width=0.49\textwidth} \begin{figure}[!h] \centering <>= for(i in 1:2){ file=paste("CO2reg", i, ".pdf", sep="") pdf(file=file, paper="special", width=6, height=6) plot(CO2reg, whichplots=i, alpha = 0.01, cex.main = 1.5, cex.lab = 1.5, cex.axis = 1.4) dev.off() cat("\\includegraphics{", file, "}\n", sep="") } @ \caption{The GNP data fitted with a 2-component parametric EM algorithm in \pkg{mixtools}. Left: the sequence of log-likelihood values, $L_{\Bx}(\f^{(t)})$; Right: the fitted regression lines with 99\% Working-Hotelling Confidence Bands.} \label{co2EM} \end{figure} \subsection{Predictor-dependent mixing proportions} \label{section:pdmp} Suppose that in model (\ref{mor}), we replace $\lambda_j$ by $\lambda_{j}(\textbf{x}_{i})$ and assume that the mixing proportions vary as a function of the predictors $\textbf{x}_{i}$. Allowing this type of flexibility in the model might be useful for a number of reasons. For instance, sometimes it is the proportions $\lambda_j$ that are of primary scientific interest, and in a regression setting it may be helpful to know whether these proportions appear to vary with the predictors. As another example, consider a \code{regmixEM} model using \code{arbmean = FALSE} in which the mixture structure only concerns the error variance: In this case, $\lambda_j(\vec x)$ would give some sense of the proportion of outliers in various regions of the predictor space. One may assume that $\lambda_{j}(\textbf{x})$ has a particular parametric form, such as a logistic function, which introduces new parameters requiring estimation. This is the idea of the \textit{hierarchical mixtures of experts} (HME) procedure \citep{jacobsall}, which is commonly used in neural networks and which is implemented, for example, in the \pkg{flexmix} package for \proglang{R} \citep{jss:Leisch:2004, Grun+Leisch:2008}. However, a parametric form of $\lambda_{j}(\textbf{x})$ may be too restrictive; in particular, the logistic function is monotone, which may not realistically capture the pattern of change of $\lambda_j$ as a function of $\vec x$. As an alternative, \citet{young2009mor} propose a nonparametric estimate of $\lambda_{j}(\textbf{x}_{i})$ that uses ideas from kernel density estimation. The intuition behind the approach of \citet{young2009mor} is as follows: The M-step estimate (\ref{lambda}) of $\lambda_j$ at each iteration of a finite mixture model EM algorithm is simply an average of the ``posterior'' probabilities $p_{ij}=\E(Z_{ij}|\mbox{data})$. As a substitute, the nonparametric approach uses local linear regression to approximate the $\lambda_j(\textbf{x})$ function. Considering the case of univariate $x$ for simplicity, we set $\lambda_j(x) = \hat\alpha_{0j}(x)$, where \begin{equation}\label{lambdax} (\hat\alpha_{0j}(x), \hat\alpha_{1j}(x))= \arg\min_{(\alpha_0, \alpha_1)} \sum_{i=1}^n K_h(x-x_i) \left[ p_{ij} - \alpha_0 - \alpha_1(x-x_i) \right]^2 \end{equation} and $K_h(\cdot)$ is a kernel density function with scale parameter (i.e., bandwidth) $h$. It is straightforward to generalize equation (\ref{lambdax}) to the case of vector-valued $\vec x$ by using a multivariate kernel function. \citet{young2009mor} give an iterative algorithm for estimating mixture of regression parameters that replaces the standard $\lambda_j$ updates (\ref{lambda}) by the kernel-weighted version (\ref{lambdax}). The algorithm is otherwise similar to a standard EM; thus, like the algorithm in Section~\ref{section:EMlike} of this article, the resulting algorithm is an EM-like algorithm. Because only the $\lambda_j$ parameters depend on $\vec x$ (and are thus ``locally estimated''), whereas the other parameters (the $\vec\beta_j$ and $\sigma_j$) can be considered to be globally estimated, \citet{young2009mor} call this algorithm an iterative global/local estimation (IGLE) algorithm. Naturally, it replaces the usual E-step (\ref{regposteriors}) by a modified version in which each $\lambda_j$ is replaced by $\lambda_j(x_i)$. The function \code{regmixEM.loc} implements the IGLE algorithm in \pkg{mixtools}. Like the \code{regmixEM} function, \code{regmixEM.loc} has the flexibility to include an intercept term by using \code{addintercept = TRUE}. Moreover, this function has the argument \code{kern.l} to specify the kernel used in the local estimation of the $\lambda_{j}(\textbf{x}_{i})$. Kernels the user may specify include \code{"Gaussian"}, \code{"Beta"}, \code{"Triangle"}, \code{"Cosinus"}, and \code{"Optcosinus"}. Further numeric arguments relating to the chosen kernel include \code{kernl.g} to specify the shape parameter for when \code{kern.l = "Beta"} and \code{kernl.h} to specify the bandwidth which controls the size of the window used in the local estimation of the mixing proportions. See the corresponding help file for additional details. For the GNP and emissions dataset, Figure \ref{co2EM} indicates that the assumption of constant weights for the component regressions across all values of the covariate space may not be appropriate. The countries with higher GNP values appear to have a greater probability of belonging to the first component (i.e., the red line in Figure \ref{co2EM}). We will therefore apply the IGLE algorithm to this dataset. We will use the triweight kernel in equation (\ref{lambdax}), which is given by setting $\gamma=3$ in \begin{equation}\label{beta} K_{h}(x)=\frac{1}{hB(1/2,\gamma+1)}\left(1-\frac{x^2}{h^2}\right)^{\gamma}_{+}, \end{equation} where $B(x,y)=\Gamma(x)\Gamma(y)/\Gamma(x+y)$ is the beta function. For the triweight, $B(1/2, 4)$ is exactly $32/35$. This kernel may be specified in \code{regmixEM.loc} with \code{kern.l = "Beta"} and \code{kernl.g = 3}. The bandwidth we selected was $h=20$, which we specify with \code{kernl.h = 20}. For this implementation of the IGLE algorithm, we set the parameter estimates and posterior probability estimates obtained from the mixture of regressions EM algorithm as starting values for $\hat{\vec{\beta}}_{1}$, $\hat{\vec{\beta}}_{2}$, $\hat{\sigma}_{1}$, $\hat{\sigma}_{2}$, and $\lambda(x_{i})$. <>= CO2igle <- regmixEM.loc(CO2, GNP, beta = CO2reg$beta, sigma = CO2reg$sigma, lambda = CO2reg$posterior, kern.l = "Beta", kernl.h = 20, kernl.g = 3) @ We can view the estimates for $\hat{\vec{\beta}}_{1}$, $\hat{\vec{\beta}}_{2}$, $\hat{\sigma}_{1}$, and $\hat{\sigma}_{2}$. Notice that the estimates are comparable to those obtained for the mixture of regressions EM output and the log-likelihood value is slightly higher. <>= summary(CO2igle) @ Next, we can plot the estimates of $\lambda(x_{i})$ from the IGLE algorithm. <>= plot(GNP, CO2igle$post[,1], xlab = "GNP", cex.axis = 1.4, cex.lab = 1.5, ylab = "Final posterior probabilities") lines(sort(GNP), CO2igle$lambda[order(GNP), 1], col=2) abline(h = CO2igle$lambda[1], lty = 2) @ <>= pdf("lamplot.pdf") plot(GNP, CO2igle$post[,1], xlab = "GNP", cex.axis = 1.4, cex.lab = 1.5, ylab = "Final posterior probabilities") lines(sort(GNP), CO2igle$lambda[order(GNP), 1], col=2, lwd=2) abline(h = CO2igle$lambda[1], lty = 2, lwd=2) dev.off() @ This plot is given in Figure \ref{lamplot}. Notice the curvature provided by the estimates from the IGLE fit. These fits indicate an upward trend in the posteriors. The predictor-dependent mixing proportions model provides a viable way to reveal this trend since the regular mixture of regressions fit simply provides the same estimate of $\lambda$ for all $x_{i}$. \begin{figure}[h] \centering \includegraphics[height=3in,width=3in]{lamplot.pdf} \caption{Posterior membership probabilities $p_{i1}$ for component one versus the predictor GNP along with estimates of $\lambda_1(x)$ from the IGLE algorithm (the solid red curve) and $\lambda_1$ from the mixture of linear regressions EM algorithm (the dashed black line).} \label{lamplot} \end{figure} \subsection{Parametric bootstrapping for standard errors} With likelihood methods for estimation in mixture models, it is possible to obtain standard error estimates by using the inverse of the observed information matrix when implementing a Newton-type method. However, this may be computationally burdensome. An alternative way to report standard errors in the likelihood setting is by implementing a parametric bootstrap. \citet{eftib} claim that the parametric bootstrap should provide similar standard error estimates to the traditional method involving the information matrix. In a mixture-of-regressions context, a parametric bootstrap scheme may be outlined as follows: \begin{enumerate} \item Use \code{regmixEM} to find a local maximizer $\hat{\vec\theta}$ of the likelihood. \item For each $\textbf{x}_{i}$, simulate a response value $y_{i}^{*}$ from the mixture density $g_{\hat{\vec\theta}}(\cdot|\textbf{x}_{i})$. \item Find a parameter estimate $\tilde{\vec{\theta}}$ for the bootstrap sample using \code{regmixEM}. \item Use some type of check to determine whether label-switching appears to have occurred, and if so, correct it. \item Repeat steps 2 through 4 $B$ times to simulate the bootstrap sampling distribution of $\hat{\vec\theta}$. \item Use the sample covariance matrix of the bootstrap sample as an approximation to the covariance matrix of $\hat{\vec\theta}$. \end{enumerate} Note that step 3, which is not part of a standard parametric bootstrap, can be especially important in a mixture setting. The \pkg{mixtools} package implements a parametric bootstrap algorithm in the \code{boot.se} function. We may apply it to the regression example of this section, which assumes the same estimate of $\lambda$ for all $x_{i}$, as follows: <>= set.seed(123) CO2boot <- boot.se(CO2reg, B = 100) @ This output consists of both the standard error estimates and the parameter estimates obtained at each bootstrap replicate. An examination of the slope and intercept parameter estimates of the 500 bootstrap replicates reveals that no label-switching is likely to have occurred. For instance, the intercept terms of component one range from 4 to 11, whereas the intercept terms of component two are all tightly clumped around 0: <>= rbind(range(CO2boot$beta[1,]), range(CO2boot$beta[2,])) @ We may examine the bootstrap standard error estimates by themselves as follows: <>= CO2boot[c("lambda.se", "beta.se", "sigma.se")] @ \section[Additional capabilities of mixtools]{Additional capabilities of \pkg{mixtools}} \label{section:misc} \subsection{Selecting the number of components} \label{ss:nbcomp} Determining the number of components $k$ is still a major contemporary issue in mixture modeling. Two commonly employed techniques are information criterion and parametric bootstrapping of the likelihood ratio test statistic values for testing \begin{eqnarray}\label{mixturetest} \nonumber H_{0}&:& k = k_{0} \\ H_{1}&:& k = k_{0}+1 \end{eqnarray} for some positive integer $k_{0}$ \citep{mclach}. The \pkg{mixtools} package has functions to employ each of these methods using EM output from various mixture models. The information criterion functions calculate An Information Criterion (AIC) of \citet{aic}, the Bayesian Information Criterion (BIC) of \citet{schw}, the Integrated Completed Likelihood (ICL) of \citet{biern}, and the consistent AIC (CAIC) of \citet{boz}. The functions for performing parametric bootstrapping of the likelihood ratio test statistics sequentially test $k=k_{0}$ versus $k=k_{0}+1$ for $k_0=1, 2, \ldots$, terminating after the bootstrapped $p$-value for one of these tests exceeds a specified significance level. Currently, \pkg{mixtools} has functions for calculating information criteria for mixtures of multinomials (\code{multmixmodel.sel}), mixtures of multivariate normals under the conditionally i.i.d.\ assumption (\code{repnormmixmodel.sel}), and mixtures of regressions (\code{regmixmodel.sel}). Output from various mixture model fits available in \pkg{mixtools} can also be passed to the function \code{boot.comp} for the parametric bootstrapping approach. The parameter estimates from these EM fits are used to simulate data from the null distribution for the test given in (\ref{mixturetest}). For example, the following application of the \code{multmixmodel.sel} function to the water-level multinomial data from Section~\ref{section:cut} indicates that either 3 or 4 components seems like the best option (no more than 4 are allowed here since there are only 8 multinomial trials per observation and the mixture of multinomials requires $2m \le r+1$ for identifiability): <>= <> set.seed(10) multmixmodel.sel(watermult, comps = 1:4, epsilon = 0.001) @ \citet{youngphd} gives more applications of these functions to real datasets. \subsection{Bayesian methods} Currently, there are only two \pkg{mixtools} functions relating to Bayesian methodology and they both pertain to analyzing mixtures of regressions as described in \citet{hurn}. The \code{regmixMH} function performs a Metropolis-Hastings algorithm for fitting a mixture of regressions model where a proper prior has been assumed. The sampler output from \code{regmixMH} can then be passed to \code{regcr} in order to construct credible regions of the regression lines. Type \code{help("regmixMH")} and \code{help("regcr")} for details and an illustrative example. \section*{Acknowledgments} This research is partially supported by NSF Award SES-0518772. DRH received additional funding from Le Studium, an agency of the Centre National de la Recherche Scientifique of France. \bibliography{mixtools} \end{document} mixtools/data/0000755000175100001440000000000014343400152013053 5ustar hornikusersmixtools/data/Habituationdata.RData0000644000175100001440000000117614762772101017111 0ustar hornikusers‹ r‰0âŠàb```b`a’Ì@& `d`aàÒü‰I™%¥‰%™ùy)‰%‰ ÌÂ`å |@lì`°·`ñu.[#[m6ñu«ÜŽ “ª‡îëDªlºÀŠÏÒ@ÀÁÊׇòU³Êß8h70€€ƒî/ˆ>eiK”Ùµ™x îx¼¹Bì?{éãÊßÏááªu·Ò#ˆ¿M™ áaµWêshø†ƒZ6cÍKÌM-2 y,È”kg¡kHÎI,†i€ rr¨^ZÐ,4åœEùåz0;xA&B²ƒ1ÿa‹k"v mixtools/data/Waterdata.RData0000644000175100001440000000746614762772101015734 0ustar hornikusersBZh91AY&SYtÇçÈ_¿ÿÿÿÿÿÿÿÿýö?ð/œ€îÿÿÿÿÿÿÿÿàË뤨—I ¶9à@èï^ªR,’¥SÍša&„ÂbE?hЧåOLšž)ê6£e£ÀPiéå’Š[rL5ÐJÔ[¶6Yß$~Ëç¾é%=.Ã1«2šöX'oÀsâ”7ü+|Zñ1×½ßOžS”ázãôÙ´š‘8Õ}~*’çEû¯ÆØmöÉïtuWzÛÖå}àßÄT.NVcŸ[M„ú–8=U4>O‡¡ŠûþzÏotVªcOfQå"¦6$nb”à3 Fˆqà<œbïÆ[—=‚*åråáOV“´lên$÷Zö±¤Œ—¤Œ…Á§œVûN;VøœpŒ«-I€È¬LÚ†iá±X!ÀÍlajÊ駉áãóW #ͦÓ?­¥íÒMSÖô{"²ö êɰ*ñõ·„Œ7Ý\;“ñ¾z©þM†–Å$ól5èI5>_g½©oѨ»"¹©_ɇCw¬ft­ïâéÉp•¦ æWÍ!Mlu+Â`‡M‘÷sEÀî ÌÚ:g«m.V§Q¦Ý²»¬Ý‡ôÜ÷ý7-kÏ¥Útÿ…®¯e ;—1ãŒ9@Ï…žAçuŒ}p ªO¹ê<½ÉÄê}¾Øõ]ÿËVËŒ:0ÕJ :"“((E1H¦žb´­((éà1ˆ1&!(2‚\J䘂ŠR”TJV©)(ZÒÄ©™ŒP¢¸(‘ˆi‚ŒIXÆ "bV†€rárN!1(Äâ+2ÉY0–… ÊCAJP 4ªƒ@%"tò˜©4p˜„2ˆG…!³@4†(„¤2A‚¡ ÈM JÒ!@­"RR†$Ä *Ñ@Rüj¬ýàa0@),"ÆK :oË‘DÒk:M&vvvvvvnnnnnnh’I$’I$©&íÛ·nÝ»víÛ·náŠãàæYoÏ<óÏ0<;íbº\²Ë,«–Ye–UŠ»»ºÅ]ÝÝb®îî±WwwX«»»¬UÝÝÖ*îîë=vØÚoß¶Ûm¶Ûà¶ãÇŽÕŠ»»ºÅ]ÝÝb®îî±WwwX«»»¬UÝÝÖ*îîëwwuŠ»»ºÅm¶Û÷ïÛm¶Ûm€×‡Ö*îîëwwuŠ»»ºÅ]ÝÝb®îî±WwwX«»»¬UÝÝÖ*îîë¥i–Yi¦ši¦€iÇ +wrI$’I$’I$’I$šë¿‘ÉדÉä뮺ë¯j$’I$’I$’I$’I$“=uÝZïß¿M4ÓM5¢I$’I$’I$’I$’I3¬gw|xñãÇŽ`ÌI$’I$’I$’I$’I&ºi–Ygžy瞀ÐI$’I$’I$’I$’I&šé–Ygžy瞀ÐI$’I$’I$’I$’I&¸ª­9Ç#§µ˜åJž¼´®„k°|Ž‹O€D!õFµ gÀbK~¯  eþ:‡âw¹àmýxŒ#¼…È¯ð„†’ŦM tnAs½’nØÁ «I6}ÜM¢) EiW‰¢iZ(‰„tPPÁ"Sï2 †€h J „J¤h†”hÞc ¦XBbˆ¤)R” i+$€b¡( B†¨¤(j7¬bš(hB‚•ËÆ) Q Ê€1)H”” (åÔb¦„¦Œ•Œ"bS ` 0 ?Ç&g9M¡SŽÍݯ³ù•+i0Pis~¶|,Àªã£³ ;_?ã{¦+³Ã3Û‚^„ÂCT ÓÚßgbzÓ¤c]}a“ M¤¤0C‚7±(J_»²öïò„25ì™o :‹Mäj M ‰£M<;ÈÀ[-»AmÁ𫈦1ƒ ¤ƒþ}Ҡ⨱Hbàb™Q¼Ì…þÂJ,a|´°0¦c»™ÚìX ÆÔt7eeyzÇ’Ç+mu•£+^5¯. 7¹™ÙxƒÖ±r:m¦ùŒù¬‘5¬GUçÐ}¡¼°«›~¸JQL‰T¿‡5óR5WU¬c׆‰öâ>* Mº9B€,b}'7¬l¶À0:ˆ©°¸xîçôIàøûû‘O‹›NG.<ˆS»²2Œ°EJ°–¿¾¡ ³‚¸˜"Oöæ6\r53G¹_ßˆ× îÊŠŒ·Ó¸~+w… ¥8ôºEà*Iû Oܤ#+j?’ryÄ„ûiÔÂ]a·òvüÜÖtà¹÷áñÆú<Ý86©W‹ßÇòõÇ`‹e¡Š\ˆfBJ `0ìaaƒPIDƒðÑfs2p-‚ª'a&‚3m+6D8CŒEo>#ø‹©zå…PrA|7 7o6•(C-µp»&ã#n·Y'Ø[žA¤u–-±øpw.8¦£ÍÙ^Š8Žm~,Ð5Ý€Fk±ö±Ä¿ke¥®wR[*=v¦u½ÑØS}rwǬ‹?q>ª_§ÄT¾ÞÙý¥%é…KïïÛGëxT·?©Ú;/K…Kº‰r}-]²‰}…ªà²·ðaa M€€Ey ÒýÐî{šd¡=[Èq=¯nâ®ÍþŒMÍ ’—ŸàЋÁi¸)ª|•+Û-Ñ{‹¤Ñ-EÚ:léMXô&5„3\¦/·Rü´äÒÅï.‘Ø#(|Ñ[¦”Ž”Ž8æ«gvsXlôiï\èqθ"7!x•Á:ÍÎ[}$ÜÖQÖ×’šþãp§‰.‘Öõ1Áä@(Ûbíbg Yu‰Ñ[œK\ýSœýŒ] *Ú˜g¹Â5Íè›(Ÿ‡¸ÌBDã”ÌåÜ”Ÿ#žþ™S¨jµS„ÑJ¦\K¢zÒ‚´<\0æA` ;y—R¯NÒy†Ù9¾>JÁG‘Ñ» —d8.I aE–ÀOâ„?|qÍáUF †cÀêcb‡6k–€’µ N˜éŸq)¬).nE¤ÕH…ƒK¸6æÞÂw¨·~¶ûZ+W§Æ‚ëò…mP[SÅÝ› œQF{ ÿ8ßmgÓ»¤»ÉVg÷û9š=?ÈgÖJD5”8Ó¬"€£ }'™•+ [\‡b§‘9É ß½¤BÞ«z­ª]ª›ªb@TÆÆQ]ÙҋоÉ$åäFk²œ¶|Ê’èí´¢Hµ• 1ð'X2íOrYÒ©M‚kFÉR6­&¢QkyÉ¡hkñ«Ö½šãõcAòcµn‹3˜g’m 2Üôl»c`5Áû¿éi0cåÍùè_J ®á]Oi±¾Q¬³?˜ÍhCEM~î¶íSíÜIÌÛå(]Ð6˜b+…°jH¶~ÚÌþØÃEHþuÛ ­'|ÂM ·zã'öŸÓ{2£jÙäjzE|¼¶ôSúHjÒ»½B œ“XŸçÓ8ßM«Dº†:!`šå* kâ”Îß3`yßie‰™ÛHÖoª¤xþ”Ør gTZq] âʥ̑–.KÙ‹Æð9Ý0 ¬j"^rüeðÞ¬ôŸ¹QÔ©lG+!TÅèm8«‘ëHîv=ýÀùUUt]Ø&t˜V!J‰dðìµ_šF9/DEn¥¤úX4üVÙVSÒ—ð$K|¤Ô5ºC¿À;åSI˜b¥;‰„ô—»]bO£­n¤²sq[lûÒ.¢ƒ&[?cz•þÏd|ÿôÏ"¢úËŸì™Ñ²ÓÅù_‹h³/HŽæõr­øµÂ“¼Cqp\fnÎí$)ˆêV‘£œ1¹ç9ÆJy½TsR\jU¡D¤Ñ‚â= þþM›èˆVÌmä;g•å:üÛS‚Yè¿bLb>év¾×wÙÇÊÃÄ뺪 ©·m)]`ïmfa ž¨90í’©àöuI$¹h^shûÊÁ$`²]9Ä(ŽÅíÁKç•éèäÙmöŽªÄ}?*íÕ‰÷¶J=”Ó½ÅÏ©Â*\Û^«•RP±ÁznJ®î³LfQ‡û{+FÀ‡Å|q¶ðÐLéM¢L̘îˆ~Ɩ׃qÓÈxçeÅ@ÏzÆö³Úçh^gkI5'Ù^|ìÄŒe7Ü-›Á^µí™øSûÍÎ9Eè~a!R#¬·z~9[a^IbÜ.ãêY…dÞg•`/‡ï"Ç&ó‹®ïçóqh€æ†bf ÀhvŠq}¬ô|«ìÉíø’OcŠ>OT¦ÊïüÈÜÇ@x'å’ ð$C“øô×Y}éÅiBEx¡Öü÷†Ðצ ûïüÏêf·ž,ý¶sºš·§Jk÷ö%æ–›'&$³oBuÜ}å ¸Zô|” ýÕ~ÛÚêß`ÄVÏÄp¼z ÞúfTRˆŽ6©¤½Â“ó÷–.êkj“깘‡¼±ýEš“>"Êž~ò±‰•A‚FÆiS]^ÁáÔ„1?’°_à!6=‰,}Ûe$ú]'¦,è <ä…›|6o€Á—32OÊmdÜ2Ë:#‰Y¥‘H‘­ô·TyyX÷EüY—>~}+;¦ïÝßýóÊlL…¸]O2 {”o½cc„Ü3‡Æ]¶Blãž]a¢ŽJâOó.-6‚8’CÌÔÀŸËOß­˜jŽ}§f0cÆ1 ¢€bðhÓH"„| (áð~8iâ„#ÄË,†„!COE c køŠâ†! |ý^‡¼óÏ<óЪ23ö`€ˆƒŽ8âÁ™™ (‚¶³ƒÕiÙj49w ­ ƒ¡ˆmMU±ÙP½¨xÚ ²Ä¦†ÛXŠ’5´˜ÐÀ™s‡UC¡ Ê1 AÔÛ[M*²ªbä³KÊ9Šh”¢ ¤RRôKtS)ŸÂ:…ääq¡ÓˆeHȇât ‰«Ï%ÜK»-ÂäÞ¼÷Ê_sÉ-9-]htž·“Ü®ÊÀÔEj3.eâ0Äòˆ]ʃ&ÆÐŠm‚;sL Û*)•æ%ƒØÊÏt¦ì<ÇÈ+ÆËDZÅèR\§¢†ØÎ3W_“!<„ÄÛCm`„ŒI˜±båA¡Xš(Cm4é…Ž4Ër$ —.í4èmЄPÚ§YÜ»Ê;$ !Á¦Ú@ñ"Bˆ“ĶrwTŒ)@O“šLB:mÞMEh`ˆ†ˆÚÃpt#bE1¥¢‘Be‘6ãphÛ¨ÃIá«!‚™BŒe¨“AcŽ7ÉCŽÀ¹ Å” ™dE¼5Šv:pC¸ÌG,Lƒ¡GsÂÅ ¡ Í0ë2¡+an&Ü©2¨I8L›—DbÕ«(cq&òi–U¶!” 6œŒ‘7,íe¢¯Á9•Ž&Ç( Ps$ânÃ3³Ü2NšdDÆÚb‚bÅÝ™:ˆX¶€Ó ²A8R7LX–,cíâB„@ÀXou- M6B™e+D,4܉YÓhÇZnÕË)åÿÅÜ‘N$=(üÀmixtools/data/NOdata.RData0000644000175100001440000000222714762772101015154 0ustar hornikusers‹]”ˆTUÇßÎÎŽîì̺lRfajB¨Íû-"çVJD¹«nÈ;¹+%Ûš»¦ffHDDD„TD¿-!DBD"¢ŸfQÑO–©™ÙÙ™qvvß¼×®ŽûÃîó±æÝ3ïÞ{>ç|Ϲw놴OÇ5M‹hÑ&þnäf4Â_ ZTkæc¬£³'³7£i×ÉUšÖÊi–¬¾úèÀ©[Ydûʉ/_Ù—/ÿôçõ/ÜÁæ%îûäa  ´¥òü’³[Ù|1»r†w®_¸íðÏÊ ¹¸fñ;Ÿí‡|ÏC74?Å’r¸0®¾CÐÞÿÆËCõ½ï?®}7ÔŸx(¾~LºïzÑy®áþ6ñ^QfÍÂí¾ï`FLßÿ-‹ üÄWàYpˆ‡ ‰0~.@yªØ÷Ò=¯ÃÐø[¯jÝÆøF ¯a±SK¿~óXž%¸—sxP9³QDj²é¶G6ý곦òßg‚3ò©#±e×ÜÄZølíÄ4\]&o[tÑѽŸ²Ö¹Y<ßÅ»&×Ë„àÚ áè_;z-w 9‰kg üÅ€Iù¹ƒ%pÝ”Š‡5“ŽX£ˆ¶ë LK¹Ö±¨(ÏÒoØ™^”- ‡:ê:©ôfª\ϰµJ)˜…º¨Ò–Q–”² ²yÈk]x0{ïÉ…PÀ<“ª®,ÁEå’³¸ª;ø"ÜM¿A‘‹ÅW²¨Šª¨çŒ³E”ëüi¦”ŽaLéÉZPç’,ÃPFž&åØÌ’¢ŠÝwCõÉ"À/ 'eÞ™Î0„~ÿÁ>œÝ)Ÿ°¡*Ü.~JØ5!Ç¡1ðT Àyýè·¦ú<ÙvOA€}YÅ~óU~àcßå×IáaDÕ o ëYþ­b_”1¿šÒ<ì#÷'DÃnÿñü9Ö¢£0®ô†’P/¶<ö³0*†ÃW)®\`_{á<ž¿¯?P‘Ã*(a?ûb˜*‚§ÎqX¨ñì¹P["&n¿ã¾¢p_¿#¢{f¡ÖW¶ÓÓ0Šq–Q—ž÷3&m7Tð>( NÅ.Y¨¢Ž¡n¾:¿PÄ:†zˆrøƒÎ€ýQƺ_Â:‡ëÂzXãÍ£Î#XßKêþOÊÛ>ÞO£x.ÌÇÇüËØ/ãÈı†±ßó¨WóÈb¼YÔwXõóœÛº©?óxï 7ÚÔ•.?F::ÑjÙ¸çÉÇöeúzûwôÎݹ£/3î ?ÆÅÕ¿zçw:gyóÀîý«ÿKãDC*4ôÐ0Bà +4ìÐpBà µaô©;ÉJ‘¥“ee’e‘e“åå’E :1tbèÄЉ¡C'†N :1 bÄ0ˆaà †A ƒ1 bÄ0‰aÃ$†I “&1Lb˜Ä0‰aÃ"†E ‹1,bX݈aÃ"†E ›61lbØÄ°‰aÃ&†M ›61b8ÄpˆáÃ!†C ‡1b8Äp‰áÃ%†K —.1\b¸Äp]þž¿ÿGC”º mixtools/data/RTdata.RData0000644000175100001440000000522414762772101015165 0ustar hornikusersBZh91AY&SYXÙç 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà_1•"ªT¼>à0„òŒžSL5=¤Æ“4šmLŒ™241Šbm# Äiå4dò˜OHzCM14Æ£M4õ6£LÔõSÔÂdɦ4òjièjzOI§©š˜›Iå40¤zM4ɽIé£Q é 51¢`F©é6£ÒDÆLM'¤ôÓA¢2zši¦ÔÓL†jm'¨Ñ§¢l‰êmM0'©š êz4P I¡´š4=& ´Œh&M4Ó%¿ýUAÿUM=¦”˜€ TRÿꪠ €L „À&4ÀLšbdÓ&# ÓÀ À €OdDÒh)¡é3Q  Tõ5•47¤š@Ð h€ Ð  ÚÜl4éù¡ƒ›hŸ_ /¡ã Á1B4$gásÝ®ÍÎuÄå0™*g ÅCxÞ¶üÍ_F|vþ…ECßF‰›UˆuûòŒ}&˜öIdy€BžåÇb¹g !€Üi¶ ~Q#AQº£€¨9ü(ßzØÓƒš¡×¦íÍÉs^WlàUbøÛ¯D†ÿ pSN—Ú$êëXa5ÉŽÜ€…3’fY|¼10ï‚îØé0YÆGd¾£¬Ã jŒ…õ9“«EÐ&³€à)7Ì/œÁñ ÕìÌð•¬Á2R–«V¢€Ë(†ø¬V:…\%³Œú(:sCªþµ´c‹^>ÖŒŒÃ˜ô¡Gºf³2ù¸l-lhhJFš·X^@ûöBGØ šwrJÈ›ºðéÅ©%­£Ý—‘+„—øœ8=¨^ëkÍ‘Ì0UyoúׯÊáM›Ny²®] ´ˆ2d딼vX1^fëÞ‹'µ+Bcq xµos„r¶2 Y©q<41Ûú)òá €Ç „â 2ÖéíÄÎÀ¸ðf=¨œ„sšh;"ßÚ.œ¥)ÍŸ*Lf€5†n¡ñSÁx\–”Dý—¤×½²fr­ Ù%Mwx)ZF¥Âþ§nuWIª(“ùcÖ84*27‘ƒnuÎÄL0ÑrÏú¦À©²@öåõuì +zzT­2mÙ9¨ÂÎÌØis…|aº,'˜Ô’— Üú&ÔÚ¶ aé. M)¿ßä@ˆuœ‚sŸx®ð‰u”X™et§è7ücáVõ.…ðÒÖÔÍ(å{Ø-.TŸevر{Ë×&Ç|ê[57¯I~Ï–™Îçk6#Â’©àÎíûëXšÈ¯V-ëLJ`.¹+T5|죫 ©áGÊXŠÐI|þ4Øc¶ŽT¸µA혖Í.%&›ÉxøÃÀñ7IeõTD°Ïf0ãN/×jWAP²ÝS rIª1g¥¦.ìz-WD°QªM—ŠLRöx2 k!½ëaù•ÈnĤ”«H˯_},q5(£‹#Ö±<ËÒi&k6òQr[T~ë½Ùœ5Oplu¦c„M’¡Š1fiç¼0¢øP_}?ÑÛí dÞíuÎÌ×™´þ"ýÞÂdïzW™´0Á 0AµÅÈc-ôÙ–WQ3:"D‰_ Ø`·Å ‚!‚!žA‚Ñ Búqe²J€A«#¢I!â;P6Õd4ÙBž” ‚ :m°A¡P@)©µTqll’@Ó´±4[Ö‚ˆ@цâ ]tA!MÆÀ¨’/üíOK{ð-á$AGØÅ@Ÿ°²šÎ@×AQNV¥UZµßƒZÁPXÐ*"Y ÇÊÎŽ®è@3²‡àÎ&ª`Æ(òyŠz¦¡ŽÃ”•"FU;X.Ž¥6¬D@@n‘‰­bæ DˆB ß_'¬ÃÂÃÃÃÅâbbbDDDDC…AzTŒcÆ1 ZÖµ­kËJÙ%" !ˆD@B"ˆ€„D" È8gï䊑ëqÇqLJI$’Pò8‡Àì48óÐMkZÖµ¯$’I'› lÞ3 z*Öµ­kZòI$’yè@dL0üì Æ1Œc©$’I×aþ>ëôyØ&1ŒcÇRI$“¨ÚȆA8ãŽ8ã¬I$’dB²(äçÏŸ>|ùÇI$œƒ˜Ü<3cïEu×]uמI$’z (?B¹†l þLh!‘¤‘1™)2¼°¦Š¨hLfFM‹ED(“! ØÑ¥q *¶1…qdì‹Jn‚è®pŽ!"…àÖŽ¢( „õ<•@fÇØH\èÉd±ì+)xÌŒJÒ2“ÈLë"‰¢cK!<ýL9Nh 'råÁ¥ÎÝû.*ÀÂt½¹ l #X ™•1GÏ%Á|§#É‚ÂY…ej…ãnç`UÔcÂI;…wxµÐ©€«e8Ne,[Ò½D&2áUv¹‘%¨AEB#&,tÌ h*µ¹á0Ó¯R')œ§0Q†4²†‚en. ¬,ã!p$™©ÌÎcAZe9Mâ .´¨2:çq¡m›Ö€†B2yŠ Á'c3'@4R1V1PD2–©ºØ7ŠHëjª½-2ºÆ)AbyÂÝv@P'¡ š"³Ð˜Œ®–N„Êãmh“Ȥ‡EBœ1ÎäœUQ36•¨6 BAÛlÀeh­ ‡)µ!3p•å;ü Ñ0.Wvú…r,‰2¢^8‘º_AÍ+‡b‚e¡8 ®4ç|¯' 2$Í‘p.€¤ˆ‘M+6F#8H+£kû“_ MTŒÙˆ-Á [&gbJuDÅIä Ä­Y“³9€Ž o¯BH•qäwÕÎBµÖæ#Y ÈaédÂp÷açSHPè$0\(‰ÍÊ0m±kIÙ`Gþ.äŠp¡ ±³Î"mixtools/data/RanEffdata.RData0000644000175100001440000017430014762772101016003 0ustar hornikusersý7zXZi"Þ6!ÏXÌáßâïÿ])TW"änRÊŸ’Ù$ï‘ö¡¸¤w“TXšm†;|…Z®ŒÕm¬>V«Š×­Æîi4Œ"Œr?CΚ´8§Þ,0º,s(¾ÞÒ›²9»VÏz§§ãd0u³“]ç±pݺ—Å.UPg†¢þG§ &=$¡¹DŠ]DÒL£¢ò%üG^œ:QUòŠü ¬ðœ‘0vôâgc ew·ÖØ’ÞJò%!ô‰r˜|™¦^ñºÝt®bÂ˸®×Žœ•w&(Ðlümh Ä(è2bÇ|‘]Îx—nüQ·˜*ê~™ßYUÿŸSûC8¥’Œøµp”* BïiŽw o§¢åöÖCGTY¦Â­AVúe?U»eŒ ¦èNÆàdpϼ+à—ÙÛ/ð¤mCÌlàc•c¾€¨úÒ{ˆkåc°¬­~ÜŒósV {µ”hôä3ŒÙ|½€úû?Ú¾Pz,6QªMâò°N;óh¡3¼[7êhª»¸`qì$Jø}ÁŽÆ`J‚üè@©Ä7!»t"çñmˆü¥Ç®Q”÷Ã΢Àì¤oÂZÉ6™w*ßì Ù³àE¤ML+d»"A†ãjg3Sè¥ój·×ËOš°ßð¢Î`ÌD³’Ÿ8RoÆö…aéj‚ÀlwŒpæqš­¹OT]ÝüÈÞ«7N+AÝÍ.øñq†¦TíQ‰TÎijê;ãð\ê¬ÙÁE?¼´-ž®û/z]èrûÑgÁÁUá\Î_õƒ4↛¯¬òÂ|…cYSËUÖÉ3 0Ó™L†#l†*B"'ðcX\ËëzR'œ¥>8‘¤ÔXÖ]Ù}=pwÝUPõ;¶Ëî•»|JòHø®ÀÜ.WÒj±!ÂÔѼ:;Ö7…Sn8+¢}ŽßX°³\®bì}QZcj®y®6« ñ-LqŒÂ¥,~Þ7~= ×™½6%ù_¡¬šZùSÂÝ‘cÒÕÍÓBøîG> 'д›’e«v–╃©É0Ô*W¢œ¡íµ‹åÁæ0•rà=5ø(´\Jo.Á˜k¥Ûô‘Žd\“\Ö%±‹€/¤¤rùBxP¯Ó=³}ƒëÈ.H„Š¡xž=8½uÈ aÇ¥+&ígÝbåé!¹€ñQ;ˆ]ÊÛy—q é óêŸ;<ÔRÝ›ÖÄ‚Z/½æë%wµìÎ}-9©)36­üè¥# †¿ïsO¼Ô•페&…mÔ,4”O˜1õ"A²ž…OÁ¥û9•V«~•dE¶šQ}FïéÁ¾´ý–zÝtÿ£`I&·8,$g“ÍvCvZ$Ž©n¸*úájƒ8ÛŸœP”ÑY¾¾}f—ÃÅá•ãœik^ÆbýêXÔÓ;4Šª¸½µÚá_"5Ùîiy`¦ ­Zç ŒÏ¡­´+b¼ÞõѲ¬!Ænº™‘xŸYõž!°65pD÷‘£¥g·]©Ð7Tmÿ#48¥g]høD˜¹^"Ç'jÊw3YÆw¬?5H>»õÜÜv5?ø®j5HÅ ¬Š\Û¨ÆÚ ÓSû¦òR÷Q…ÄOºXè›VÃø¾ŠV; /ˆƒÈ¨Uû!X} ºº˜Xw\ËÃΡºÛ{ÎI¸s‰ú7®ô¨ª³Q®øÀFëíO½»hØ*9ÑænÄrôiñ@¹ºæ(+ªÕUŠúµÃ§R˜¡zDçI&ÛGÐ-¼\‹}ó£Bo/íô=¬Î&CÚz«s.p½`É|ôQ¶‚¬±%McàŽ\ø¯ùŠ.dÎ/gÓFdXþ@tÕ.Iˆæ©ÚÇúiv RolI¦á·Ò‰D˜øOAVÅÈ‹riŠóöØÌ2'Õ ¼¤ô«Zφi·÷(ØõÁ¼G-f0Ž«›$jÛ[¤ŸùGH&Áz)Ô@°OØ¥Üqª*dI3 e} Íò¿ììcÍð#ÊètspqûÇO'gLKs.îG¹Û~°é2Ð,òŸJrÞo£pJYïå t ‹¸a`Û‚ æzan(ÂC(Ž&–g¦HáÝqwôŧ¬‚ Àê²™æy¦Ïû>æå¹½eøÜšQxIî ´Œaþn¹µœû6—¢†÷×–TQ&SKÆP8‰þo \Î-{i¥¸äZa!HË»3Cà@²®UcÑ›o‘Õy—XÞQñúÒ©öÙðW§ÎÖEÁ5å² å¤ÞôÒOµøÜz…Š9X†ö׉MàZoR_ÖŽß$ÑÁhKÍ«Bêã?AlVÒôó`v:!òQ¨¿¥2E)ÆÍnÜŠŒ}||fÅ`4q4 ó!úvƒU–¾ÖUîhnäEúŽ×ƒ>Nä±Ð–v×£1YK­Bõ¥þ:¤ïiVkTÚ  ¯€X—Y±4À¸ÍOó¢€#:_Ô>ÿ§S…Â&ïkx+Í®ù¿ûB¯v^u˃ä5ö›ÿDNI!¤cÖÊiÎø`a*›¸­j¤Xⱓ%<ÜcM-ÿ…ü¨"@ÙùØ#áVW·Å?´y ®³çæ’ƒÊûÙ=‹ ˜‡—‘²®šÆ?L2IÙšX_P>‘¥ãœà þö4* 9`*øûyak,ä@áÂÑĘۘ$­àX`m¡ÎæHˆc',½â|åáë¦ìLÇÅÛKÇEèF½ŽSQXÂ\Xµ¥$·åAÁÑÅ¢/¸?IÝIðIíàŸ­WX@—{D+`dzi%4F£L@%Ê[E ÅbQTµ‹®Å™%å§ÉÚ?â" {ðñë»8VôW†3ç‘…y¦‚šÈ4–8:Ó [&_¢Ì÷U`;Û÷cئãèw±/ݯL}ƒõ™$ˆ¼HŒ2ͺ0æ B¼:9¢Le½—xAwÊ,Ø„¯§Ù|³Ý?«à<ÿK쨾lÒb˜‘B‰À³:ÉÂT9½ä :ÐN`©¬Ð5—Ø#ðÛÑØ¼©«ÿ££z’8’ÀéÚ˵Li¡³¨*«7s”•z…ØúoÖ!VÄO¸A»‘+<aây<2›ÊÉnhnéÄ«!ãËûpªá¢PWôîL’|ñíóü#àã'BO~,,ƒWMíZvû“ÎppVÐUÙÏ_/…BKÖë, ô$Ûþ–ô>ÓñËT}¤.;¶çXÀ\àÉõùÎÿñ¯¬3Žß³üW43„ã û°ñÑwGŠ?³¯ŒZ™¡à†õé‚€ÎÃQü'Çe£x´?8.`J†Ùˆ#ƒ¯¢¶ )»Á<xY›vËÅb°3ŽŽ€ö®4d‡ò– {I*‘'1±6æÐ ?ê©pHËH•¥ÌÇ,#?ö"0¡+BÿÂ9›”) б‡À†$h¼Qßã&¸£o/˜¼·Ã RväT­ =ðÝ·€¦à{0Ò¾¡7]µJÒìv&üÛ‘m Ù? Ú ç¬¨Éò~Îô~A–Õì©'°éŽÌƒb.ÞÆo:<ÜÐ n‡†ÆŸuf žT2+.õû«ì˜¥‡yÃÍ ‘ìÜR”ËãïkDÅãxÖü¿¶ñ©‚é©ìóÑ´[Òç½›ÿ·7°ÄÀ@IÆ.­¹œX Ü{U+É1ìåÇ´E—+šôÌMÖj[fAÂôà‹ 8æq'Ý =LÝMôœñlvÍÏX ™Œ¼76Û2Ð ×î®°‡ËIŠ:Îú…*áhÚšÂKõÏhI-ˉFKŸË[5d”ªfs·ü ŠYFö‡þ uî´8‹á§ñ5È-YÄ$ |©˜Ö¹Ýæ’ÜíF¢FÚ Æ”¤Nß¾Éáúí>W JLøSEèPê FjËÇÛ–RŠÏk1£†¸¨ˆÒŒ~ÉŽ—jhÑyõÔeŒ5 z W&}ZÏN`É :qW -sä%dÕ1m-w!œy®Ôè;›92Dý×UFû5h³©ç¢Ó3?î¸=#xqóýºÈ\ïBv\~HEjZÛ|Š´tÅã§…ÿ≠!œÑ’ §äÌu‹ŽS¢Ÿiù³œÂék•\Ðhw9 9±M˜ûóQ8«eYº ا‰èmè!—nw’t‚yIYf$óÙó〜³¯‰ÄJG+Ó°b`ÜðÇ'ú2ÀØ:<ú4?‰.d¦‡Ù312þÌìâ& ev…Ш·V5#ÙKï«Ë2äãLò]•ˆ‡/PÏÂÖ/¥Lx ïMÅ(ŽØý:6í˜ý¾Xƒþ´p¬Òžbd{t8AsÌt!êíÆ)±]ýµ2e8`.ÝŽÅIä´Êˆ¿­ÖÉ(Ÿ[ßOy>еgd€Dmp h¥›[6T 5ØOH=8- –<ª¦âÜëMºòÑ7Æ YÐÉ_]`;ïþÜA²ÍfåyÔÏBoÄNuJ—¼áü’޾ؿnÍ=×Žåæžu`sΪ¿GîW:†?Eõ5Ðìì¥'˜íÏ»dŸÎºi2% HÈÈ:ï¶ð3ñ£úõËøÓƒS7æxþÝ[¿š[Q /­¶œ|k¹âó˜ÊÏciĆÓZ°×4\IÖî·ÑÓò•ºS6lX~¡¾Jv(ßj«êt@T §”y¡^gù‘‚‰ÏÂðê Ÿáä…r¢ÌÙl»sXÞ•¨¥¤ÚÊv’ކ,ns4¡÷Ô„®æË³b®ŠÀ „˺y’òÉRª“‚ © nxyü`,Û·$~¼§×ÑÒÐô© Ó´¯ý0Á•ߢîÑE*ÊŽék—ìfû Ø‘·èã¤΂óµ÷=Ç ß¥¬ hÀg‰ôžåÞ¥SUáeôaWî…/Îmb/n—ÑyÒ̺#ËnKv3$V¦FŒ86Ø03ÆåíÝ•^NQ™ÚÎnz/M‘ÙžTVˆµ“Òhó†¸nà]äMܘžï§2s8(]—Vî3$ ´Déèd±Ñ—â¡-”N±Õ´Ã½™gîåZMö¾‘nš#÷Žç„ìçe8^ÐxuÒ´ÇcÝZ½KPt•[ú©V/å à·M’Áy‘ É)ép5!ú ÷öóª…’ƬT*{§½V♀‘;ŒMH%­ïÿð¿RjK´•ïà„ƒdÝ~St[ëó&ÌyI,·F’WÙÂs”ƹ  y¦¦,‚ &†à0ùÔífNz&ö;¨óÂldù-·8G²$¹Éƒéä‹©Ê׿èåƒUd1>9ý²†aco”ë¡_ˆ ]æ_±èœl©|&½P(eÒ¯¶·ŽPø‚Ÿ  Ic—ûªÇÇ0#Q/yÖ|ͤRù0v6›@_:ŠF*ŽœuÛÊ!†îË/a1Ç=ÉUW°Ú)öÅ]íSRÔånî/ØÌýä&td«ÁáOúósºn ¯´!á>òaÉdFñAæC\íò—…¾¹)„"ëĸd§zK䤛„ðþÄ>“@ÆÜ.5ÄÜ5NçÃ-@±ºXB“†Œ*O)eƒØE¾pᘕ%É|"Q\Êqó•}mŒù¿£3ÏŸ@““ŠJ/)^Ú ÁT|…÷­2dÜãji1c´tL|éú­pcÊwlUµÿ¯Â©äçW`$;eòPIúú³$À’Ôáe”¢9 ôB¢Àûz{ Û¢a‰a«t줽úo˜µir! 0~ÙÚ+¼»áôbD5ÔÔÎ¥N¾ñlº±´âß”ÿ¦h¦U™IýãçÀ ^V6þ! ü.q¸U¡‡®¡DeózÉÿ®JKXпùm 0ÔZÆádÆI.N¨bj)tM•D.#_æ_¶Â®Â5@Áò(ŽÞUMTK‰¸ÈX׬&"!TPvèh Æ |rž†ý§<V« 8ãÀ  ß¨æ'#GótJrü³…l¬“û·™Ý ó£Uì&O|˜!‚ÜE'º¹'×Õ1•J† J ƒœW¹ÊÒ”Úg)wá¢:ª¼L±Â‘ò¤¹iôƒópÆH3Yv¨·øŸ^[h«ÌþK»¤.;Z|b1Ä›RÑâÛ^_ ì.p_Š}鬔Ö<•˜Ç6“ªÉ²±Ï¾Ïé9¢Ë†DçVëÆÌ/\¿3XT{Ò¨xg{È·S¼Ýa¢*»Ì›5bÎpã98f½nX¥÷pfP€ÛbÌÿVè»Ëà ì´‡Î0gúY¡zS=ó”1k"´8¡eI‡Ÿ½á;k‡^,£ÿróQæfAÊÙ"ÿ»wèL®@²îPDºSöÞ[¸Šgœ»”zÖk âÙKÕvŒÕ"K²t-Ùüb˜¥,l‡ÿ†í›2åVt¶è*†¨ÕP'¦±ð7o?LMú mh¡ÅÊnôÎÒi&´q µìË=; 6†…Vû³?H±ˆeGœK]~XÄádÙJž¬–¶Î^Z#w´Î…=7)ÆÕ4Wö„ªá…ø÷®zîžÌ±²Ê’:&ÔÕ0V•˜ue-ÒTrøjý›$\/Ÿc9«Ì[üÑ@Ž (hŒô $gKëZPüõM¾­}鋈 D"ÂX]ŽÒFo‰‡®"æ²-{:£×á‹MHiU2ø¨¸2MlÚ3§@l•Äÿ&}Yì•\íRRº¿„¦½w=Ê],J$m–Þ¹ ÓŠ¿Ä`Ûq(ì +Öœ´ˆÂm HA›Ï³ù ®\Ã9n:¸fW•嬮’³$ÝžÒïë×:µl–yŽcÉoÒù%ò'°õ¢f˜{¤}Þû[ºÈmá£X¿Ðp?ˆpÁ²Ø›·û0#4åKÒ™ÄZö÷¢ÏÍ2~µY}ä±F8jë¡j• ´ýDKƒöÒSië¯Otæ ýåø:È“ÆÐüKa9•«»h%H_²y}R ÒÒxn±ÈFÀn¾ðóPóM"Êþ¢·,²ÈUkF¤få® h9ÚˆCO–È®=ÍfûáSï€qxÕt&¤ ݳLãUeb÷î—ÚJÓrÛ¨‚\P!ÆE? Ø PÑÌ0¢\A: ôä ²dã X‰Ñ7kë@ªÁ=eæ_;-J"ıßS½ƒbYÒgXFjÙ>";&T9¼©r¿QY‹Ò¨ïnäžbÌ!°@‚¸;Ù{Ü}º²¥\îYX\G O!{¼ƒYc®êŸîÇ1'´8‹™ 4–[Q íʼBÛÔðUû ¢Ã6dè»áÔ1óµÖu¡ó”ÈÈî®N:¥Ÿ¸Ôíü>Ú:°Ì˜B°Åy/£ÝWÃÞYZG f²è¹°[öúÐC÷É®? ªÝ< B»½7XÌZ·p@ºš|{4tóào‡!^^ AÁÜP>†¨ ~“µ¡€TÚñR6M5 —®ÊoAú«Ž ” ÜLÔ\œIË~›œcbHêÑ÷Zg{ÓäµÞÑ(£6Ìô/µ“Ÿ+ÓÎbÌ’-ݼԃ‘6f‰.ÿ•;ÖP™äƒÝ¾@á}Awdù· ‡udÁû&ËÇzÒó>…ÓÀE9ã`X 3A’¾ÿJE_!ÎZ5vžKÍY×—Uý:ßâ+B‚ôùäâk¾sI+ް©Ã5ÓÛ †Õ_zôl/’ög¼1¯oý 1bL€:HÜ@Z\Z¬“øÞîÄrš;ÊÛõ0 –ñOˆßÄVG¤ƒ:#à<ÞEÏKòñgÆ2cÂk#9=VfuÃÏ£€åWû+Tvb-ñÕçc“´Ö¬æ…±þkÁìw{N<8Æa »+Ô0miø8aÍ(¼)F]zùðº‰åÐ]C>t:Θ‡¹øàå…%! '”“ òhuGÔU|/,ë÷[(;ʉ¿hŽü›HäÎlª±Eƒ~«µ†%‡]ž5Óœ»}ÌjF•igïZŸÅ— FIxä‹´gX8ò‹Ž.¸ÌvG;­g(b¾òÞ¥K׈Ó;OAŽMŸŠ‡Ñ’€žâÆ6¼3ûÔ|è“ +B8¤ä;IÐß¿öÉ® 7Iã…‚3bq=ˆ- ÆˆX#iJG°y§áe˜†¿ èI²uÚFøûZQûŽà¿ƒes&ç×hÒ¯3.¢Â¡švä¹%fe³+[<Ã¤Ò Ù$|U°NY¹ø£Âø¬xeP µrF—¹¦Â9·ªm ’¡ˆjkõâ±…I‰MÑ[‚Ãå(ïYè•"ùôG€dwz ÖþI 9Ého @‚ù:Êo¼8:»ˆ³úºVöZÐÑÏn[¯ øë’‹ïAjÿN’‡Î€rÀfŸŸðD­\’9“%mîk”Ã1ÜgÊhg”±­”z{GR_ÐæfAì°+Œš B>PÄ×#;mg&×e½®ƒ'¸QØsÒ 0ÖýM€ZšñNçÔz¡ x«èuT]Ù¢ÒEqо‘ƒ1Ž¡Ôßtng•Á÷^=™ÖAÝÍ#— ;ûKA¾’"ßæ4ÉÖíöæ¶õMùùI3`G,  Áœö[¬ ^¾þôôZîçЫYíxíã®L kf2 K ôr­äÿC~so_>FlÍ€«ÍÉ⎀¦Aþ1-êsØ1Šº¾;s+VF\§áùÔJ«ªÿ“ ï{ëO<=YpÌNA{Ðêhé”xÂ-^Ú>¡%j(ƒÁø [·–ßðÌú|v÷ž-îÃÄ îw@ɸA†KD$; © ¼ÁcV¡jØœ(FÔ:BfR@*«Òbc ‡ Žžça¸Qd$à`…ƒ`çժƱxL¤üHGÙLÏ­ ay3ÜQ\ýä_–›âìid’u…UwÊÍH“-E­3%½ Îz÷›v¦‘ÿÖ;ݤ:û)¡@þ/⎮]¡V@Óª3üìWì*<惣Ҋ _d¼ÌzMI™ÛÄ‘rƒE½´åžC/Yð·çnþ¯õE«†¢vn›s(ÜÓs¥@ãÙDý zD6ñEЛö[ð1¸l™Q¬“U¨­W&¡”üƒñçŽd>ùœåŸµµÊ¼Û>F àO!‚!Eåá¤3L׌««J› QÌèEaüü×]¡%çyks¶—†Ñ”•<ŸÀ˜êIÔ–ØŸ0Sôhµâ”ˆØêÉ¢kÂu~ÞÃWÂ1ÿØÇÚÀhÌwÞ¯µcÒk‹g³9 ¹JKF /ÛÜ.Ô;Ý@#ni¦ì–~Rµ¡Åš>;r¢¿ HìÆ4Þx6ÀÍ‘ƒáo>7YöÕØSô`¼;Kx %#“smê)ü>Ž?%óvpðã ü‘ m»EŽxJ.š¢ÉuˆÖC¾fsë(޲‘\bÃM"²¨4…µçìl'}8ÛV«„Å«ÃûG{,4š[Ìòwñãßï7ÊcUäE&° —à—}<í­t€«öõÛæ]rJB ɘs¿“n=H;¶ÔX*ê—öN» †©ÊJ×À5m!¯AO Z­£ïL”V„VÑô%¤þœ^qÈE›1Yñù¾( #¦ØŠ®á¯Ä-9f;½HØ&8}Ð‰ê© ËÔ ˜$C YmšFglKl§À™Á·̧W¨¸ËÍŸ•b]'tn»æ`›`’{?Íy/Kd"˜Uh Çáž ‡’„Ĺ¯(Ô¬(V&©üJ* PˆP2s¬#ŸjB•‚¸à½úä>!TÆÛ÷û&öU¯W+<ŸOcSü&åxð›œ;s)cÂ&V¦>çäq…5Xaph%á+¢3|ÄYÐkc¶ô©Ã`œ'$Ú ï¹å¸K±½_éVJÍË?@ Ëö{\1n^Ø{„àgvâ+aÅYrSÔµ±x•öJ!ºnÛ2º;Ž,!÷ë_ó[ÉkGÄs@ŽïQñü7º†vþ×6ÆÂ„ “ðëÍÝ;8º¯ÏI Ù©ÏP¹¤0ÏÿÕ0„ÞŠÃ+2x,Ìß›½XÛWZ«·¦…û˜·…óÝr1%Š­¨hó -µ‰®¿ëqóQ/xñ…ITªÙDoþªÜ´¦5FŠe…‹®õEYàÆ]ä¦OøÍÿÙåv*câ-f}üùɤfúã1s•íãXïY×ñ;r5VÕ,£›~…R•U¼ÖTC¿„uw_J“½’y÷ÿ/Ó‘ÊÏšåqdm>XûõWE<—Öv0u8[VQÀ€Ï¢$iž®²ŸöÊB˜3ÄÆh½`M/¤ùDcM+#&cO%"Á'Xã8HœúÈGóç¢PÁŠs“ †š(üùä›Éš·Ïþû-íÂC “¦Ž.ŒLBPåŸö§ æ½É£ Ú4¥dã*ËÑ™3:öæ¼üÝ`ã¿e/ý657;mšñ· sW§Ã"q¶EÈh >Æ•ÏGA»ž0çyW.³Ø`/̸mhüp‘ëÅBî)Šâ‚”Ýí rʈ9¢{ö¢W}}¡¨k&%qyD2nÏÿ«c¯¯Et"” ƒZQENSŒêÑ'#¶ŠÃnˆ˜Äéx¬·íÒI‚RwýÙ•ÇWÈëeHó¿ÉSbíú’ëÝ‚!h·PîMøfЧ5Ññ2¸ü·4Û YYñ7dÇ®/„ö‰JäÒôSÄñÈÅóÏI~#mX›£Ý»@tR^4 6“e2W>i(@«l$zn1‚œªsv÷(k[˲h;¾!W Qï»'|^]ò£¸ìAzÈ8H"Î\F2.s¿¡¢ã|£¬l ' À²¤¶×è…JZ9¸BT°9hלÂ7<(ús‚rðè— ·êºŒ-¬Eé|(z‰§lŠè4šƒ½ár¼ôˤKw‘­Ú¸@i\-¯#,ö¡á-ouüLRâ›3Þœ‚Lã’Ëe {b_räÚ!cm\ÝÉø„^ÐÁ1ü™ÎEò\„“pý™î7SPäx½>,XâÍ€ˆž™°Þø–+µlíl],¿AzoÉ?Ë6'd[dƒ„^Ÿé”¹&qNöhOUk™è8g&Î!êsÿ˜£ H/©²àðY˜; 5N–“¬a€^¤i\TÆwtVa î‹KnÈeiAp$·ˆ>rm$l®.ìhŒ(¡“ ñ¨Bâ ê#Œº¤^2ưèCzíÆØ´é1)%È%Ãøó’Å5Ÿ§² ëQŸ¤4|äÞ^‰i#åŠ>)Ê:óÙÊ:(Ì_NûÞ…–)‘\‡˜5‹ià˜Z˜wÎpöUj†î¨šÀ›rðé*QÇ»«dîþÈ<6Ö‚§ëegKþÓÑêÐ"Ôrµ€ã‰bfbT‹ÒvkUÑ ‹¡ÞÞhJÐ÷—+ŒÉ,þ# {õLµëؤ>YtŠŽè´³jaúÛX‡“®]RtY.,\ö÷6"ªJ­:õœF{­[ääH`ùzèo·Ú{4è‘?¼»3×Kªjd•]1ûï£Z6ßH`Júÿ× ÌHbº8ÿ`W‡X˜â„ªVœuË&,ùràùf~\Ü ^•k0þg"Q×¹`3\gZ+ë°.q, ™ K¸í¡ÐH¢ -j´< *ÚßMóno(Ú7?×»Lëg¢muÊÅUjÇ„1åý¸O£vJÖŠ—g»X >Ô¼cÇÿI"uµ_6{—Ñ•TÖig£Ld{(¦²…öÏ龺ªŠAثз²ÄSï}¦ùÜ8†@³ùî‰äÁc…¨ÇÇüS?| ˆ8Å·\ä÷ª&w‡9žJ$LßEm–¢D[}ž¢X{TEŽ[Ǿ{9D3]|¿ðž~8u(P¹¨œïžðl#¨N¥¯Ò¡|Y²ºšâ[d¿’ç¬ëdòp—ùZóªÅb•ñ®—œ»ÇÝûÀ—~ “mà#.HÑx aqØö¨4 ãÊvW/ìû2`›m²÷_àçVÐfÜÈ|àØ¯³Õ®5(y¶ùL€%Ã’Kb÷mëÁ¼©L\ð‰Ü—콫Ç`A19wMšsØt´œ¸•€eÉR®Ð‹µ¬Lv×Yî þ4ù&oíW‘¸¥¢£êüƒh{,(_3Ûw'OÃÂ~ŸbèþˆÄX-D²vï³dÓªµTH}‰ûeª(´pAª#¸'F3Øå:ÁÙ,ëp—Ká½Ec¢›(E>§ê½ r¾ø¹l–QT_z.Œ>/žý³sjw‹¹u—9àIÄghÐeõ¡k¥T™I‹«ÁwzÓ_”SõÕ<ЀÅ÷,0ðDòàš¯™%f©IkÆ'I9ßÁ¸yýâUÈ·©(ŽßZƒøîÄȯæ•ç)N`¸uGŸ6#R¤h¾íñ¦žÉ¡6O—ÛòCé&ÂØ(6Æ®yƒUê¬¡Ž“»ÉÌf)ÞEvÅóX7r2Dï[¢X›2µñ°Wì[àsØ-|‡õ¿å>húgÊn)ìz'[ÿÒȉçßD„‚C¿Ów”†Ug¦-lJ„z°D¹tÖIjÈŸ¶Ä/_‡i…^ˆ…b…®(Y³‹¹°øl-×4 õO[ík³²Á½ýÒGÒ¤@Õúv¬Ëvr«&Ǧp^N»]°×¬>Le@ÕØ«(Lrf¨àϵšmþ3+[HìÑ“­îd¶\P®§\õC´´KÄ¡¸³½Á>ëÌÞz‘°œ}샺ð÷! ~Dú'ì(øÑì40—ÀøY+¯Aq` 1-ô¬‡6‡îÐT²ƒ: ZÎËZe1Šè†/Ù+¸"⤡¯*G’r’NÖÈÒ<^Ò"€!rJòH~ybäÿ¢3«³ZR—–’oꜴ<Dµy¬A š f¶³£hzß4ÊJå˜ò¶/fÏ8ÿПwì"pÜÑ µ]êû6¿0WýË@௉FõÇh¨ýDbJæeüoÍ9_îw¿C ®:y‡_†ŠC‚Se¥$K÷¾°‰ %Ï}cÆÅ/(ÛiÂYP¥Kºa&, €¿Ú¯ï>p·Ë5‚¶ßò¿¦Ñí×"Ãûn—Øs¾ßyHqüË7LÉŸÎJ(·°îÜIÑ)›ÀÏáÂL…›¹;c†ªR9“êÆžæ+5…uÆÒï­?3m.îé‹EQò#z€]º“¸­oÄÙοMd˜7ÕÕË"i‘‡/•ÏÚ/\Òp*fp¾éÀÄ{›²µ Dl¬Êߺûš¾Jž$* [¯à§ˆr´ó* H­• оŒÈÓ„[$•˜´+âÃL_…Z’ÁvTr}Ê Ö›ÖWu²¾M³ ZðZ܉;fÕ¤ m´Ã´81Ñd½å Ežä… ´e‘˺IRÂ.ä.„ChÈxæöÂדÙÒ}Íß!J$õY‘=ûº±†å¦Fb;JkW„cÄ"±bÛ| ëjù€Š;ÚØ[—ËÆ}¦kðHO†Éƒ÷<ðT÷s܃œ ó±JyI÷ ¦3SŸ—qæÊú§Ã¾ºÑfŸ»¯zzFÍ1$/ÖÙ:0?Zø;~4Û­qï^ "Ñjn>2­€·^7,TšuÛ¥U,üÈþYqcþ.Ρn×ÚI-¸±éæãf§ÃP ²`obf¼+A«7ßkòG€¤©Nñë4%ûP\Ç}r>þ- [èwâÏôýP™tU¾ ¿‰>±pÃøL‚ÓA¬-‹§‰tðX¾ÐF/vsCKFk–†Ì î& Ñ:~é2„yUVg¿™bƒì56òqo~Øn^íƒ÷À _Fðˆí3H·ÕAÉU¢Ç6gŠÙsx¦²¶C ñ¶~¬ë¢ºDÍ¡[>¬/wlÓ ü³àϵ±{mÖ‰˜"JR„s´Å’ ¸¢•©«Ì¹TÉɹB#VIP°”¤ìƒ9, •/ö7ç9÷m?‹˜GÛùò\÷5-I°†¡¡ÁÊ-¿¿qÛj›»xh‘qã¸V¬Ó €"ÙD0>ŽøSÊXFz;•ƦŸji£E•X½–Õ¤=´uØvp~AÇ„/O<·VªLÐD ƒÿ³ <°¦ÄÕÈ|‡Qq CÉ9b«ž­aÒ•ØsF?ð_f$1¯È£UÓ'þÝD*Ë+žÚT}7·(5'·ánÉÝ[ˆyžÿÜ¥LuôÒA[°Î”§ù~Ѧ2‘9g,I8+PN¿8á¹ã~‚ø<5Å!ôæh,½zXæ©Ò©‹¤o)Y:Ëy’9–¤’õ2ö‹Žwqí"§ Oãðm—rRt!Q1”BÚ$>D™5*Ó¦ad gòƒFÛê½|,1NFÀXëM@·¯¨ËhšZC¡{’ÏÂC1æO×Y m¥àÃÚ o\#WIªUdSÜÂC·Åý[ÆQžFM Q>dÛm`þPõËfS°ˆb6<ÒrYµn„0Q£¤¤ ãQg˜"joIãv-\0dËuz§µl€zåsõ`j¼Ï¤l[‹eŽõ+ðó¸ÔïJË ÷ áSS”މ:áw&úõŒÁvDò)ã÷»Æa’‡ØÂîµ/ ðÅn[ ’äMãy ö4 ·ñ3†ËŒCîÓµê›Q½Záp­fqùGæ l.7`…¦ŠÂ.›<¶Ídxƒ¯o0GøL:ò *Ɇ'r3fqå`UÕ);qGrݽµ±Mwܦ®iÛñ{ÖÝ$Ü=)3ö÷ÏXУ’Tœª‘Ë@5³ÚY.—L8^l+öÉìUŽô.é*—rûÑñÅIŠÛªß‰/r7JµB.Þggø<¡Æ›2ÝPw¥d„x@tøƒü^Þ$€hAe„/¿ôªû<º}Be—bo3)"µ÷p‹‹B*\Õ ±njé™éTŸ«ÏëË?3~ó…{ sá/>*eÊlÅ å«ìgÑÓ)LS®‘d°-igYg¦ì«²sð¾…‹2M_‚fÓ±ÏÕ;Šd/\#ëÞ9CŠÝ|U)פ\ü†ëÎÞ%µ#à3¯›+qO-jzØíŸ³T¡ÇšhA¤¦¤r™ZCº)!ŽéS@ªÙ…ðA[ eÅ|Ï\²!Ø£&šzÞ®Ó2“ªõéó¥ö6Þ¬—Ü]Ÿ»..j“š¥Gmš±’úÖED$~ˆ{—®šî"Eѹz&—Ó*’tIf Ô´Ýx_ID¯~@ ¯ý‰¶»6U=úÉ4Tˆè:è¦Z•DOê˿ƱCXcƒó¸!ü„“d˜ˆU_pWƱ¢ÔšˆœHø^".x-«ÜÔÑ©è&%Ž÷ZA¡™%꼚ÞÑÈug˜Uúl/nqLdT‹y,¢™6kè縞㡭ûK'ó-¢XºlCjÜpOaá–¼Ì t "6;¡"Ï{Äßä4Ï=µ¶À!yÖ‡÷7þ„û@`Y9‹X8‹»|[0¸ˆî$·Ö8yúˆ£!ÑMº)]̨C‡Zc0²³i› F€£ã\?²ÿtœÆŸÛ;‹†>Î/à^Œ (cž "&po`Ò:z/isJlŸ†PÒp¶³¥']cØ®^¨NØvsOºE´s,ã´æÌËV9%œ½"ߌò2 •:a=§1YŠäæS'òû-}»tÍsZƒbŠwÄa\6½âɪ@n??†i©cÞi"Þ÷ç2³ŽË-FâJ_ÍA“­Q Èý7CžåU&voΞ``N­!øPŒ+£ôýÿù‘]P¬„™^BÉÒ6Ÿ(‘û_é—MhÒ³Aóû¼þ ÃiôÇ2îðÉÜK%Írˆ;‡ò)ïòBôŽTnÊÝV~6"nŒ},G KÆÔbak¬ˆqªXqe;)àXÈhOÊÿ©‹g0r\£PíQmBIxÄöŒÎªÿLé-lSY´)aö Ô{âT3²1e„= ë¼ V85)®éÊ]«µuž€Çºj—7ѼdG<ËcNœ1Ç!ÎØòþh­å_ °Ëe¨Cš5l ük—¨›‹9¢ôß“o-W/ŸP¥Ïh)¹>ƒ4í÷¦îŠ´ÇzÐëŽÛMJÃŽ]=Ø´ÿûM‹Y1„Ç‹[ì×Êà½ÀÇí•ÄÜ’¾6³ y+žñÊòLdrcâ Uï:ÚÝ’÷\>)â]Ÿ'|€ä²v¸m>}(S§æÎK$çX¾näóŽÚj °úâ}§ñ .Íp8 wœ»9ߨը üÁa tïÆaœ“Lå/{î{¨0tñ•ùì¿lÝÝðIÈá‘R…mthŽÛæ4MJP >¨êD¬MÛž°;dƒlÌÇ{´juY¾ GÏ»€kYÌæ?E¯ý rNí&(³C¡þá%åz£Š±7@ƒ( _hðJ’“;¹–ô©çtkK…¤Ðöï+µ=ú·¥ã‰/ “šÀûq^4ìÐý™Jc\޾ãXŒ°Íë°`“àLz¼ÒU¾æ:n”¦˜˜sÇ\wÎÙýñ|&-üœŸpV*RN!Xò°ï7mf³Ðó?UTéà±úBdÌú¾ŽžÊ¸¸Œ«ú œO¸@>K 4¯Åñ³ßœö/Ë– ¹ŠjÍ[ªl Ý+üôPJMš;àùCÑb׸ `/4ñX~ âËUfîŸíp•#ìãAÏèpü¶y:©Ì:ÌîÅzq`LËx§ä6ê§i8\ ò©éR^‘ï7íê2"²©ÁD%Þ'Xžû9k—kgUY }[ 6œÆ~‡”×JUHêiÐ’y ê žÄ6Æ H_@ÛM•¥@ŸÛAÞ1˜þ~¶×ö}).§#ͨ"AS“„Of ç´LqœÿÔW%)XkÄñ&°‚Dü¹ý¥q–ny¾KòwAÍÉ(‰µhQìë'8Tëþ﩯æzð•ï{@³ÑG'(Lîÿ0é,Déš%LJ«è3{«“Ui ŽšAšbÍdݵƉÍô€ãòºÙ0XX¢®B}Ö€äü¹:k£Aœ ÖRô'ô³Žç"&Þyó½¦BïsÇãÏžj_bÈ‘ð`«68˜ý^uAE?ÝÕÙ•TÀû†=‡õ´=àû½Ëd– ÍYóÎSÕ‹@ŽG@jœÀ ¿ÅE’@ÊG¦a1¢?fæHD¶i cCÞ}÷k™”¸³¤|‘ªC¹õ .•Ÿ³~R›é_eñÅ¿.@ÈaêáÜvG‹án]íF[~¸IˆlIú¢z· #ÁZF«^Ζ m|AÅ[,0²¹&®ìšÒÖ Ñß«ÿýšôéé@TÌÞÈcK;|Æ[€“;}ôˆEOx?Ú}"ÎjíÄ™»‡ðe†n!Þ-"•óv‚æ]2 ëd'€M„—£Ášý>‹–ò»5VÇ;¹—J˜ÞV‹êJsf.n¬g궦A .0Íøpµ%®ê£cuÌ»÷"]ZýÔT²uä°rWlEpCfO¦W…ÉjF±?ƒ?RÿME5‘^ï†Ä1/ÏÑà­›‹‰[ª3…HáŸÈ`.T§ô|øØïµIøüü[jš,‹†RþÉ tåû€]¾‹Y÷¯’ õÊòž(z[¤¡>Íó\wÇo{Š'TÞ¾ˆž)l¬=(¬þpþÞ©JÄÝÜËÐfÊï/hYp´2Œ×îÊp²?mƒ5øéŸcÉ™^M-b#5(ɘ¾´¬K…÷ò"«Omß÷Í|Eb!éó†‚ô¬mv Ë¿¬ÆgMßáøi a ŒQB“uë®É.ûÀI*üQ½6qÏ#îešC¬ˆO‡rãW¼º¯Þ/Õ[íî×,¼FÂ1¢«†°—®’œã £æñg¼g@þõë¿÷—]×DcÂn+6Á¶¿F^ïàŠ±I°7¾J¶ åN™ÿMJüG]áÜÿ¦d[áÀǟ·;q¬ÐMcG* h.b‘q òÒ ›ù±"¯ÿ¾í:hv1å°!V.ó {*B±LlÏ#ßx{SRÃZ\IòüLóÕþ£M檼թ‹% ®À÷z­ïÿH”ùeîÀžI)€·ô…iiÅ«…B-æ2æÊ·iÿvúc7‰[Gï|qHŽ‚cJns…€‚7¡}‹  oLéøªk"Qn?»Œ3´¥G—k¸ÚÆÕô×Vv>bÉ ¥ *€?fIü¶oöx–xò2—ABOí“}Ôi°&¯ùœx}¦™p•d3«iÀ | Í Â±L[î«`د!•Ž,Åݶƿ%ø— £é®¹;)°’Žf¡éÎ'ýÙ·dÁVFw¾(µB娛ð–©4²çȦ·èbV´šÿŠ45Hg|µ2ß–ŸîÜ×¢\쳑 EÎ%]‡"ˆL´{n¥gÃÞ tÃýû»©–ã{vEî\†` ÂÌ“â#.ö#€œÆ"†TüÚÒrÌ>pΟþ ôjil¬&¸b f .1nH6hXÛ ¯½gψëaŸ ^} .'O¨1k½yü¯*´‘AòSZ¢³Ó=~á„–m.1½}x L ¹š‹gùk»ÓA°âá…üyÊ¡ä$ƒv¬8õåÉœ”`ù€Ÿ’{ßa»å¶H*;ËÇl1·µ“ü¨ŒG¦6³]œ³ŒÚQ0Úãè7ŽÅ¶¹Ö2ýc³ìkFÛÆ}VÃ$й¯¥¹ƒB®:Èúºv¸5S¾ gäJžš,oÛPW¤°àX2y?O{Ñs~¾°JˆÑï^J+crJŸíÝü"ÙëD” ea…Üü]î©Äªeɘ/SÏ_Z@ß åVP(ª3'Ú’aâùk1Š#B­rƒ¼³¶)fT*}þólÁÙä¥öû©›=Žº¬˜ZªokÞt~ÕBØ{­>›8Ê@ÃÊܧû)Àº§t7Aztñ¢0ê­]€ÜÙZk¦KjP!pAÝk¹¤˜ŸÑkD|ˆw6¹|}êeŽÚwHµøµ<Œ8µ¬S`ò:¸ Ù?LàtNO÷OÒêb9\\Æ ¸G¬Áù=Ìã}³°¤ñsÁ¹©H>v,:cÐs”l csÅ ÆÓJ”•ËŸÎÔJ… %uz\ìO¯ÜˆÛÂI!0gÐ\Çñg^© À Æ‹×Ä.ŸßFá3pÞ,EÙ¸º7Ë«^>ʾ\§:Ùêlº¸'{(õ&ª9¾ÃÆÑÑ=ßóx­®š¶S.è]ü×¾4eY…#×R®ã"Až±àš‡.ä\ÝlphKI¸˜è{›Ý³ûâÓÂw}ÛYÔ k»ÉUÑA35"¨hýEê=âé÷±â´keQ8õ±¸Å{$4Ã$h)Z¿@}5,ÎÜQÂ(×kmΖ„Ì6㛃^Ôäßœv»JÆáª †×7õûlWòNBJ…¾¹Ž&î!˜°Ùÿù©=¯-²R£‡N£ÿ˹B‹/T¯¨=ðs¿¾K>sWîyÃÏñÝý¢‰½¸Ý•ޝ(<d3ƒ14Ó†K¬[‰Åù@€´ã°´àŽìµ…prþg¢^2²ËGQB‘QÇ=%…ðB_GÕ¹/^,ßo³Ú7§ *%Áö³±}K+#^>«2ÜÕö ——^¿!›Úf6$§Á3œÖ½2Ó§'¹æÑ}qb1•ñ5d$q4K XwkÝX@»opI£Hz4†58ìeÃë=Ïg!<Æn·mÕ”äÛ» ˆt? -ùý†Cjö1V£#2@^ÚŽ*jå£S½áürWß¾Êoã“-R¨ T'˜ê(T1^äz€ú§WtIĈ`§›Tx[HT™&(Ù­»Û}ƒ†<ûÔÍŒ|³þbçlâ—]k‚¢þH[(;A!JZ†èl°¶ÀxÀ¶ÂE?f¬ å¥,4 ÉòìôROB„SÔ´GáÓ·ÌCñ¥…Z}Ïq%KK冋êùÈ×)µ¸IÂùåÒÖ»ÉFƒ^µ2yìXRëý Â^“0±°Åë.xÎP—¶c<Ul}¿žûš¬¦ÈOÿ&ã_œ•yÀÄãíàÉã H“š†VªµeµúOÝ}üa9¾zªÀ«ÔL;¬0yé˜f–”—ØìÓ¥uEX‘QzB§_²™)OS¥P°í6âð+ Ö›-ÿ“êF‚”Û\'‡ÅW¸B²+“ãGi­ž4*¦ÃµH¸Ò$HSgñn`”þó\#¶í'$žÈ¬K´zq§ ㋇Ûká»—ºHºzDëNm µÆ"·–«žq›X‘¡K«~xGéR$hˆ2˜½(ÍHKžó¬-peŒ §}­´Ý,×ÑFxp0EÆÁ溦ÿéÖöü]5+å$L0NÃÌ|j5¨Júû4;U1â—‰8ý}ò+G`óãqŒ—«_Èc¿‰sû‡%[j Úh™•*¹ôšlÎVq«QrRi¨ZXöYÎtQË|-Ý’®ØPï²fùŒÍ/¾EãáÀù±åÏç5*µSí›½Ü ìY<ú+À-‚–ÛHÒ¢û-< ¨† aÚ‹|UŠ(ˆ*Μ9®žðk p·Ëñö鈆£…¯’ò­sÌŸ Lï ml½Âs«ÆÅ‹ùéVvm.ú„ì](9k”Í>Üþãt~zTöxN–,;§»Sp³çç7x ¾hS ¥‚ÆO—Ð/Tæÿ]žÊ'\r«c~´–÷þŒÛ=›d;×cn”>þ‹YNúÍXw-¦d¾õt,PuÎ5¤<í„~qB~‰%sÑÛ@Ÿ«½“T²1b0^öi¢qÚ™5J#ŒÓêf×`ÚUÝ1*ÝË º˜ái•S<ì ŠóaYšF²”©ÅtëMqgÊ!4iØIwZXº˜®[ÆŒ+þ^­L­D˜ä‚±‚ݹeyºzˆÑ;]€Ú˜ˆž±!EÀÊjâGë†û‹Hwùò–Å¥€CÓ3ãId.6ÂVÛ†d* =ÅÚ.$>ÂVœ¢b´v80Ñ9âF>O£ì¥>|Š*¤ß™¾’»Ê ÝŒ2 #Úî,«QûÙÕŒ4Øã•¹Îd#ÊÇG˜G[¬+Pív,Œ-ë¯-ã 0 ¾KËL†G¯S>ÞÓßEƒèd/?k ùààýPÕ„œ ÂÓ$‚ð´•ÅÓþ¾©yx°.í°­ô ¨Ô·_ïãÊ;‡:䆙ר ÝVE"¡Ÿ\8 \fMÿôL5Ýi·™3r!ñr±ô0ˆíñ¿k_í,‹–3ÇKá~¸q ب´léºm:¡‘šöÙ¼“ÐäÏÆ{q,$2‡71nÿRÊUCêaóWàNë0ýûAãÎä#RŒ1ê¦ËräH/ϳ.¤Ž6…ûøNxUŸ˜†ÜnÞQ@Ô⽕(ÖT󫜦´ªÒÀ;ßÒ'ºÂ`—Û̊𦢠ÔG~6@ŸdøT62Âó~˜­ÁÑwÌ›èÿâkmÂ/Å!9uõÄ›DêÙ3r›oP’nñOXñ’÷Ÿ_ˆ½Çoð¾3DÃ${pFip;*dAê²ãx¢én@#Ne Ÿþ•H§®ˆ,/a/såøÏB¿Á½-Ås ñà°- BÎ÷+"Û³G%îZ/ŸcŠwby±T(™dèãddžkOíÞTÒÙ¸T„ú2®á<Æïèwº‡î¼nä^/¾Þþ‡žZ¢êKíLj)ëJ£´~pßçãªTò/-¢íÑ#bŸÑ·¿IÈ\A~q”N§0y¥e6¾) —Œâ9>e‰}œÅiˆãÖ !Oõ`½¯–®b´ìÿëã,]£½÷Y³\ñ‡ZÏŨæ 3<ø3À~5U³ì/dY7w2Öõ0»ûÓa³œ¶,ùš/l_g³Õ¹t?Aíw Ž71íÒU#[iµKžry´ú¢XãiðS’-K0½=fûß7PóÐä;[äª V,µ† NÒ)¿u àÀ f~xÉU&E•µÜ §D·[õ…‚›»…x¿›‰¯?ßy©+X[pp#¿3NOЇ"C¤¶9-µ"~NÇw žñ$RV&²qÔmlj™sïæþÞ«'à—Æ¥ (žµ@eÜ£ »æä:Òovj ïôe5$ie°+~±þõçý4¯¢QDPÌŠ›ÖqAf¡[FÀ£‡‰Ž&|Ã$Þ´\þH^yûó2üBÉÜ`¤•|^³Ý]ѡIJ-!\êOì(ÎÖm0‹æ¯zªÁòÈ‘, aˆ£4äÉ3â½Ϻ´.Bñ¦òªÍÚ»½CÉ3ÿ¢ò¼/ýU¯¦@e„îòÔJ Íß§aUuŸaSÄGæ'öS×Ý|ߨF°þBÕÛ: ÑX3pi;‘a :ψö_v7 Ói¦!Dü./eõ1åñ¾(D”> \úý„®Ÿ‹2~\Q9+Ôˆ—½rÒ—ZRoNÚ(k¥>wÔ®Îç¿Â` :aN è"鯈÷eLÈÅ B›V†¶Í’'/”¡¢!ˆÏ ÕJ›–mbT ÅhI#æ–r‘¥ˆð´BMŽÉö¬2½åmA˜‹äé+M®åôbsù')0Ýq$3¡âèËÂNË6?º¦ú¡ÿîéüìžÍ^­¿iIŽÄdÌ;© ä€8ªWÞ›4;k3ëÆÔãðQ©í%`|A“ÔVýq½ªëPuQ9"×ïm^}oÖá¯éÖÒïc2 ]@^Æ€o`Á,3Âu÷z_å-² KÑØyùÜËj B?¾á'óL£]íú:9x£Öï×¼H4ÔòuC–ygK¾‡ SRP™×®ÂÜß #W䦄܄é/ZDÕʲot2‡!õ5œó#Š „Š•ÝáçQaÐG¨zI±N˜_ž“,æ+oè }luc(zÉŠ“Ã+3ÛEÐ[ÓÜ´68×]ÂÛŒ š]ˆ=„zJ®Ã™G‹]ÖÄÐ"V×|ŽI=‚ìÞ¿&u×´ÆWiBËrË1¿ÙÒøíiã1è‰Ü›Ê(CZFûv¡+Žzs®Äàw}ÉîGU4íâsKßÂÑG K£­~ ¡¹¼>yF‹7°µ6ùeÊðEAUs8åLûõwà-+®®v.dõ„~ŽíVÁ?k> hÁœó>KÎÉy#nI‚°êÕ“ic^Ñx„s¶Y›2yÄÿu#QÆÚäCˆ}ƒÕ(®Á2nÝœE‚æÏ²pîîÔ: c“Î.Bwë0púr}F}ü±Õ˜Ü¬¿FÉøÎD½ŸíËÕ{ñØ¿rØE\1®SåÚ‡’¨^ÒᇠBŸtƘMR79·ÁÝ7îb“c0ƒMÐ`A¶›‡ _? FYAItŽûË7×y)!¾ Ì{•7–ÙeÚx$ ¸ËZ˪M›ÙïTêGl[عoþÏ¡©Îû’Lå_EC.¹´[­YIf'OÌuÄ9sÉ0 ’‹Ÿ[Uá’ºåP…´`ç›òÅNk|D¬p ®GåýJ°Õ ·ñæþ÷æ±ÑÌã£ÿîCuF?ð¯íMDkQ<­Ú}nÈ·+Ò¼ƒŠêLúqÁPM{6r«ƒ"Vì¶!DÈ„”šó~Ö†ÝÚ„•«ÈõøþˆÂZ´/ÀÀö‰Üì ÄxE^׷ǘ|Þ!øRî!q<îØrnNCrÁ¶BéŸÄȃ¿´þ“?%·«*HÑã ð¢³òŸ}Prd¾”ôÞBBXžs!-Ó‚È'iÅÊÚ+ɼÎSãSÔÄ{×Ö½þ¾–o::Û­8¹‚°o)ðýG4b÷Ή6!CױŀæÇ(ý 5(£R )ç„‹¼Â†w¥f*í ÁzîÝ­r}gÅCÜ„¸t‚ZYçXŽÅ“Œop¬ i ŠìLÇžö“þP< NŸ‹¶±%§ÓØÁŒXo Ôì“v(Þ^E—ûU#§=Ödv«Vìî&<ÅÁiC#–N€Ç$Èî4nµÚ”5)^Þ<¹~qÏÖÚÃnK÷ ÝsKÌîF-c¸ú ç–‡“bV_I´¸*¨=—’\XMfHò`ÈéÂízÙýÝ¿:÷Q‘¶:4Ï<§ûï17÷:Ü×ÜÈD•u|?,¥Øyï´)ïn¢5 ¸|MÏ•p†€g'““®„§ï,Iþʸ…¢z‚øÜùLóígCø'Ö¶ îaŒ¼^FMc5›¢Wr„G »Á<·ýå‹}me>èB6¨dl…q›l¼òè•mhôçéaa\ð%ÿ „ã;¿PW·£ ö€C÷]‘äUÀùTpùâå¿QL€™xËMé–$ š««úhC³Ðæ±ÔxDU(A ­‹öù4ðdõ|hEš¤"52> d#Ä7+R;À}tYÔµp±Â8q­ 0if~£6Â×I÷7m–俥ÒR«f2ýh-¤SOKk̪JšŒ9SÝ Ó²q4ûNëæµg*`¢öâj Í.¯ž®íR­søü:l†6ERž7z·Pá÷ã!‰,¤=óïCe1_n´†˜°4Þ·‘· ý䌇@ iɸžÙ/¼j1?H–"Šû¥º ël)ÿ*&ë)0\—ª•ÂøóK>ã¾dÁõÄ/Ác¼ÿ\“qCHUv^æ!ã¤3JöС ”b8p€yÍfE¯ÊÚ‡& ³ðiu·ºŠþiù±2ww Ù[aWÌK 1_Dð„ý»—K„‹#ŠBõÕãíÃO1}QÃüáIÀµû ØC&Cô5¯æî•Ó‰ùݰ¥»Ž%"cFoù Îtê1ù¯:ïò6 ¬<²­`¹ùûÚJ¾O)ñâç]ç¶-”KTc6צ¡sè˜9±±|ïáufryk”¡›Ç…hïÀ›ÓšFû?J„pMÉgÇÅñáü>•‰™„¸Ø5ð%$šu€Ä™ƒNŸ"5rx’Çñ{ò~Zf‡á>² ùª‹ÇÅõËì{F~hB1=ÖKÍ—„(æÙÕ^¢:$e-͉² «~~¸ vKÇÙÑ ëh™y©¥ë\>-*qÓ3™èš¢ cÛîX6WUé(ïŒ8‘$É^}‚}0h1ôјÝQ>”ÿSßËŽ;öîJΙ¬wü)ÏsP—)e–ðJ¼ÄÛß¹Ò¿.Âk?ÞIZnv7£õÏÂXÀ¯ÇÜI׈$¿Ÿ¨Š3^µhXJúnlË"ÃÈd””ÑâÏ:)× æ·Ís§•âߣ¿ÁÉ@¥\wÏG¾»[û ³ ôÖrµ0Ä7îÛh‹pé.À ãõ“€b8‡V-‰+¾ôòyL¾Œ¥„`°ø.­®ße"šL·¼,Q9¹²Xåý+Þìå›l¨§TîÁf ¶‚Ó°sD)þÞ‚Xº€æaSüBû¶AvclØ8î¿PÿîÃ×s$®¥ýãå³fˇUþ½Iܶcùl†UŠ’R À=~`I­ì×ñÆžËì³ÝÂqVz²kÍᜫfy,a®Ù¦)‡05ˆé\´Èb)ù¯¹Ü4ΈïäµB¾Ž¸R*OL-—ò?ì´êx*šËßÚï’©k$?‚!$¦M‹l²|èéæÝErõˆú§;Ç‹ùMñæ÷þŽ›ÿ?Ò¯:Bw ž7ªëò·³‘®{dÚ—I‰{ê¢BzQ‡ç –LB, Õà¥*âÂ×]>c!Ç^íc7TþÞWÎ*¨ºô£!º³»$1û±ƒîÆÚR»Bκs_1I¿´$ûn‡”½aTAï1±nþf\A«-³ô÷-„ô1ÂßôE &™µÓq¶DÈ®/Ά”[=2¡íFÍ—þcÜê6àÄWä—ˆÍ ¯ÿÑ™g?ö ž>,‡Uí¸xgdàA=žÌ ûLèzo ÿ€”ØÂÿ‹Gé`ÊK¼5ë5G*u Óð1tªVŠ&Ù.+˜àbšœô-]ù®(kµ®¥’2qùyç¼â:½KWæ“ }ëKÎC8ñº@ý<ýÎ¥ý}æ^“½Fä/|VÅÒÓM[¿yšk—Zz{êo—æ•'fçÙɃã9ÑSßVmÜ‘3z'·Æœ–ýP˜ïNŽºx+ÈÍ>‚º9y‚=†!PÝô¥Ž&ß+ѶԾÔ™«]‚Š¡ ‘c¡ µŒŒ½6‚Ò!)¤õc%Ð5ð¾ëá4®{â´PS&Gím¼¡?Eñà+£=×+¢,«æôØäÔEÖÃ=+k×ärb=#N—@gŠ‘ ã1:þ8Ñ=xn‰§•Òd¸C|&H5éj&ðc:¿ý^kòú{… ÑjÐÊé÷l$Ö$+©+Ö·ÊœÔ6=UÒ.dÝ‘ªïœï^šPâ,~èÛ“:ïåSõ¬AšÍnd>P-ZDÔW€# t{ÞŽ«Ï™­È$Æ z3bj&q\å˜õ±¶^¨tÚM³‚ØÓe ,Ó¥ñvù®€8ÅÐåè½Ø­Kù{]Í}Ê‚$³¾ SÔâdAÏlX@ÅÁÉÅ`hdÈ´ pá„„¬Î_Ö¬ÌË%ÅDQ¶¬N{>';Æyì“ÚÁíM6¶ñ µ;Öïùôcï>ö¬¢6 ,}åe$`p"Û #>ž¤ª:ˆ .aêN±ÇPíª÷¤»ìü®­5ÁÉ{Ò$b¨Þ™c¯$Bmh'ô›ÝĈ‘Ždƒ˜“Zñ> ²ö¬›áÝí´»-=Ó²y–»ÚÑÉÊ”£N È}DÛÒ:5?-OÝ:½®Òߦ„„mº0·)&-]N÷ë4G>ŠW„ç-op¦aâÅÒtÅ ÷c:£&œþ‡Ç«’=ì™cF rÂo¶.çe¦.!Hõ×ót“©Þ8öq†7µüßZÒ•'9/AOW×½Vc}˶Î_п½žÞîÁ+<È>º±R¹pddíOÿH·}G•õ‘šœÄ«Ž€oùò¢+‹ $U,(ö¥!õ9gL›Ú³¼û`0kÆÏ–Øk§æqÍI[æþ2}¦÷ƒ‚ô»A ƒ­l˜»™a(YObÕ-0h„¤ ­âMSB›òg·lI–|„9Tº=~ˆéSOæÃkªQÒ¹fŸ46ÏuêÒÖv|³iSèÓž6£zåÁ#'4o@wâ€Fæ4˜j8‡ä’|!§V|©AŸ×ͪd> ãÑ5ôm lrL³tRðŠ÷6yà9Žè¢r5äø@FJnjÜÕW4q¾ïI-ÔY²duÝJÝð3Õõ¦`÷¹l×®½/MÆßµM/i¥Ëè½ávÕù­³uÝøF9}b#:Vj¿2G›*€Gp/b;ùи‚ìÙG@$+Åf¶!²R>¨¡ÉA#=ø±…“¼C¯æQ_Ü=ìi5HíE±,¹ßp”’oß¶’‚¡±·eN¶R¹Wëú…½¤ž=qЩ/#ͬë¿¡ER€Ñ5ÞN§aÚº.¥e€+ÔFµaÀ!>£h)¾ùÆ™ÁÈ(Œwx<”í‚X@ÅÓŒÝk-¼í £St¨˜”%5´rRa%éZ¾±˜/3V–x¡q´zöìü÷ù¯9°×˜:S6Qx¦ä»ä«K¡œVhú¨üvÖ_=ݹ®X!š‰ú0ÆŠ©³aøÊœ•µî!•5®þU%NçKNÉÀ½¤Išy†p9Ûl·AmÔ9¹¤ªîéõà_¸2]ú ‹Þ(ï þÒ»m›QÊt- gaÒ"dS7H$ws]ÕÒšÛ;{ýðôQ"‹‚Å›Îc˜Þ C7f!/¦î0@uì'™¹lÙæþâ;Ä|‰®üååÈ$mt½ËyÇ0ÿ=†'éOùIù¯pÖi»YF†ÚX,W8ÁÀ$0cÐࡹ7´ë‡pnöf=ܧ²QDðu»‰æÖÔk9L3«)ûÞ:$Rq x×ng”y˜bèž\ǺŸÿõÜM6/#_ËoךÀØc¿ô昑Ã&WÏH-¸¿Û:pœ<¤ rå>3I3Ylš9à”÷‰gŸ2:CSB~ƹCÿ5©¹QŽ=ô\ú^/D¥¾[gb H¾w~1ôáy†þЍ¢+ª<’Ò|ç¶œ Œ»Ö|ëó¤Å‘7úÙÿ '*kÛö‚¿bb†PPÆöŠ:vç>™·:^g™¼Ò]“ÜFÜÇ…Û ´:€¿B¹`y¯]a|Fâã›ÂZ·„`%I¨ÃZY¢B’Á¦:vGbd>OÈfW ìí¯ÚjK¯{°ê ÖÄߎ"¢ÑYN¤«½µaQµé‰fTà¸Û®ðÄCœW'³BK¯H’‡p/8U!Ùí@žö ˆMÓ±C`ræe7¼DÞêËÇÝ$È Œ£hKŸð½‘ÓÆ¤€¿ŒÞÑ&±â7!ÏgqÙbêôz• O~U¤ÕØ êBˆ¢:5üR(†Šu_SÎÔY^ì×å\v“äƒC¨‚”ο§+ì–KùQ¼[ê{NÿKÀ½Æüz–GT&B™0Ÿòe æ'É<&Rs`þ°U}³ aóµžÏr„)ÞEÞ×5è†Ñnð+}ª"+Cì3Œ2—ZHÐ=àG‰°ZM:xê‹gr)ŽïTàÂ\)¤Ë„ é¿HTüÄG1ÙÇgëõ«ÉfGÝ!ÎLGlùá’Q‚ óïrÊÓ½—Çä-ç[Oü0 Õb–C4Þ%¢ç¼wé+¯™‚­¨yqSWÌÓY@¶ô5Ok†+õ {ª;ÑÓ.ø1„ñ0ˆ¤ïGYwé’A>²j˜­ÿœÍ0+œDÛdzVþ|šŒÜ †2¨‹£-Æô´ŽP‰“V¦~\?fŠçÈ  ëa…”‹A4sóÍ­ í†xóšÄ̰ÈÅ].àl$] º—.ŸT'òÁõüÂ\g/#@3ð³&/ÐÇaÉ YÐ¥ IÂî”Õ䇠·e™­ŸŽÚ’EpyuÃìÕk„Œè(èØãRêèÓã†6â cÁÌŠ©FKu]|”dU”ñ^@Õ£÷Ê”ï‘%‹Ä\N¸ß…ë|ˆœòµNõ24»*Ÿƒ/?öq¹Ž\á[£!K}Ô}ßw½0Š2ßs›ÿßk÷ L;ÃÖÿ°LžNv7+GÚÁZ¸Ÿ€´>Ún¯ð,E)[Âß¾¶z~Œ³Y mp‹(ÑÕ)$n0×­gpáºTPiîg嘸°à6«Ávœšc¤¹3ºkBLf{áZ}6äN`¼1¾]ì0ÓùÌ|Òj_¦J«ë"§aù¼¢¼™ËüÝ}ëzÛ”¹×þì50µ½ ÃÆí‡«Ó‡=œê–Äó4”¾™§2±CJpÌ>£‘ò¯`µ'I¶KZ­£$[b7>Fšp¢aÓ¬nÞÞ¨›C%acèBùã1îqw º5s¾$¥Fïœ^é…Ìν&†‚*#û õÙXxˆÔ>¯‹¿Þ ¶E!¥Š¥“﬚¯Vnº:ŸA›^N«(\æÒ˜+SGQªÈ²È%²öKš¬/“·úŽvY(Ö¯ .5x³°p‘úu1DÖœ62ÍÝ…€"óâ-¦š_Æ%OÆIó–ºÿ!d¹ˆ.äß•ODà_#4•ø¨ðJc„„„tÙøóþ Nê·iX6Û>Lð©BÑjð—ZrìnY‚ûn(Øý¦­ÎŸè&rŠ·ž•‚µG£æ²mØŒFëÑÚ‡z`дµ–—ç ßh’êR¡{ASä&\¢Èê‡NªI»ÐBÒÎFüŠnˆbÒšA.u þ§ÿVë×øEŸGˆ‰ødÿõÉ4j©DíF¢A¨)ö‰ö˜‚Mu_¯Ïw¨Îîó¶Ë«Ø€´Q©¿I¹©Í¹3ü®®«ËH^Áyú\µÏ`tlz)~]y´ËÁ;–ÀL±ÿM¿Ó¶“iÖâb_Å”2G!¨x¯Œü„Ä;#c¤ÏÆO õPó#lÎŽq:øëNͬgÛ]!Ê|™¼ 9ãÅJd²}Ò çXÌgî.#Q·u-XôdÃ~´S. ê¾1¸–½z•»á ?ª£XN ¼¤—ûød†Ï¶”{l¼#Ç’d¬QãJØ¡ºÎ;S &ˆåG¼æ\W¹Ì“ðò+´!´UÕÑTUìq€øVÄ”HgZ1dš]vîKú{NfÇñ½„º†G‹†:PÕe׎ôñ˜ý·I' ¾úàeßóÒq±¥µò…D#࣪@šg„\;›àåã ¼uÅ·—*s&V%ªçñ¥{!ñíÙþ#Ô k¤Ç€Î,!ŒeA"دßäý†ù‘’ ±£G†!t<þÁ7ÄŽÇM tq;_ý«&œë·nÔ‹mJ5êdÞ-@¡1þFì+v°¦'¼¤mÓ% äHAäI"ùS€ßL0 Ú™ÊDËÚeýF¡=°8‡\„T¿Þëÿ€ãTLVçl3XâCÆãò‰Ä) E•öO«O—Tò+Sn©K–ŽD>ß,‘‹UÝaDIF’® XÓfúÿ<¦gò,¼6Ý®D5ELC…zË®º|ˆ-ïJ5>uÍZ9™Eù™Ìâ±1¼ÅSöG¸©~»ãUr@Y¨QоžÅ:³ ÷‚Qµw$§édÐh×j~Y1v>ÆQª¤‹Bvl÷a¡†÷4ФÄ0©™´;zŒhr9ÀÕüæôeVª¯’6Y¢šFÖ¢_êGˆò‰ô\;‡Á•e‹0ÉZ'ªbu½HÐÖ^a5Ç3­‘ûÒï¨\m»¿ªË@Òõ+ô¶Ðô~Û(fyï°kLfã0žu¥XƆ 'S›eœf€s Rf{ˈtB¢ûwesÓs\»È:ÊǶk¿·\/ÍÍs ¥äŸ( c±Íh„bEKVMõs6ͧ„@ ‡…çÿ3–Õ&ÈqŸC 48“’ÀÎ :Cè2d§ÍË­¥êc”ÀVh³½ÆI,çõ%‡”râ“D‚O˜ë¨™ø‹ˆ·Ø9nÛ¡¯Òøe¾Z LïZãð¥¶ñu++3† ù1Óa³S.S<¹!-ˆ™qŒú¶"D{ά¤„Uõ ¡Ä%¬Ë!NK—NeÈWEM&{ŠÀyqžå`Í%[¾¬—p'#pv3õ5S­½]΃i_aJ÷êyz:¥üë!íºŸn“õ=°8æ—tœaQÇ,.³0bc¥léòMÔãÇÊl…V®¿ ¢üòQƒæ”5÷: ÷æ(ÌC¨ËCqY=w:°Ð¨yæƒé™r'¸È½[¢9^Š/GrI´xnÛ]£ô'd* ‚Ýìõ@Ô`f>M(£>PO‰jèßeÕ3Ðïù2¼aR’ƒ|*ñó³„ÊÈu?ÕÏ2Vô¹ùŒ9­c‡”ÔîøXMÍRG¡Á“öð{ƒÆâ›§Ú[èò ª5NÁbcüÅŸ'-•Žo™ZeÕxÑÊÝádX5&|c \ß(Ün`d£À  WÂiB]›ÿ¤åÂtФP)Â7í\‹öf}9×?¸u²\´‰cæ …€íxK¾äeEÙÍm û%s â;wõ˜#­r<ÚHÕÇçxnÅŽÑóžÏ(ˆ5w…U0 ÂÀ¨·ÅP I©ƒ+Ñ3Ù/†3w9°aæ¿¢«J˜ê¨ôŽ5yE¯ ¡Õ¼Ùˆ#uò¡´ÕT¹Vˆ ¨ søš¥ÓbÑw¸ŒæëjxWû³ø鈇Û`,mFðlï]XʽUCл%øÁbÆKeaZ™r9h´¡Í@–æò/m¹{Púq7z ïlaG+AÕOÅîV‹úVM‰k$±ŽVbâ>?Ãúû¸ƒè­ÃÍàËŸ½Î)ùf6 ¤2Üžla¥Ü É½$\¨{Å1‘xJRZ6'-çvÚŸ{“N¸$ðµ»>U2f3퓦þÞ˜æ}xu);ôåÌ7m¿‰›­Ö’i¼¨Ú°<ŽqHúƒô£ûKµ7õÃǼ[™&»} ‚(ÂÂ@„¢e¸&W4ŒEÅÁe{œ/† {±“„»kÛS•ªò%uÚÏ( ·)¶½ç80̹ŒÝjµˆ{ÒP¥Gëß=… aC HÌÄ{OŸÞÓ21ßa~^.´)Ý\Y  z$&kÄ5JZ€½pÃÜ leÍ,ˆ’¼,Š#Ý®jTŒÛ‰Y•Øì¿ô5^—ª—õœËƒ{¥Ü»ë²±3…ÝÙD¯àþ%rüíÜëV.¿•Ä¥¼»þ0TPÜÃҚ씞 q ãá蘯\[FlX=¸ ã³è¯»º"n·q†´•ŠK’ûÜR{ !Gáì VµÓŸTz‘6л¥2t8ßq9Iû’³Y­w—ŸÓþRZXÏ‘î{šTœCÒÅ7ÞR¿À Æïƒ ;„² Xþs6‹šÿ2îööV|*G»° éòädƒ$«vbC+ CtLóð¢e3* ¶ Šç*ÿ?wQ—H•ÄÑ Ó šÂlÝbª½þ¶ò`Á„ΙcEdG…Eî"6v/¯ç¹'Ȥ/ AœçQ¸zñáö—{’V'èÈÓÙ%±aHÙpˆÚqË•&1½—G¨•8øAjrbº}CDù¨Œ |OÝ´ÿ21E#)²o™Ö·ØÅSö;&Ô²E«½Ä£ uÅ?#=™ùüÚbÍ?q53ÇGN‹Oƒy_SG¼MI>1½EŽf›¹0„¯cÌ=Ô—9º!ý/{þA _ÇAÎ-èZ$Š\'²¶“ï´Þp*NA9É,KFW­ÊóHAª³óöƒõkÇ5tÙ˜î§>˜ÍÕ'r¥O7¥¼œò^MýãRaSçÓ?׆ [¾ÞîÍePYÈêûÚ¬v2Sì\²ž+ìžÜ.úáužù¥X‹þ€LMž¡ ™rûY»ÉíÚÂŽŽÌ tº­¨K~‚rë¸ô†‰~wÒ·/~ÊÙ ÷7¬ÏëÑîZ®u-z8S§s‘ð8 ³Û˜4æðÒì/Ð{«{A;-åYyj•Íæb™Éî› Òà _¢”t,VnzÏûÔxþ&ì³ø ŸXFþ.V¯¾ŸÀØéB”m…"¢¾7l AÝ‹}ת™dÍh‡Áª‹Ãý@ˆ ÔKlcL¼…¼¢¥p0i¾Düno8;iËy•gHþE«|5JŸwúo¦êLÒ£øy&OZ—ß8r< û¼Ý¯7M߀„ú`n)ZPššjÚ‚`lí‘É[;FUŸÜ%ß{‰¾D.ŽÙ5¥bq‰‹11œÑ{NEþ¹˜ûçi·ß›ÞÓu¬úÑWg?ã`œ«ÝêBʇ޸H h°|hu#Veù&¡~ÏUüdÄåMXSCÝDòO©ùà˜LÂ= Ó¨à-Q’Ž9¡ïì¥ÞžŽi$ó !”•g[fPfðâ/Û Â¥HÿÑT¹‹Üën˜¤0Ç‚ùÅ™qçð_» Û}–·wCíäã/¹˜ì ßo${F°GHT[n®Y:õŠ“öÈï÷…Gjè[Ûׂté[tOgVçU«Ôí1×b1¡y )Ãiý¸,_[,×Uj#mI9̧½-5[…8Ç.DWè†õP¤—ÒŽ6 «d ¹G@Ïœ.Ñ’þ>¼±ë¹µäœ¨bìËÏA( †êj ‡„Ç‘«¥cyb¡¿ó~…ýŽ1 ÜA„sK0ÈâkëtW.?zFÆà?‚«”©5½ÎãÞI?Ro†c^–vv‚®Z /ÿæˆi«½ƒÅßdå©JªzÒ'ëšUÊÐ.8'$†{±·’ ï!t£ïPkx³Ýo”"Î5a—âHB-öÁ@Pÿ‘ª1~Nd{°ÆÇ·?Re2Vxý_™E®}_1fB,pñÒ!¼:lwfìD£Š"òiå<°®ÅÍ{E–^B,>ö’09ñej3÷Í-|*âd,Š iù•«tx U#~ƒUNÍÁCĘ» ßÖ²/¢­SŒ%/í54ëG¹1¦ƒ<«gødER†çY]ú±©JÎGã_­qÝ*T²}iˆÖ <¾, ¹ˆüÔ5ˆT´ðêê;‘–¦ÿA´]»ò{ž³\˜õ(_@£Îä ŒàÒ<ó¦-þšhMg2.E á¢‹ÿoøº¹×n€µ„°‹<+È

€›]«q+äŇUWKuÍÐútŒófµõ-'|ôv¹­Ù—˜«€Ù¡o<íìY¦-Ü?aæá×t¡0©„Ë]4z¦JµôhI¸Ë'}±ZiéãvmyÔäÄÞ‡³zéìV²Zç˜(˜NµFSâRÕ§`i9¼Bç¤ ˜ýÔÁý‰ž”À³à~ñß…r‚~)?ËÞ=I˜¸Àõd?³W#2Ö.³´ ñ#í?^mÂDïÃÃé˩̽¿ýؽµ¥SýjwÄ€(‰¡×Ý|¬T˜ðö>¶¨TdÇT=þ¾N¨iÊ7ìª1Oè–9ÂÅ® I6û@Àzã\Ô£)FƯÌÝ™gÚx7€SúÐÜEÜ)®ÓÖ—»]D¶ éóœ`uN€Aá©`A‚»›D‚Œ2ªTÿÕ,®ê“A“AaÚy‡¦Ã‚5† úˆL£Çv3ˆNÚ0Ê ¬ÍàîÅ«ÎÜT÷í)f¬b(Ÿ-½úk¼£§A¬ÙžÏ"ö/³KôÒ»`]`EVÙ!JKH lB©¥´Wú]Vš.(Lþ@Qƒ 9¶VùW-½úºjwÑb!`“¤O :µ°a×]W胖ñPÆšÀtè²¾, ŽZ Œ…¸[÷eFDwÉtoíŸÃ›s>Sòu”DO÷á°¸ :Ðà¯í:áq+F7Y™Ž,1ù8ílôÆÛPBg­f•2ôà‰\/øà¸ËfÀÀp¥Ú­™ˆ€+¬Ü„Kú±Å<”ç 2ípø8©Ë *jxUžQ…ýó6™áæÎ\%+¥\‘É%«kW”¾‰Äÿog$Ñ&V¤•|ËØ:ëŒQÈ­]^t>Ó#¢ï¥Ä×Í…aàb1)‹²)nX²úë4˵øâ¨Žlß ‘º°ë±ÔÙ¬îÆ6©×Lëú7„LíÂvº¦ÚÆ"/kàÓùS~™íç´YiI¦a„ŒSå3dœaBv6Àÿ0¶·ý¡|ÖàÙŒàÔáÍw_1i b:W6ÃÀü|åch¯Û6V4ƒíÿË`Në…[FÓÔDÞéÕÈp¿å²!÷‚¬ætK9ë(q¥ás=Ár2°ÏKžÊŽuw-Ãý¶í3Fúr‰£³ÇCÈÚ8¹/3¨»íÈæÁ“½ïø¾Ðã•‚Vfú–¯ÖV]äïú±MŒNö‚¬Ÿ±ôvþë£h&d8ƒ„Y)š„mµâÔÌ áE˜¡|—:Žô팸ï#mQuÿ!³NJ )d¦öP~éÿ5Äôrãö!¾NžµP}iÄ­-¹6L£|aß(Ðï#R挸a˜¯bFåJ&Xÿ%\î»[š.>®A>*Ь/•㦱q%€gì ý_$¬ù?å{SŸî)ýAaNA“büP¡ì?Üä¿SÆ"¼Ó­ÇC¯¥€TŒI ÖC/›ÇÿŸÉøgáâYîóÚûOmS Œé?<´0hôTì*â‹õÊåeßüx ²¬dÍûç&¹óyAƒBÝ­°ª·î‚åñt¦}\½æë€d ¨ì9®VªtLÅOþ%‰Û)µ*˜÷˜_èŒ<Ô‘«ýÿ#5³'çÚœ/kîº#òÌüH%˜|w àô¸]ר½[`+‚£ÚÙ'p¦·›Êï”Ÿá·­Ž®ô4Ø“ ¼3ñ¿Â¶ŸU-&ÎsÙñó¨ÿb…´´Ù·œ& pG¦•ä™Óö7^gŠÍœoò„{cÐêÞÀ^§uMñ)È{_in¾)°Î;£§hš[wkL4A ÜpSñxn—ÍÆá/C¬Å9üVÿx¬\æ}ކ‚þ%î& ´ó[ØÏ¼8gô\-Õ %ÇàBýL>!W ü n#âÊ\BöØÖºí%®<Ú‰Þi§ÌA}þ<‡¾ vc”8ÂAýà€ Îùìi…ùeôZ~Šó³WT§•]Ùš׌€µ–öýPß±èøi®Qi¼,$ÍèꞸ3”X-Òì]û¸ŽvBº÷?Dš! _;\6°ÊÛ²IûÆ—3 NeŠC6«î H ¾^/BnnyÀS¸§z%÷¥²pÙï•o” ;‚…ª~ÄqA!X¶ÊZ¯Ék®Yt8õk¸;ñIS’N Ä%dêtâ;nE‰ÓÄe´#µ azçTÍL«ªÄ‡  ÕóÂà¤J`n~rͯ½hG±LÓÌÏ™+à1›E@Þ~ÜPsîw¬V¡GŽjsÉàYêNöoZóŒ¬p6ˆêßõÅOy¥ì ©*‰QÇ-hüñOñÜ·Y·Ù)Cm'A!™Ëºßî׃qŠNgìäïã€A$a3ì¿(Œ*yi@øj¡ýÓÌ4DEZä_nì;ÝÇ—“Õ” 4˜—;Ïq›h ©ˆ*ü¬s?ñym±Ô³˜I (Â4õ6Á´h-zD‚aÖéH˘ž_E×H Î6!ýÁÚAc—RP™éŒu?VÏÉ¿.û%^ƒÕc=œ_בÿ¿"U(R™Î.1ïÖÖ—ú»yÈ÷ÿ«‹,>Hàö²d³A¹¥„“ãaÁ`x^Aÿþ‹˜‘¡ge˜ö‹ÊP)*3º…ÊpK?Æ”ötžÞhw.4,^ _S1èBè:­ÌCÔ#=Å'4íì5°ýû-”HÁ  5ºCÑÁ¢¶—UxÉ;lý[GZém‰ @ nìxk*úØŸu+28¢3>vr™ïÓ¢’mùŸÔ¾ƒ12ÞÑc| VÞD5ö³Äk1‘#¯qÀûˆ€Ôªh»r”Î7§—Vðÿ 2Ï/ÿ\i • J0»s¬*Õ…¬ËÎ |M3åÓÏ$rŠ@chZŠÜDvå]þ¶mVvRýèô” (Xä€mó""3ß›b ¾í£´ÅÃlU\ 9†WíR@ɈùNU7''º‡uTy/η’ßgëd,,æ¢VÐÍså ÌËR†.AТs 33Ãøîí¿ò`5a'Ážƒ¡bùí|‘Ƕi‡Ÿ|¨Zç sbˆÍiêMÜV™!J„a4Öy¾´JMÑÁ­ê,)`ØÆ`äP$—œ§?‰<[ºÞ‚ Ϲ!Òv]/E¯Ë&Ó:;Q6Ì^õ?+Då3 â‹æ\>;n5øCó I´ 6íÖr’@ÐmSüiÍÛJóTUŒø†WMÖ§¢">µ‰<ý2÷½h‹¯²_++¢ììDõ¿õ7 <¾/F¥Ÿ“Jµ³fƒ3¥îuÄéœ{É3rw9/]x»ažÌçÉÕµþÉ#8Ær¢¥KÞÓ&d¤¤š·BJzPÿ)! I'å}zx}¤Wd/z™EFß6d—´ûÊÁ¼ÓñèÇð%cµ—)¨P'¹Å¶ól”êèöje7Ëq†ƒÅŸ°mÃø©y%Þ½Yù _ÛóYü f÷„o?߬ª>¼}Žu?v£_+p²þ°k÷w‹k~™‚§å,Ô­aEOc2™Õ‘G™ 1s=àsšq"¦0w³%ÙþÖ1às`­{"ë^`¹ïÍÖx©y÷ã²Åéu˜¾©ñ‚O–þ€S ² Ÿ®äï°Ò‚ñhÖGò¥×Ëk5W„ô†´7a<´kÂîá“Ü_SøOIO©® §øöé#§‘ ?þÍ›ëû½<ÖaK¯-'5‘ÚC³ ù;&ɾ uÉ»ty=ç–MñÇßô­ üÆ™0ìåý{(´X¥ ³h÷¬†›ÙôæÎ.«ä/'k_ž Ð^Õ|˜ËX§îæÃi"аdõ©;`½ÍDtÂ&†º6C¸*ctLÉN¼“Ú¾öÄŒwÕ`¯€o©gY^|r•ìÓCURªÞà‚ GßÍñ cnÉ6ÑÎ ›ÓÓIÿðλAu°‡ÀŸ¬‰xh»ºê? -sÜxž8ÄÝ$P·Š g0úºÄ½ 7ãÆ»ï¯r)aÅW°AùÆï¦mšç,d&U²îMÆÙŒØzá ×L`m„ø›Jrq‚>JOè@ëïÓiªÇÿÄîŽöñC¹ùö¯T~7ƒs¹tÂ>™‹Â!F7ﯼ1ð„qäʧÕiq~³Ý±¬û€ôæ€4IŒG”Ð3åÈ-Ëwl6f¹tc$ Î¾?³S‹< 4‰ÇºY  {¦`wòL øeEffy^˜Þ–ê ùçM}8Ø|Š5ZšX·l‹„ôy ¶YTœÍ™³ åU¿X©‰ï n_$LEyë±DŠéµÌÍO‹²Y£Ã‰ûáYŽWŒç£¸Ä½ÜDþ;p|óe–T0`%f(õa6˜äÌïâ ¼MNƒŸ(NègՃ×á7$WÏ»[ÿü€½3zP¢Ç‹*$$4¢±d­4¤ÞR™Q¶ùÉþD×ãœngQ9DФ°3bÊ!ùUà8 ªRBeÖðŠ“TÌä¿w Ÿ¦ßuªFKÒÏGî¾, | À}•T9½i·i`†Œ+™ó  Hn=éU[³<’‹ÕÛøé~’Œg’e[5AãDÎ^f6‹2Ú¬Ô —žÐOù'ßTFÈIËŠctÃð»dpW*X³;ª;l èÁÿÙïîCþ‰¡mËpUÝ;ZÂt¾¶‡NÊbqDï›Pd Pyæë:žp¨huG²¹Fnƒæc„!N0x›…>}õ$Ñ4> W¬ê`m8«sϳÜÏzóÿKW¾gy…ÙX(Âdd 굯d‹uTËŠ .Zj Ì=ïxÃ}ÙAe4–ÞºD,ÒÈP":²í›˜'S%ÑÍ´˜•9à4¨×ÅÓôêº+e^¿­ºÐ˜=Dš ; HëGap{’°Û%±êxkÉl@qžðüÛ ¤Ç£Öz’ϵ6ö.qiRš¿ñI«Å¹—srs€{ài<)cçQ¬i½^Õu£Ì›H±»l³ÁqÇuAEz¨•tÆ|©ÀßpH\iù’õˆ’°hÃŒ„#KçëCƒ¶þ¸â2GƒgQ JÚË:Ì•´?ÃULQoç÷g£» å¤á%ìt\¨Ÿ^œ$^´¯åK–‚ÛhßÜí…X»#€a/,ºªÕîL”òFºw'õ¨¾ä»% MÛßZÆä‰©y¡RȬI½W¢6YŠ£%w-˜õ9Ó®Yõs²xñKÿ1Š„G¹ÿNn0¯ÓÚ¶ý¾R}ÊÓŸXØá îy„ºz‹þÀ`œnuzÏ(f9þÕ :7—Ú˜ Ù"—jîU…hwì~ðe×*)UâD6©5£ï”0Q54Iú¹fç. mÊÍ«ð|Ay_ño× »–Óò-q„ºôOSËçóûüëÁ@‚ûG ÆCç8·WƒÇB¨›J´Eˆr_l(‹4»d¹Û2p.ËÃŒ3º›%M¾]Ã_Çt`P†‚÷dËÅÏzVºòr„Öh¢^~q=Y|ü²c1ظpÝdTÄùÈÐû:ƒf¨kYÚê‘‹³ÒVÖ!¨NènZÄúø×VŠX#¦ƒ™?t~Øy“þ\âZ߇·ÑEÕ7“m=0a`f 4=»„ŸmÀ ø9Ðxì ¬C‘5_©¢º§‚gßµÜQ¯œSŽø-À©ìû®Åχšv\hº«´B†]$ªF³@[£oœHTBÓèPTæ¯ÒôsÑ$'ÃÀe­Ë#N Q÷‚VC¥„5J4­SÎåkQÑŒ,™‘¢ÛŸ(Is?a²a‰ã{ gõqš‡ʸÛéðñ^~ßZ SÄûç^y­»ŠØ£4E"Ž:'âJA¡‘øÅ YR8¬zP))hÏ/[blYõ#1ZœšwŽw˧Ôìcß®¦ÈW–¦2ýí1(ÉGø²‡³‘µõÞ%.o“0+ZÔ«Öm­ˆváZÓÉ)űt‘ùžwª>÷ŽTìçêŒÆDéÖÔ”1ZæéÀ¨ì×ùÓ:ëHåœ$vÞ @º|åA4oÿ+蛄¿OòõO3±×?ÊŠŠî_Æç ÒJÃñ¨S%(R;dÌë^ªyÅ|¬É5g×(ND÷ìaocaØ¡”BVó›kþà <'8» Ö÷°Dá·:yzJH ®Ç·»P™iÕíÈ ö1Ëú«àè-cç’Ÿ<àA™RÝ–øó êdyµÐB—+‡ÿ "{q ý}šî[Þ®ò`¯áæ"È¡W02£5÷¤Óˆ¤iy9cqRmí{†F~¦2¥K†ýˆ×d¦¸³YQ_òmÃý­”7â퀸æ„"–l‘Ñ ÕyH˜4{­PEƒ^rÅ…Å3¸Ó#þùKö.m8çÅko_é Îð$HîÛ¶>rêz0(ʽ= ›*ÑÝÇœ[*ÝnÌrt–AúÏ"EgÈ^Ê”1ÉF¬²QxØê$ði¡ß³Gìâ´’.Hª™åsæ5 ´1Zý]‹û4Ó¹x5f½²¼€ËŸž6äb²Ì]Ñã\™™d›´€+ÏŸ&ú¨/+“%ÿûx…xW{õv1EÆYÀZöÝÇ÷ªýóƒ¼’ÜÆÝÙ¶þãÍyüOs*‘ìmþZ"Yç§H) C<Ϭ=‚‹&³0—¸Æ#Á·&:çþàëÖ±Ô“%Ç HËIÄæüÝ#WѾî’/Þ:.© ¯Ðþy´±l†¥@Þ@1á@ƒmŒ@)Ý,ò¡áR)ÏN/aìœ{#w>Š‹æ Cš™›o/­´#_ó)”^´Ý $Á6F ·ì)nZ0Ô,DsõÇŒêèêzz½´°v@œq¬Rþ× ÎÛ³*V.¬=‰ò¬b†Ýv ÷<‡°xœÊž©ðÌn¾ k( ÁñKÀL}·6ÅF¬È=|‘\ñq2œ%A†[ZÐ[¯³©ÌÌ ÷¶>…iž·îÓEŽ=y¹ä Fšýõñës¡n;9ƒ‡uì@ÃÐÿKwT¼ x»gtš½ø¯s8îükÄ–…äÝÎ%¸ýZ™þúìCŽ M›è›Ýëûƒ](?3¨1&>„AοŊU’Õ™fTrÑG3F ’­ÅiŸ!/+_ðdRµx“øßƒty‰Ò< Kü?#·T—ñûågÌñ¶›ö(º@‚äf¥bqb´|޳ŠöÌ éã"İ„ØK}}² èé´D'¨Ám¥ZYÔj–D0ŽÿO\vSú£á Ï‚°|¬Äé@ž-WçágE1ê!*«M}ËC lýw„>ÏD jœÑ僞<ì t¼á‚Ä®sn9öF–!›·ˆ4#áÕg)º™“þåЂ¬‰…á(º\ìÂq¼WhÆ«’_óv²U(uÔ§ÄÆ8 OÓÝ\1^®%e†ŒéÁªáã%æô)M’ô+qQnÎr7 žsõR;õ ù¨-R4À§#þÄ›=[[{¢gýOÄàp7¿p÷·o ûú梦gªò¹R勾ÙdfìCÎ!çÃn9;pçÆb_µ[Í÷eô¥xÃ:J‡œH#ü¾†guL)¦ì‰DG¸{©0¨QÖØxHŒÝ…©å+Ãîé¯ÇH(Z¹-Ð…¤]õã„RLY\ÓªæHù¾L*¹ÌLÅÎè‹#E1jLUÇ#|´Ü>Y{Û<‡gs… úÕô¹[_u½yibJ…ÀBõôvÝ8Šê\È.ì¦[:~ m áòâ¹×¯@Šã(‘r—‹ÍÃx1c>sUl6H00ôÀ¤éµísû°ni*S¬;¡æšRîP<@ 2çåZ°bXßÔj›SßC“x¥Kß.“É»·Úš¾+ð ß\¶ °wï¡XM/×#ݯ¸¸§!¸t®žmnýP†œ+ÎÞAÝ_*ÚpWšã“Þ¶q;^E*l'ݹU¾‚»à¼}±áÅUr¸¯t™1}¶$ðHÏíˆïúŽVèt*øÎã%üëdqóBÄ^CiÏP‘E[õä(aÊ‹E’܈b}”žÒÐ6Ž´ˆ^þèöš .v±{£ßå”lø¿ç¢8¯Å7W= @E¬©Z*‰ã-¥²ê:ÔÙ"/GJJŒuù‹X+«ÀÉ]²5|ÜÐYà nLE=í4é3DÏ‘®Þ® pä­­v­ÏCA!ŒÆEZ³Åè;bîߤ¡UTö£%ʯ›\ÎbÐÍkZI3·ƒce\+IéY¼í Š0Çà±RˆkÝ̔څ9Øågëffþg\½(Nb¯¨©mûývTé½x» âEŠØãzoø–9žÙÊÉN$c¤ðK™ò¶ÕKÃaïÈÂÞ¼û6éêmáîAw_yT,ˆ( JäÃúšHižƒÆ»¹@#{¬ýO_ÌBl•Y 2&„uªo¥\—IìáètëÕ{|ñã¶?ƒÒÁv […­à+úσ?€c†-Éìgw/FÇñ¨GÒ³ú–‡7Àoƒ)¨‡Ööfgª5R-¢ÑÏ“w:÷·Û‡Uí±3Œó`0Ëÿ‘~¢ýçï=›#ÓòÑé-[S£‹Û•úö Ÿà™“­f/™W÷5¨€-`Œé¢»ÚS¨¼âf·í’K›\ JÆ„ºŒµ]ýÁ©ª´èßó™Í±ƒÜÚ˜bÚ4Âé™ÁE^ÆRHÓ:Ÿ–†8î!ñe1k·wÁC}½\”Šhj†Ú§ñmsò ¯pÜ7PEÇôØug õn6–9aº;Iù•×r‹É®D”.h}°ð#N®Ž•yÈäÖZx€™Uî¶â úÎÛÂc¬p¬Ç6d®Äk D㬎TšOމªó‘ÿÃ(»ðæiµ˜@•ÿÀžÔ,vç¦xV°*+T”-LJªòÊðàmP±#•½¤AèèGð]À.º~CàÃYEC»?M’u4<< ïðÒ¡zýÔx!êÈEAíêÌ!´M.Äx´–0ÐI¼Íÿø¶iÇzÒÅ­,*]ßWA‡E¾Áaš.KMN¾ë(´†QÔºOÁݲɃs Cè¬Hž÷ §m) Mo7ÌÙîqþVHÜÈÃ"ê@Ûê~“ž‚œ4mI4ÿèÌ1˜ý-~Ñ›/!Šz~(U¨„5äÑf] „Œ]–NŠ´Þ¶¥‚tȯ$t:1‚h<Þ´Æ–^ã0sà |>§IúXkzÆàòÊ·ÚËîÉíì" Àò†ÂTð Ðb³3“à>MËêæ*̾A²r–óÕbzÇD{e™¬Ž1±Áƒ"Ü\x= w5ZüËo‹gkK+³þË©ØöW‹(ŽßqÏŒ+tÜ©}‘è;“¦m$C[ ž œ7¶ÌíÒõ×è¦QjáÛAôŠøp÷=M_…i@äáOSœ£¹”‚0Ð@cÂKr±Ž³•b¬´GOÝgz‘ÕþAh\j_=FõÈy’•=*©iɤ³q“S`)¬¨´ô,=ÕáS7rËðÈ+æ Ó>-GÛ›k{´±ÇÁ4EW[BLçöÇWùõi~›Ü S€1§~§dÜ+sˆÄòáè´sÖÍ•3] –ºž_‹o”ÿYô–¡ P ¬U×™<¾Jݺ`2˜Á>ˆ¹qZ-=ºŸtŽžIö7A¼ô>«û.)hp§Fº~ቄÒ3cT@ƒ–mÉœ»VÔ.ƒš+{rL„@]8]F©šßfä\Ý|¸$…tÇ ˆµy†!Xaw—ˆÆÀ%YA «4×!¢“u Ãr8®úp¯!ª6åA`ª |6xÙMè“ÁæËGEs_£10‘ÜÃÄßË/^Æb„Æ’. ©­€³uÿž²DŽ–™ââpªüLŸT…mj½ ªAE6îóäW~ÜÍ‹Ühß"ãÝAD”<ÒºzŒhqðP¹ÅOU Ü=mEH¢‚i€åi[á·æ0ìÿAzãy/\„SÆog³}O\á­At¾%‘OØ¡/¼IÛÚWí7+qî ZÜ¡Áâñ°F¨áô#D%¬yd£Šá¥Áí>ñ-jR´q9›0ð+ ¡¡gžnrE+/^z)%=|›]ÁZcešèêenÅ…ñëîÓ*$˜u²%Äÿ‰™¤Qÿ“(Á:#>SvÚú¯…´u{#Yõ%ä‰[X«s':L*ˆ Ù h.ƒ›zÈã”#ÝšSºFÀpxe{—ê1ùýï t9ÒyWZ‹·qåíÏÖ®E† €¸kRL ´Ì!?%vN&Ù;:JŽ+¿! ½$8’¸)z†4Hóupe³–Ó+Ì¡H`ñûÓ^¨¼ýIÂCs‹üˆÒ¬ãŒÜH) æ§v²1(À–Êè]ëDå©1iþùýLêÍ‚êºCˆíÜ8ðN½ô+ˆû†´ßYÈ$Ú$a–—\…ßòð0y³ßXígƒ¿u–!||]~¹Gá¤ËAiêýËw1£,koìðëYV¯Ú­Ö&ô“)•ÝinnsWôö’“€å—Þõ·b|÷¿ÞÓM衜š›²/ÿw§“`X¹î¡}áŒ8EN#ñ·íL´*ÏéQVñèXõ']¯«&Ma•:þÌú9|Ö Z¬¯{“ú„᮵cuýÅ5ÝÊïN¨mÿ"ÜgM5†e¶’«‡°\Z¤0‹u*f`ç%(»ŠøŒ\ËøÌCàeûLeð}¹Ç’È øî=0AÚYöTÖV|!°m² €÷íýƒ‚‹Ù…›;õÑÑJ¯²ððc,×Ï\‹ÿQ3xÔ‹óæžÛO¾Ü4Ǩe*z€L_»ËчéC þò…ÿ]´7<“?–æ¿·Ð’ÛgÍ~6JMŸ;%W#/ˆö¥æ…t7ß…{° š ßS6¾ *_ Ç…^p£uàÐ ï0íH ,WpïƒiŽðš¯;åˆ^¿+c\–¬¸ÀŸ1ŸˆÌOxF¡Yòk4!z•~à÷ºÙùDìé1eå@äÚóLÌ$Öí4þëz©ºiþhבìòåC'B³~ÍdÛ£.³¿åÉÆª7g¥éúˆ`zçÿ%hAŹ"Móro« “mÎKÁùºFWOˆQá·Œ-œlÐ#»òťܚ‰âœÐ{}¥a ¬}Aøùü@d‹?X¯ëX¢àá –MÑ%Ÿ ÚŽµÃÃ?K ˆVÅ@À˜ªZ„/'uP݆4ÏŲÔÑ Zü)K(¸^¯O;õ[µ*F–ªæ<   µ+Ÿ˜·ß3ô©­Ïá=ÜcÔ qf/eH+¦>Ý‘“væòÉÞT¦C8¿ò–Wä­™Ó;Ÿ½Çg‚¦k Éh#å·u¢å)÷ Å;®‡Ú†_R[·¦£­´ÓCwuY.g -?ÉÝgÒwy1^|Š6!íÖÕi±¸+,Å'$–pÜÇÛ"dë¼uºó?ù«‹xdœæJåÀyàñíFïÇöp¯O±|þm2ýp¿4Y„"!%7°J«TËuC/й˜ü…ñûÿ iÌbðКĄ$0ßDƒÑÏ ðÌ«¤$Eê‹Æëú{¾a¾=ajÑ<Æ0j †$ÔkA¹ÈØ` ¨ÒSŸê¿Xt匛*ÒnþÑ`î=Ú·íÌ5{kZ›Å6©;J#]Ý↦ªøÑ/Àë*ö;ëì€õ|0t˜¿Añ‰¼H‘åW gDÐß“iÌ­p½n>ör|ÁNbŸœp•λI-|Úœ$XJN‘²$•o%¥õBÑìHS§ü){?”­§ôÇÛ?¨ÍÁš’ׯ¹‰ƒpX޲BÔš¾Üj8­r‘yxU†y:7Å„úužÕÀdD‡äøQ}ß%ú|“›‘v³°¬ý1ò4öÄŒÊÇûÛôÙ¡¬ Íðgßò¢ÎÜöÈÄ>Œk¿ò~cüZU\ÓÌÝA%ÂWØHo/a¢GsšÛ·]XýïºÑ?N(Éœt¥ËñPX4„üé[Nê rv“„ð63¦˜ª- AæR ³É¢;‰Ö§ÐJŹ®6ˆºcÉhœC§?£NüUÏUOó®úFóU3eê©3HCQ|¶Œ’à C-ÃNŒ,W²Õ¢áqe‹*låé^¤@D_)7O·¨Y 1ºã¼Â»zþgo¤f_|<ëØ§»úÒoÈE#hKMI à ùò‹úä1-Ra YX5–ð)Úw¡ܨö'þ—ÆÊÅnÅ’F~,«Óa2áGÁI±û ƒw<‘ÙÝYûS0ç£P 6¯Ù½ÊÌ}ç3¦1%«|î1834z—ÓÁ 1mU®yÎ HÑ N4H8v6 gûs˜v¶y©†ûzÙ _¸É»*ÎHRíè2ߦ×HÅÃ*š/çþfgØ2E5Ýv͹SÞÿ¸Òe q™A¢tö¢„GZ‰Xêøú+Ý®öÖß³\Èéo0B%¬£ôie¸ˆáõ]´ €K¤o7»|_¼Úñq| Ç3 µÀørë…g¶Ñ"(2G¸Ô3Eªjm¢må¿;ØeÔäàß©¦×b¬çÉ5ŸNžî0×< ^[χÁq>\+“@({±ëQE´Í—X#ͼx’@jqa÷í]‡`®¨¨Éwž)lh„0}ÈKúª°ä `£µGI¿9avZëþ³ ®,Ç#W€Ñlnôð^Èu!v\:Æ¿;‡BHFÜ•–ؤb×u¹·-ÛçÊxCï <ŠB›ÂÀ)Ñó2Tãn‰íy¾‚:qOÓ°ÌDÞL…³‡cÏ}ÌŸÅ-ÄVî¿åS¨NárŠe­a”Ñžõœ[ŒšÐhQ\`W˜~hÊ’aÏeæ‚E,tP²Y¿´Ø;Á‚cÇ)Ä]®ÿÈ»èŠ48¾Pý'xñªœÆÞ QBÈþšJ¿Ÿ†gŽW(Xõ ß”SL~ÄRKîÁ@OIO”=6ºZÝ€-Ç[ Ò-6 uj‚tž½øÐÏV¡8y³ë„XóEšòó¢V®×<ðÒLs >9Íz§gÞÿí«n*4:½Òˆô/ö^…ŽuÍiG59¢¯£ ÉF·E?EÚ|ÊBűá&ÅÜ0á±ø:›Ø¨n ·LXUÊL cô©­ì}D˶yÛ?}ì{wMêlNËw]ÁeâY¹A+Ô™2µ=-§8ÔFk”‰óÒz˜º©Å3¨Öªç³›üù.]ê†Hß¡'#]³¿KGy@K|Á¦ !œ6wÈ»yÁÕ ­œ¨cçj‚­=µ{if Âí½f Å{ˆ"⥓”:F„rôK{Î9´ÈiU%\f°«øX;€U³xÓíMüµÖÃ"²Wùã±(·lÆ¿Î#–YèÙrBñ@ØÎûMmkš?ïps ™ ïn­YLÁg<^z¸5ü×­Ú¯Þ3¼ôµ×¢Q`‚"@æÀÈmëú›E$|1äšhUL ®är )­àEfÛ}„ð1Oåï…—÷ïûü¬KB—SE¹G‰¼¹cT⃡V:Ü·~ú?’XúuŠ›™CÌ“;øpR¢±‹­¸8ú‰ÊÎþNئËäl£-€ •gaúÉp¶ÊÜð­°>wÈîæÚžµ/®œW„ï 8¬ì6“ÝnÖTôŸ¼Â,º¡Xøù{ÿ†…``ºò¡:JA›ö!õ¾ãWf€-!UO¤ã³p%þðÏõU–å:»f ¿&Xq¼bth0$R9†Gá;ÈlâöAݧØŸ³Ö£§HÞ¶%Ä–TÓªGEÄf»–¬Q]5¢A o‡ÀXªW"åí÷ñÞ8Ø>–pn¾tf3mJÏ1ïáj]OOó-cØ•geØÃ1s€p€X}_„Îà’U5³Õ˜ç‹öϸö ü°éûõºRñáû»•Ö©@J• nT¤ÌÎ"¼@£äÙki¹ß-˜IrRBÆŸP$Ø®L©=†ÔÇ‹±Ç&ë‰Q׆åWâeÔ$3?Ë Õü^xœrÔU¶“ðè¡%L4â Xö¸¥gEÂ’ä¢Ô–… ÁªHLÄtYÕòŸ%|¨ø,ñ{7nô-¸<­S©'e$6¤ï><²û–QŠÆ ~‡ÈÑ⼤¬"œ5Ž¢wÎI"mÙM«ºìX:=ºýç©)…ÛvæÃTêêÙ¦ÅÓ+—Ë€¬°Žãž ÃjnÉOÊÜYÏþĉ*«bnºŽáÄy*÷äþw¼Hð¸½Oiø6ÅÊ5+É]n£õQ´®hã®#è.ýoÉèÏx:P›¸Õµ±Ñõûh÷ -=M*Ý0^åvPdêrÌ+a#H©iªP5+àåcw†˜ ˜º”þ$Í9Ð,¬?JÏ"2™uïùÍžÚ)-û²Ö¥·zI®óK€hÊI•kÓ?µ ¤s‘‡˜ŸýIê™(3žöU£›ŒPûvdr\·KÅ=bÝóè.¼OAÏl¹ŒÎ‚Õ²„¬u=îE×òMók­lŸ tºL$6—4]ÅI 9öd÷Ç“D¶³y,’ׄB†ÓgÏwŒ¹ëáêf7KŽ)«…dÍwÙjËh4ù±°Xh^"†Fxí1áÛ2ûÞ §Ðk ŒX?#-x žÑaħ.F½½Ûù‘}»äucmQœ;1"þÌŠ¾_\c(q ”ÜŠùò'ÈÍ$åñ3àñŒeìbM?sÒºµóAM >:qõ$1†Ä%Pû^„¤ZKÌÞöxÚù•…fÕˆœœŸŽìkÛ1cÁ[³øl\jé²y†¹o!k­4 ã ç/YuÈ‘ñ ió¦¹)‹ˆ]™Äh{i°œõKw––Ð=±NÚ‹k™ÚÚ زx‹klQþ ©;òø$¢5b2µ©Zò ªS*¿¼ä½QCˆÚ±–»Ä^­|›†òšwx_—âñ4!Ÿ%~Äé¾ ÔAÔ°% †…>4ÎÛãο€D—¶‰Ò6Õ4¢À¦y¿åä(íµžõÍ­ÑŠ®(¦Úb«a*Œ†©—gØ@–hfÛbÔ(Kj)É7ÑǨz– ¥j4“1€RÙí$]1#´€EO/*‘}øÿø w1Zã^R2ÙZ ŸÙ_õ”ºìf‚ü¢dõ°<Á‚Ç@Ä0X® ,@Î΀É(.ãaF4yMKW–ïÔ ó3v|>á‚á/àË¿Ž\½|æ¡Ãx†?DS/=.áò}*ê^8‚´¦©"üä5b}âi¹ ‚ÂÚ¦6Рf§÷"‰KìE,LÕ@g’dˆÒ*®©óÚ³o{ÇGgãÂhØ?œÖdÓà!'CµsŠDœÉC™äå²ßò–ÉêÛó9 Ž!Ö|8YF›Øü@ì~ $¸½ø:²@ÕotÙœ;ĘÜÂ*"’ —(ÌÖï Æ¦*œàtCƒ£ß@Ç/ÜÛ»¿£ïJèೋBèö©¬Uæý4)‡âQ³G·ïFFÔº¢/ùÍEìyf+¼Ž6XÝ93§—â7±iÑ≠½v;«‹mRãµض®ªãÓ3o>»OåÿØë MÒ&&‡B.è*ž þ‹á¼ñ™p´–wYq¬a©¡È–g’š‚ݯÜÎ íá×ò‹öj6 𢅅ˆŽÉgà%‘q…ª~ ÷îÆ±—Ëñ‘Nc€‡YU %:Të`>¢ÍN™£ëͽ> ~5ðÝߤŸlŠa¤³oŸ×× ùˆ½CR¿Ù£ãѧìŽ8ì^YMÙ£DYО˜˜?/Ù‡¤ â/!hŒ†|¿–o‹`)‘œ˜TÈús`—Òím™’µnI#'– ¼iŽ˜hff€rÄ[§M^¯Ñ]åVÉCL±nÿ&‡(íp¥“xí×éáâÌê+aÙª<êâXå$¶tã^s« tÇË>ë¬áo«¢©ÕǶÃÚ2ùnÔF7o…j„7«|J!J/Õ©H¶šUTݶµòγLËP©p¡ÐI€êvs ®|êæª†®(^.«Í0Xi0½°Bb¦ƒª3„¶œy>0j¿ƒLréÏ-$7žB@Cl‹Òk],­˜.H2ÿ²êÓ1"eQr?Àf¶"­Ü´–”)Àa]c ‰¨Ò•÷™í)q[Ѭλü·x%I®Æ¨`ŽZAÊ©ÿ`±Y(ÕrpèOÊêçÀïýÒA~¡­Š”'qjþHk¿'©„ {„b‚™°Íèõ}ѧÍñ´_hä$n3Ú3ù;G JDë ’g`[.VÄ|Q ¼]¾öÕE!NÛÖ«ÈI½™·à¿k¾qd°*ˆ'37ô0£ „©”3~Ž |9Ìj Z÷¼¬³šFNI$IJ¬¯ËpZ"û3YÓ`ÁS-»F 6K¼1!Ÿ¤!<ʸ%)ükg¬T¡±"wÞ[Oào<€._’íbÕa&öÈ( ôܨ“aQti"”$vnœÄô¤wñä§ûæLØDÁ\ß½ø5Š ûA†(,»¹ÜCówICÔ2…Þ,Ô†í®i?-ÚØD´LpM+г7ܲlî"~œyýðo7°SZŠ#¹ÎïgSdå]µÎb€ëÅñy9|“0Ã&¯°ˆÍð. «Y¯š&Dž~#㟥`••,¹=9 :ºivÆœ []‘\'2»*WI©¡©ùF„f†dèN tLÞ!-ÿ!b§"h0ªrî6ú~SOÝa,j?œ½Ž¨¾A!Mä€&û¹ Ö õ®Œ !¹HÑãÀ¹þùP. ÇzN.˜´OÒõzþ4PˆÅ=÷N‘è‘ÿï1àÿ¿~»Ìnæ«8wÉ$?3qV!'E€Y]o!ÜÝûÔ1ÛG\$Û9:ÎõHâÖFðÌ zdl…‘µivstÃÂ|nixy (åŽ`ë^xgÛŠ:Xr¾½'ø÷’ç€SR}ÓˆtáRƒ¥”g´_2ÑžìÅH+œV!Óßî^¨ 0ŸA ^?8KYöóÆ$wügÓª$&µÄ¼´LVc+>bYœØkY(ËA€«Qù,*ª|™^ Xl‘\œ± V,l§_p†Ûi?hËt5âg:j6øÖ9/Ù¶Àk»òÇ™Òì0w†6˜n±V†‡ ÊÈ”ÊV&…yd ™;wAd-Äž e5G²8ºíG¸•oþäÐË,ÕaÜ—Çá{¢DÖ”ŽwgjKrÀ6 |ì|YKOt¨Ò•G\%­¬õÞöÁé)¨¤}}U—UØØ×S9kj|‹n…Ó^Ö'IþÛ‰ïØŸO¤À5ÓkÒ¶ÈæR¹ësÅ )&¤rï¿vDÇ Wþ;­†ŠóNPý*`õ»ßF-lÆÝ³ÊœÔé·s¡÷Ve¬þ_iD†œæÐ’f¶ë'¡È x*ˆu}ø™ §Bo…»-öÖÚЫ‡F|r‹O־̢l“3Z#põºÓ»Ž<¹rœC1ûÑ-`AñíQÚÇ{´Ø’Ÿ6ƒ:!δaºü—³h¢îËa®Þ’ÂHÃ&áù̉p2m-H–D“ðrŸ†bß&–ÙwY  øãæ2søÊLx•V’DïÕcL<œéA/ùo&Öó|?Vv”ŽYÙkÌhÂÇ+{ûl{7AATߎ\=ÜžßE±Àj¦h¢¾SZýªAÿ‘)Hè«qµù~Xªµøï8•R› ]yÑŠ8|¼v{Šg‘Ù`žê-ñ²ñgu2}¡æ úØ’–¯)€kŸIMŠnÐr—˜Qîì1:­Ú8º¤b%ã"ÿz`G?ò±^¥ übS{•ébi%éîcú«%ÑÈvQ¥ ù„ºJ™8˜Š‘°Ø ÃG §h7#‰:xâ¢@.{Âõ¦ÙÏsû§ç>¯¥§²tb‚è¸w}Ië ¼T'ú Žæ‰@ÖN'[™×‡¾ÔÂE"nÝ·‚:ØRÏ«îV‡³ïÄ¢³)+pHÜš#"槬0ÄúáôšõgËç_51Îkë¼”jÝÉ+#7û]nj¬˜qæóïÅôä¨ïiðqwáÓ¢½Ì%=Oa`­ðy<p”S~QŸYP>f?9`+9fw¯–o¥’Q*›¢¹Á¸jå'Jý$ ý‘Ä‚£b˜ƒ?bt,ŽgóÆ |BµsfÅ™óê™øgÛ]Á{ö@øÈŸÏøØÈ”ò«a›Fä1äZG0ÑWpm)î‹0ï“j/Q$ÍóÔIÄûÆož ‹ÚQ¶û †da3„Ò²ïQwI]Ò–’ò[gáÚÕñèÜ —7µ–Șçb¢ñ®&uœ¢$È—U£Á% rÌ‰Ž ¶ž;öNé‡ZÛà7ç† \… €_è†Xú ìÌþŽšvôÇ—/É.v ¾4¾?3{1¹rj$÷§>SOûÉ|Sz7‚wïá=ÝSª Ü wŠfg1æ#¤C”«·T!ŸsŠJ?¯"<>æ®uV³ ©Ðggp :³µà$àÇ- C5è.ßβ®ÚÌÇ™9ÝI:˜¥Þ†ki'Xx¬¹ý orãŸ5¬Žø·å÷óºÒ¤ŒfRàyà6 ]†N sÚ„vÕ÷‹KW…D“ÿ …žV)Àb SO—³v ›‡á%Wñæñ†L;”CoêŽJ°5‘h ‚«ŒW#ƒ·5wŽUS93² M§t‰íª?Ù5£ƒ,âxÿöÐù}ò%õdƒ¡kôÊ—CÂ&K}Šˆ€OÅ'<4-ä= Š!fÉÃ=ûJn#¿È&“-Wêô´qìDC'ÁüLÏûôñ ¬ÒvN·Ê‘o¹À½{–|KÎ!=\(öpD¯×‰«lUu6®Q_hf›§Ç¢Hë¶V.ÝæêG˜ÖiÜHï09S¦Iûê<7Þž}-µl0öÈvw& ü~} ›¬?QÒÜ£¤+žäõ_è_\¨òãäøFÐ~?üø½wž7=ÔØÂq ÏK¬³‚q.&¦VÐò„K§X¬B/v–Ý6‡?O|=ïW@úSöó¨[v.r/·Þð³¥ù{v]àUAá%ÎùŸt¡b¡˜yíêùMŒœžryÛzòðïiáA¥\ŠÔ„ü—ÿI[Óp&è1t]`ý§Ú"éE–:ª½„u£@ÃâÐ1ü^…LbS¾ØÂUf–É0c•éù×]*öËZ4q.wˆÛÝMà’Õ„DªõϾk o'ƒ½þ‰¾‹«¢‰¡ ­(Y×P `•¦lK³BíÂ’Yb~?fHŠ©<ÁA(þ÷¨ÌÒÔ7¶–ÚÝDÛrÆ6š#'˾R•ËïtÏèw! ÛÕáIiÁì ›Ë–óðºE_º¥x4±…9x _Ù+ÂÖ-AZw«äæÞÓÚÝŒJ~WÊyÏ”ИöGå_žÂD7¡¯bø½–P'qo|Û%¢Øà·è¬Š/‹[rU ØõÐcòÙÂÔ·v5u¹¢­¬m°úÞˆ©û¤åiR…ž„QÂèq|ZU6Á É<¦×úfÇOŽ.•útĹÿ 0ÏêRí1<þ4ŠÂ”LSˆ†ØÜãÛ)K‡aMö…zc ùZqD5ÉÌ…-\­|wÿ»ù{ 7Õt¾WÒÍÄϯ•>ë%j½¡B©+Õ Ú¶8Tïþ>Šˆ ñúpçšêŸ›•D|Z[Y?²cyuhø5]vkK…«‚Š—q½†—Þ¸ËJ@{ìzlõ"ÈÏ.ÜQÍÒ[ÒÂLµ_RgÄ)¸Y®å ÛuÄP«¾k¹”~†«qÔ€0Ê@Y®ü98Ë¡×+®†Eí ˜5Œ§Ôl!çE‡ €µì×ÛÊš´ÐM³¶×û7 ¦Y(CJ~Ä fÍ¥»þ Yí0HÀq['•OB)‡¶…ÆmˆAf›J¿k¼à2ÇâÀ§šž7ê°Iªç…|œàx«úÔè?0ÑAoÖm(–.µÖǶgIn‘ˆä8[™q™ålgWÀ¡ïépÏý°.øÊ ° tª……¡ï@ÔöHEM”å˜zDñúŸcIp¶ß­Î¦pRèlŠåÙrõpkT-¶¹œN]q‡MBF” ÊÍd‰F ¦%QîìÁÈ$(5϶úžü0‘¡"T2îºx¥¤¹EIäGê“»£µÐEM™Bm9DaM-j•Ý‹™>àºb?ı¦·š… ìétfõ³õ’ú]“9åm»9…?<ø4édbž5™öû¤H}{¨RݤÒè|fzx?e˜ž`[äth «ˆ¥bð ƒúÉó„)Û½LñhUàð0Imz~÷Ø­SuŸN3-Ô°b,ð¡ÁúZÕ@¥%ß8å2áÐîÞ2ü¼&u¦ªjÄ ò‚X£ÖÔé*+hâ9IÀ¢ÜÍUótuÓÅø›_²Ôs0l6ºªñ,ˆ7à²_’¯GàtO1ê`jú£j1m܇ƒú(û”Õ`˜µÐ²výg!`†'YÎ x5ñKÞ–ï"’^fšŠ2 “GrÁÛý¢8妸ýdW”º ºÞb¨ñÊò•Ú‰ªÓi%EsËœ³ÐOÉZ™¥£”å@µ¢ÁGm.!ϰ" ^šÀB~åeèÏ$²>HجZtð°?¾Šê½NüHæOªþ÷l*cðSǺQûÉäEüt³ÙalIt]¼=rƒä|Vˆr¥Ü]ѰZsÎþ)s9¡ê›ª%Â~ Æ®íE_*¦: Û’’J?]J†d‰^å ÐÓÌQ¯[8‹è©l¨3£ìõ¯%×åRÂó DH?­DHD³'Ü2Pö z¢ÄÉ=œÝÂq¡Ð•·½:î¼;½¼¸BI¹ÒA3Ž(äìîTw2¼ß/}ÕDx-†tõðì#ªäv]]΂f·{(ä­xû¤„5zý©²ÚÔŽ'zµ§F½Pã¹.è’|ÐX&À¢ÛE^nQgÛFL× b.·Q¬³LÌõE9ìk,*´Î¨Ûk-ÐŒ1#Ïtá¨á æP>ßöAëÜ ›<2¥-Dý ÿðZä3! ‘›Ñ¹0IeÎïdß 2A )]´’dÅoƒ59•n½\ëC!ÍäþîÊ%)²×¿¤¤ðU +û0Âs‰â貕•Ÿ±ÍXaôx©¸¤¼Ÿ¾vUI—3Ûds“_ò Ïáý¦*b왉ØäZn‰ÓðûÌ·Sg+n™¡ jkÜ©õ›(‘ŽEAõ ØÀÊòJ ;µ§Õ}ø¸5ƒ˜ÅìW‹q˜TßR5„•ù*.D^˜íä^OÊrÄôPiú ¹lÛ&*déNq[þ7S[6ù±mÞ3ÃêÑ&÷9ÒÌ·UÌ+ϰ,Ú!뢀V²,Õ…˜þ¥µ¸¾¸~´Jƒ2UÍ?‡ÿAŒXðx9‘¬Ë†.ÙTÏk‰ ÂK`9…‹RôüÒö(½(‰‡Âðw;Š»Ã ÒŒ€·ó ÷8—‚TçF¢ÓÄUε©Ã¥%é'áP߇UÝ$ÅRšÈ'Êj¾%Þ½tƒs’GL¢oo øÃŒã¼vŒQ+Ü=К/œBd_·Øè ‰çÈ!j=ß6~Ú-žÖÅåV£*‘gCœyáΔ…8I›bæ ’á]™H3[Ã8Mæê>läå¼­®ÌÞŠ%ð)žv¯ü¥Ïd• •ö èWx³IƬÑ38Øþ׸ZœÂÊ1Á¿À­Ÿ-ã2 ÿ8°}þ“º€ä?m­úÕÁ’›¨´å¥‰ÃÀ¡CXo­ ìy5‰néïÔ6ˆ¤4-pßl¶í™í¢>º+Ñjò{pçƒòœÎÃèF»†Ñ#´ËSð$a•š4ƒ/JÔRb)ö6yHÚvˆrA$«˜cYqìò|ÙÜ? #lÒWZ xÌø«E~”«÷FÁš«˜ý=´Ä@VOµ­‡lŽuk‡¡t„³ lÝ|)íÈzC¿×oÆÜ­)-bï6«HŸ/]j·÷§¤9{a^€ ‰ûÜ^ “%ÂftïÇbÌKÐQ¯Fðþ½9ªæ'Fv ´F¦°B ÎÁï«ØË-àbü;V¼¬×0PyâÍ•WÌó¿aˆKX~‡t(ã ê´…mÕé&…°ŽòkQ–¡ '¯#Fsë,ÉW¾¼r5`tÅ„«t…N~f`š,´s½“Ç7¢A»è©¸srm=è¿ôÆÚ´þzÿPd'ã†kP¸ÉIß!qÃn]ëúçéãÁL/v]cK†,¦î’öL^{$ ÊjÈØ˜=`L›JÒ3¿…{2dsqR"!ß[/È!¶Rš‰d¢‘&y$›ÔVÂa⎺°§•·Ž×Y¦÷ª¢¶Ö2¼a¢ÖÖ:g‡™–ϰ :Ùc!3·¾ ÝÔú+ë<9yþš]¥dÖ‹n{d­¿0ßÊ4àÌÅBLÞ 6Æ)DI[Týå8ðÕc‹+¬•Lß´e™|±pœ„¥5÷ uÒ~—DÙżdx¦7÷\ŠëEå<'±0‰„ÄíøÏ†¨…¥ñv+<Öëv*ã^Ö Ù±º¶4P ~_èûzÛÖŽˆ˜Ué~´š®…g.Yˆ­À¿·Ô/ïúÎ &$¤9Þ5\É2|K òxÑàå|Z¢ï ”*h ÁΖ[&è"×_ömxó/Ýg^/W‹«øÙÐtÂ9§ì¥{þ̬”ƒxV”GºiO#ó2†éî£_Ô$t?¢D?¶câ‘ÅF†¸¨—¥‰›¬ÿâãaÐæÈý$Bar¬•€oÔ¼%î‚TÀ]a}T: NðtEƒò˜ íVÌÎ:6ɧ¥X6tÚ‡nÝ ê£jÛ÷šmÆýØV.Pa—ù'eÎl=È¢sLúQŸÙ–ÍßП Yõ¢ ê¹N ¦ÇIÄÍãˆÚh(*ÅtS¿ðë$P9?8Ba*{U&k«ƒÓ‡êºbÚÿP Þߔꢛñ†íðe¨U¢œÎÇ? ~{»å^iü•›ý%rMYÞ–R“:}Z?‘ÐËW_H•B çÙg²Ñ“á¿ÀtºÂµn¾^Ø™QŽ3’®šÀAdB¡ U¿bλõ•Ì€Ð_ÔLM)Æþi=¸š¤§W‰™îÂR&˧¶ò¾Ì÷ûjfNþãRXÆxNó7)üÌü©[k¶lMR½Ãö‚±hxŒ­m2ZìMC)Æ–‚¡?sL+ì°‰÷Ï8Á½÷;BOÿöQ”[g¹-ËŸ6°m~½J±B= ; Ýö|ð¶ÑvÖãhÈ rÇ_-jâщxRÕ&:V Ý\PQ¿ŠÁŒ&Cr`ÔÆ+Nâc[ª¼1iZåú`Ñ×Iï` èº—ïÉ÷—G愞^>Ç ÁjÉ•sµ=ƒ£I*Xnæ&]ÞbòT›h)±™¢ªSÁ­˜¬vJ. œÈ—£é+ø÷ÃG7ùÿ@ê˜$—‚~y†=ôñ5)Ø ÙqûÉÇÇ5'®¦ÕµT|Ûx˜Á½¶ w§þ®÷üKŠOÁ”Aâ IáX’“tªï´DÆñ2‹H[mÜ0©jdºª‘æì hˆ8ÙòÀŒ©MÒ!›üCd/óIRÚ݃çvVâü« F}~hÃIË®oøÈ­ju–= °6vÈ;%ì˜C÷oM]ÜDS»™/×A³4‡¨ .ÞN òok.ܪ¿Ä ŸšªG 3çÄ9G¨PÄqÅiÏ×NLžÉ›ü?Ýí7jÛDy…nó³S½9TÇ’ÜˈŸÒ{L¢Àú?ÝâêÙ”AÂÓùñ·…‹qœÓ nIÒx0nÑxséÌ¿ú¹ƒ-Ø+' “Ò—âªQMê„Åx^›¢ÍÅ#€g•Þ¾¹í㯗2© ̲Y ‡¿Þ÷:ÒT|Áâõ!TÅKñó²˜-*UßîlÔhm³–ŠÞÏ•ÉøÍdÒ*`À´0Û¼Œ‘m÷~¸§øÏdTÊÿ^ püHž2Hß°d©=X‰üÖ«{¡¢v‰ ±ãV:kÌh%S'x.“H±C$L¨1˜$¸r@Ò·|Üz?€’  ¨/ðuë*Z±-Ué§ι)²y‹`è«rŸ>áaxÓ`ß#œ¢« äü¥-µNÙ(‘^ «H¿i:ý—Ñ­É7þiÔ@NNŸ•³JЃ4zУ~’B™QÆxTÜÔ®~1ðg©óAÒf‘cLNö=Б†÷¬)ž†•ªkB˜ âáMo ±‚XA¥Ô¥"*u;ìƒÓ¶+ g•f”]`ů_±í¥TÙ|–ä£0c·Cñ"·ç%ë?Ó-‚Ðãî«ãÓ«ìø3É!õë1ÁÒ3'(ìH`¼¶±!¾B:‰-»6kÕB˜yHr¾ü c£³Ö\l-LeàRÒ-›^–ˆóëAÓ#5{È¡˜dë·ñÃ:òF4”DO†ÈÂýB9ö€~´0î·¬{’½4O%ÚOõÝ«a@®ñÉÕÓAdsvƒYÃ9¼ô ucËRt—}dö]Öœ™žÌൽA0/z@Ss§!œN2ŠÆ­‹b(ÝpN(ÆŸƒ ÓuøÖACž8K‚@Žz>‹KƒI9¾úÂvy’cž G÷ÓlUTR½ðܦyØ-ë¥mJBr ÀãâNT¥!K¢PŸÐ5Q9yÊÖ`Ñ“y¼½†×ÝÝ–‚4¶Ë²ãUTž˜ý×7—d0®‡>}^»?¶çìýDP|d=É좛áhj‚Zëw“Bvo³+ŽúAM0¾ÍQ‡Äàðk†&ºÍÑAdÁ«5ãÑ©œnl‹`Äj²>˜5SË\ÓUU…oÄî£üA £^ý½+{%²p ±°ñ¬ó…Ö=ìŒ<ÔkÙvƒ ¸<{2aÁ¼LKás“‰¹s…‰pP/åh|l–Œµ®2~‰Ñ‘¼¾O”Öl0±ç£xÊ7®R!c+õ– K$ÆÀ©T­Öþ¤6Šî`£²×ʡً'¤O~¨Àc_Ù…Såä ¿Å BÌ ¡©Ä“ñ ‚–—Н(®Î ÎÃæåv ”pÉB@+ÅÒÅëò¿]´Fþ)T¤÷þ?®ðžômµ|Ð-³í¿4µ6@>ð‹.ôÀH²[Ÿ¤:@çÞIË+øF6=÷j‰®¥¾+¼Í] OÕ‘6&1—8­#ø£åZ[ÑŸÂLR’¼ÅscxÛ=ÅÐnq®ù{7®'¥“Þƒ«æ0¤.È©ƒi\—àµh£¡ àDzÁìÑX´ò[ô¤«§·"¯.ÇöÁpücnt™f×xçQáíã‹€T!®Ö7Uéð‘›«u 1þpëÇÔZpwK[˜NVƒ*+XŽ$K“$'Ãaÿ$ÛÜ`ovÏYºcBÈGó~ß²…7!ÐP¨iá"›g« ·åXÛ‡t=Øi;•«ŽÎŠcP)v]¨D­ðý?‰JØVÎÏ”JâG}‡äïã=®Ûyqñ-ÁNJ¬¾IT&ðØL‚Èô:\Œº ÖH|1 ÊZ¤Óè†A1¤áèꩉPУÆfر¥Ç+?¡S%ÜýeixI¹*­Ò‡U$$¨…² ò£åZ  åÿ™u¿ú•™V¯®ÒÎêï©·7=Ž=qüdªý»Ê„ JöVø‚Ø×~jÈÐ…F£Ó~[¥­ÚºÚƒðEÕ)A½"‡7:…Ž ^³Ñðr5¢‹&6fŠÑð†(zçæ 2¬we•13ÇAF—O&–ü¯3ŒUL|8˜#UƒNì:ŸEòvÅ[–@ò®5YñHݲ9ez뤿Żü$‘Í-ç LÅøHàÂZ‹J µtG(¾=ãS7sšÀʨº§©]JE§° ñNî¾±8t¸!‰ÜœN¦¾Ã ~á}ȃ 6@¦;ûç21«aöä;Ñ_ÅÐ;Ch ý®E`>Ìcëð¾9©©µyíi[ÞÔÒÓß·WÇÂ;4s’f g¹uvê$U®ö­Œµ~¬½°¾EÎIñ‰Ô°Ñvok ÞpgeÙü¥·µȶf„¨[¿Ã ?h1"dÓN§¬r2&1ô½¨´Þš@}ûãþRù¥Døç}½"·@lZ9‡æbxA ¸‡Òu€ ½œI dqß~s´µ8'ã§J—߬ªX72 ôè½R”o˜Í‰_°šþÁ™&‘z0ÃÍjƒé:HdøQa2°kFsü”ûß]XKñmÖU‰V`N^ ­IïÀk&râ¥hƪ>ñ?ÊA•š~ªôᣣ´@…\ ƒÏ¶ÕìI¸Ó ‹ÙYì“73 Q «¾Æ,±¢)KÅ⮋:®|€É—ÚèÿR"ǧ™Vöc…G¿èß‹3×§ªî¢þåÍ*³¹ë¼÷§6’Ý1@·/ò_¸P#áŽK„V”ˆÀè*ÒÝër)>´EÐX;vst²UgY&¬t@æzâºÆÖõA¼ƒùÞSïç5Ræ7 ;5Eâ*|š°Å·ÌG:Ö~Hoù#R:$¡løìÞ÷Ü(ú—Ú¢!÷•‚ËGçÂ/Í­—J@Å–ÇÖ ¡¾?wk÷Ì»Æ `•W‹³m{ªˆFßl`½}õ/­vÜú3öZ:‚xv¨\Dð¶¥,³Ì鎋<+B„ü¯×úóZmàB]Rß}¯#µƒä©™Þ¯ÇÊÏ›è?$™DñkøúÛ"S|7ç.÷è[Vß§]M£MŸ«Ñ ù[Õµý3ã6çL:­É>3׃=¹È´xÃlݬÜКSGÓ“§±hwâB‚SesœèÞiçÒ™£;ÛÝ•Þ×ícÂ!LÜHA‡8öàæLWÇlgœwúj;æ_—(Õ„ŸhùCƒf·k„¨!FÒ¤Ôè—ü—Ñ„ ÔR°qKŒ×ÆùVE;±©¦7((£ü·8¦cQ72÷#Œ’Q÷ŽÞ¢^Ø™&6Ãèõ#¡Ço1ÛE›¶âìŠø³ýèõz޵̲j…[ĸ ðúÎWë£Ò¨v:.Ó‡Xñ˜§FËõ4±‘K;Un~>QÝ_tn¹ÃÑ0‰ˆž,Ð$ìP}z¬ûimT§›ÆT9Ì›̸­£ dg‚‰Ç;Ž»ùI‹ÕÅÇ»[íx³Óó$øô‘|ŽHnöÙëûµß‘V`Ü!wØ'TÝ48…dq§cú” C•æM{ìþUÐ\1îëûV¶Ñvõ‰M¢ƒAžöb±}qEv÷áÝúº‡Éß›^¬dÿÿk\k„t ²Ð«ãã M;ò¡]D^LH)ãèæüdÕÊjåká9•PU3Áĵ¿8ü8ùvÊÕ²™«r›Ä½¡¿ì H#é„aô9ìÖÝ(¹yfÇ®0ßOlq4õeÛÑd·÷4´e,l 2aΙ9­Æ»ínfÓâzet”>PŽ#ÏÍž¼q½Q£ýžŸLãŸÕ[ð¶Ôó¡¶—ÔÑÜ¢’¯åjXÆ4mq‚½-ÆJ<õu'ý牟B¾/^“L§æï‹˜d"Iæü؇@ J°¡î¦ÔªWðg3h‹òÐo3Š´ñðVñ¸ŠECJ2áoQgçXìTAû´m@‰eOáý×™aôÍT±Ì '/®8“”‚âàA’–±z8A]ûßG*Æãjÿ;w¦b„ü^²Î!^ …ˆB(5]x¥ü ›¯P±¸·òÇE¶p£(’!Jl*蘺áZ—5ð)àÊûG‡é¸Î &ùù¡UôC3Nô©(eЬÇ TÚ+€DW0 ËŒ{…¯©.3: ¯üälðÃS¯ ›eð•)þô;‡ñeÕ+ù{á >ú”ø±wL!!úÝ«Ìh‚Æ^³~>5â"a*R`{`ûóeC“Æ |˜“>25~ImfK Zú ‘P8‘•Dh“Dàm¦'€pmœíM³OzWãoÞ½…4ÀVK§’™`b‘L“ ¿+R«ßÇb}Ü,8)b&S—~ü«KþÜt!½á1.ÙbÏØDR·àÅÚ‰%5…”ÓLT(c¹Uý¢XOQžŸ¶•Ykuý„îM d¿-Jw<„¶–t5Ì æ:`žSüGÌr?â8zÙ³gN6® Œê“¨ñ«h ÅXt°5Ò¹{~ÿ˜ÝêRÆžòëº#ôÀüY±b o ûË´­‡£[O•'ÈV £ø¿ˆ^ïÃÖY6³¹µ5ÇOZax›e„¯>½ õުĮä3I Â;÷µ»øÈˆxßdõ_“VAjjåzÉ{X'ºÃ$XÂZ&®ÐºLa=ÊÓ'(¤k3þµ£^`–Bæ1Ö$I÷HÓìXØö’Æe7¶]?COí*bå†\v_æ3Â8,Éo gHËy€áâÂOhè<‚`¿‚×’( Þ¼!>AÑn¾ÎÆšnÒ-g¹ÞPO«(æD ž6hµ‚ì|È—¦çvííFðصYgåŒI{ξ¯Çô])<üêúxúËhv ¸Ý²'Xi˜>@åmšö;ÉçLø&ì§Ï–¢›"](vlxª”zá!÷ºŽ+2"ñÝü›xÈ{ê0íÞTc¡ †ÖÕ(jýOjÝsNœ+±úÏÆ;Ó‹•ºÀ½DÄâ埭?Êí[–—sSÊ„E´6zc¡=xa *o†2ï­Ò¸qCö¡kEÑv|=9p%j3Ïu²tx(&{\žŸqœdò­[&Ù!×ðÄ]e2Â×Ä*zÛ›’‘áÉ ¨Õ£UÀ•ñ·†‹èÖ0‘ÛÖëßRb ѬB,<”p,å]¾Ã¶û«Ñö² f|ƒÃX‹[¬ý^‡ÎK©ì”#]Qt'öÔ>ßÄì}æµ¶2iÌZC/§~r=‘õË#¡}(Š€!¿äAÄÊ0äÈê°dU ªlû4«q_~ÚwÍÒí‚]”?2Ò%®Ë¦‰(´MªEÞbºÖ;Pr-TƒŒˆ5~æ"5Cµ7Qéì{#;l}¿?-‘fSÑìÃ%ÄG×â¯IL€9-£¸IN}† FÇ;G¨w”MêbD>ŸPôW“¹C!µÜ@zT`?šÜ¸£y$ÐÄ9(ˆ£Þ6døÜ$zª·vˆŽÂâ÷ö©>ËvÑ,jRY q²7håh.!Ÿz>jËݬЅR6´íÕ«Dƒ– f‰0¶/l*}2#.¤_Àœ`ú)_Œº°VðèúŸÓB M}ô^Äì¨gsŽ eóÛij„Sœ~Îux¦úXùb’Oò²Yޤýé?!F¯áDÑbùýVèhÔî½¶§§Å„Cð™ør}J€A,JåWgÞgñ­¢æë혶õBïö£ª%°‡j¯aº«^dçÕk’I²ðØlÏ^û%¤«I]>“Yeé·šª›VèdptRº¹säÜ\}{†V3¸Ãu&xɸL:$ÃSÊò½yåá«ß·›¶ˆŽäÎn™E×K ú>g+Y+‚'öùê@ ¡E¦™!žæ|Ø"CK~Èö!"ò~é’[äú½ñ@mõ'KîJƒ»€rGª\¹%:(?gvúNÑ)•_{êš§¾ l)wÅñ´˜ wfSêòOº‹‹ŽÀ*žÿ¤ÙÊEª¯1€qL#JdÈiù§‚"¤úB„¸#ìëÙÜ;G ³úºÚ,Ð9sæÇÇ ~„4Óó›ŒúÄõ }Hò.¼+Eu²ø¶WäšOÙóz䤱>í.ìóÉ–˜@%$kœR9e[”¢ŒÝ€º´ùgxzA¨Š­¢4¢ƒævùZq´ZQ Êö;dô/:ŽØTnØø­Ã>úmñM¢wdR5·³"†½~>=f&þ[ý/¬1¼×7´²Ü°èm·ßD÷^­¿§uþM3µŽ¨ŒӸǑßõã´€ZîZ0Ï«ßÿ¥!ì{¦BÚîBh§l8Vk |ªÂµDECòb ªÉ¨dM=ûwεü…óQ£ôÈêÃØ@M.€Ô°Ôí¯Ô(eCZêSÇýâdVVÚÇm²!I-#wv&u\ØŽþå#›"09ýŒ<Íçä,þðR5¹,çWœ^AÅ¥ž¦õ ’ýžÜ—‹EÍ­U¡Þ£*n7Þ™ï÷6xíóGg—ErI¡§p{Õ”,ñùìcèûB³&·pOȃ?.’ô¬v#Ôñ/¢©<½Ì®ÉáËõãt5Š…¯Ù\Fë:U '¥’šI3àoq½¥—N•M©ßÖ_Bî!áÛ7 <-ìšE¤.RÊþ !¸ß˜|µ¸÷Çwtÿô—No=>ÔË-¢”\EÈ +xå3ª¾Æld㻿>´CÏ¡Ö /‚H®åªþ¬¾±Å=º;Á5m…§Q…ܨӳ¾Ó[­7Ò…ä¶ZNò¡®kxV·4Kå“óгå—Ð>ý{– Û³Åª¿‹Þ•Áw´ù¨£·p#ó¸’”btÂE&QPÊÈê*Oxð¡÷‘,^‰°‡1Í=ï^7¶Ð°‘Iúĺü0a[ 7ëc…|¨»!Ýs5êÈV)è.o­í› ÆÐÏ™Íî·J´=cãòEŽ’„‚ºTó9Av‚÷¥P„=Y|’œ¾VC8“ñNTny×€@|Lƒáž£Üº›Åá0¨_ë!*寞YHtb;o=¦Ø ¼{¾¦™µu(\ׯ#)pN—kIJÑ $p×»•'gàÖ¶¦ô9lÜ„ Ç[5IU«' 6$½§…2¨“û QônÕi 窙̢&c!o…â®R‚Gœ;—¹)`·¹ÕB¿5wèé"%óÎA0ð¥HkZkV4rM¶+µ€šY!ÅxÐŒ3rÃI„Ð!.ék©U_ߤÉp‰#5 r‡dÈþqHù#}' ôP5ÍUzª’a7Et”;gŽ)Þ™͹ðí/®–¸šê&U9z:t ‡-_ç“Dí¨*þèåÜÞNøÏAñþ·ì«ºOe³Ä4üŸÒ§&ܵ¤~—|mb{þÉ% ð—¸WÓHý‘7 h›–iÕìàéÈ0xvº‰||ÊÊ‘bN`À•1wë2ì*`¶Y¾Vþ茶”|¼;Kh±LLÒÇ>z”×9h¯þŠë§Bfž%«71‰ûãFg  ƒ+ŒEmm`ù/·Ù»"“ÐÃߕžôqi…ÐÅŸsƒd›d¤¶Œ£ãÑ ¯bÊ5—·Î,˜–7å3€@à^Ê2³ó‡ÑWßaZH1iqÞ’‹ÌfÀæY‘v3`Q£ ûøÐBìñ(Ðs¨ÐÑæl`&¼yMD³E²Ò6vz™Yx~l.Gâo/ËãДSšÃÙˆŒC/w^q(¬{3löðà®ZhétËoϾX&¥öSü†³ K øÒ‹p`vØÚš `ÃKÌB6>ð;™¨~Þ´Ú“?• œfļO9b¾G'Zi&”܉ùS¥Ž@ U¥¹v9J]|éplá¡Ù)1Çj¸®…ìD8’2Í2©ÒÃZ`ÔækÝE?\pJFk¸V¯nNIÆà[Yñl[XÓÄÑ´Î<¾·ü¶B¤þnYÌÀQk‡ƒë…ÎÒ:yx‘«‹©<@†®y/ê=ã׊ £*8Z«$St{¤Ê¤k4OG\îR. ‡ý ?˜* Êv ¤6¤Ï£Û #Nª!Gz›Þøû­?[YGcq°QÖUŸS0øÛÝÁÇÆôüY@ëÏ^Ç&<¼±„jŽn'0c"_ÎYcšÄ¨Ãr{ÒØ546¬Œl«Fo"æRžI;<äãÕW5r™É‹¤¾÷ =égÊåQÊÿ¦‚¼ ŒJÐBãQ– tŒûY6M%³Ñ­î~ ~A4óäÁ 9"Ó`wQû³~‰É‹`Ûl£™ ,Y /$Ÿ/TêS$eÃÒËø3-ѼU2J«?›àóIˆŸáÂ$´A(Æ­¼˜œú9Ö`Ñß‘J†ÞÐÝᮢ[±ÙÛŠôŒŠÉôíäøá˜X/xÑ«9¬¼óÐ`þO| ¼vcÛÊZ}IAÖެk’péÁˆ £©ß (OØú šœ,E»{&§‚pDPïóϯi¾‡4¹qQëùi·jP™Œù&*õ¼À½ô«±rÊœ FÒD,0Û"Ÿa]ißøõ2qrh©F¯ë ƒMþÊÆ0™“†­Ñ°^YÿB]™žI£Wé}[¹¯¡ þ÷}.8väøß¾2t¾z©Åä^WGi´6ù]¥A?ø¹SªäcŠ¡¤ß=&!ìù\^Jˆ£Èó›´qÝúÌj݉†Œ”€³‡ùq÷è¡©G‘q[/òémÓ'¥2´sgŒ²“jÇjóƒ…'Ï?g!)hèN»ÔÈ{þ“½ÒåÍ™eÕ§œ~bÓìzLÑ !+p´Î—Ã}Ç)TtpJýe$ð¤ d|•›WöQTä÷Ð-VàºK@5’IeBÚ“?ð)¸ëS‡¯£ }•Hö‚Ô=•õ•À Íy+†MÉ”x;>»y½SºÙc4/÷ éxÇàD&ÕÞ·€UàÀbíÚÓØsÜ3± "+o£ÍåƒsÞ¶BDëªéQéu³.Z?Í~MÿoÕ[ÉÄÙ¼|E¨ôÌ\sgkkü[š$$ìôÔhÖ¨¾G~ˆëòh@Ñ=Ôº‹GÿÜéã\úãnÖ1oí.<ªUÛWü ìBªìý‰wÉ¡væW'˜<‹Z <š-Œ¾A.†ÃòJ¥Úž!ß3Á.‚]®ìí.ÇMÞ¤7_ýªp·n0ò1a\_QÂ>tdY[ÌÈäHh\fM¤ÊŠÄé*7âtöTÅpßø486­N˜ïÇ'pŠ¿]‚,¸æ•×ÿ0f{”=9oÕ¨"ïYåU+²»ÝMh.îEùîÜÍȘƒ+|Š !Þ*§0ŒŽbcÄβUÏÜ&sÒ*_iogÞô”¦–þ ‡N‰€Nò֮ݎ›"²ÅuËu/lÞi½‘ÿß…Ú OճϳtZ€°ë\Å}.Êõa‘h†»[UM*¬cøìòäüº[CÎÿ›˜›ƒ„ÎSÅÈ:²·x]ÏM,D6g…¡X•PH œ½jÏ>þQ‰Ê_¢=».™.R“{ææ{ÛÇY=,âr_^ÉÉ.mV¡°î)Š¿3î¶½ØÐãó¦ñÌrƒXÙú‚6þ8.ÉšþAŸŒ8·¡ËäÑ-•-CÓ‰à"¿v„£^¶ûÁš¶ ³Ý}Umú{ù R‚ƒ´•vÅ^QlþNö ˜ÚI'+/‚ùÙpq?±Úf׿½„ ¬Çm»-‹ùod?EÏmæ:€»5,TŽ ~û ÌØÂŸiñMýäÈÔš§Ñ~ òàhøe"¦nWd¨¿‹”Ö¯+FŸ¦îâ]»÷.û«I@vƒµ9‡.¹´ïtB?_­ÓÍxxíïÅ#Ÿ»½è‰™ñ¤â$´€²>0 ‹YZmixtools/data/RodFramedata.RData0000644000175100001440000001374214762772101016343 0ustar hornikusersBZh91AY&SYû³Q&ïñÿÿÿÿþïÿãÿÿÿÿÿïÿÿ›þïÿÀOÿÿÿà ¢ ¶û»‚‚¡%­hƒ|ŽQÆÀj™w¾ø0Ï‘vLAT+m ËADO0ÄÉ¡ª§øòhTÿD§¨Ð 22=M›)ú£1Fš4 SÓÕ˜€L@&@h4 =L“$4 l¡’ƒOÕ?ÿÕUL@i„ÈhˆÄÄ4i  @b4 Ñ a?Td4‰ä A4jzMOS …'…?)=@Ó@Р4m@T„Ñ  414Ðdm@ÓÔÀ¦@m@Ú†M2hhƒFCF¥)¤ž“ ÓÔÂcSh†i€& èCÓS0Œ#€L#¦L a4i„Ñ = ÃJü€ŽŸÐéÿB?ßú3Ýï5Ÿºáƒãè) 3uY£¿g[NTòø —M½p¦Îp¹òÂIkKØ÷ÐçŒl\§ŒrmD°¶šà‰|ЇÜ†{(g„fÒª•t3 ÉE W¡œî)„Öß½/M§f¢ ™ªê§ªôÅÜæ’Jh3üÄ-ÒAX‚×A<ìbÐŽb+Y $(â!¨Ñ¡„_#íæö âHÇ2QÜ |ŠÙâh'˜%(¸Qþý ƒÈ%œÕ¢Ò€ ýB_<ÏGÇêøøecX-mk»þ»/sк7en¥'©ÝKO\)nñSÔİMÜÏ7œZ Ê£\Ú9§´pu:Sx§)S3tÎÖø‰1êN¢æúprLI›PWv+àñ¼[‚Bç äå÷r|ë_Mð1«wRg“|¼f%¤õ§²»e |,\@,·ÚàCÔ¢X6Ìÿ©žQ®gþÓÍ»"$6% "êÖ7ÂŽ\ó­š’qW©öd&ñ@37 hYÜ⦬¡K_0¥B'¦åÕ¡Ôº†½ÖÉsR)Ô¦›A^J¯nOÃzÕ²ÛæÌÔïrmµµ´NGd(œ8 J.ú}·Ê¶G^Ë0t\º:˜ÉÅ£q›ÿ2©pà~Ž$¢¹ÆÅ£Ö:ºó·*u·àI¤ûÚ/'„YŽêrêyBëwV´°è¥P› rI"fy¶v˜^ž!C³HNÓ듬äã„G¼Ê± jI†"\ êaƒ‚hñ™¼Åöç–œÆ@ðba®k;» óûܼ)´^Ú:ðKû~©ñ›É°ï­©Þ(jp†…ø°0•^òl—˜*ëè·põŠ;ú¶YžÜY3Ê#±l“’¢©ô/@Aì[n¼ƒ®òT<ù$ì#`À+$„g§¥~í&x;Ȧ„§Å_ òfò¥0„Bòj>#K,ñ¢ŽYù*áÈþw^µ¼€ iÛ†”émb~ Ù­t™<Ê òæ¥h ãÅ®_],Fä‚M1dØÅò$,Xµ6ˆPØ!!÷û{{—šœ‡ŠG9ÑbO]Ñ-iˆæ±ùznQp·§b™Öò+¸[7—R“Dš¢FY¬ ¹Ý8f†çc’×ßw»¹<í'ôŽp0Dj Æt3ˆƒî«ï²ÕU3k"ð5–¡hðž:E/๧D S9äA¨\Ü]ïzAH±9 ˆÍ×éô2¦:´´h ³"‘@€ cÄöûݘ î<?!Ë캚J¶ý«H¼µ Âô%ÁU»4g]yé$,\ÐLïß3÷(;쎺·aœ‹jNwŒC%¯ìïV<¦arÏod0ŠPSV)J B ½.]Py£ NÞÍ5{ É_}5ôÜ ¾níLˆYõFô¤,—a´ bEÎgðs¥”h:º¦ãJ°;NV2†StNífž]½m*‘—–H¥ZÂί’Hôéh[Zƒ»Ìƒ¨KBÈ&ÁKrƒÈ{o‡¼˜6ó¨ºÀä2ñ›¢|ü57·±|õ^®î®¨´(Ïœ¨r“Þ@¡Bç(&¶@‘mòÁ-Û$H?·˜Øà!‰„¦ÆØ‰BŒ]í‹©S› žñ CƒøL¢Þa2A5¾™Þ°ÊVfƒÌÍ0§‡,$… è{M 韪e§Z„zL¬-jæçíÛu1ˆ„fJé’ ‰ìxŒÔÞ/IÚQ±öá> Ë¡ùâ[B¥€keÜ#ÈꔡŽg¹(Ø=¸À°Z*bbh`äØÂjB¥”Ã3߬„G0ƒB­N†dåµq.@ÈXÆ2¨äÕ‰n‡«U¡’ Ë”ùD+,ª25úvèšýqߥ“ tË:cÛ«Aó›رÓÐZ%¶Ò–å6—ŠÌºßg3kj£[¿£S5 è:QK}û×l÷±6ºÖO‹"-(A´¨Æy¼ÈQ N7³zC:Òb g¨a˜7zSö½È1‚þÚñïÕšµ‡?/_+ï,Ò wk* D³ÜòÏ€ÒÖg!ŠùÓG·½­ † ¶AôYƒÇdeÖ –= £ifS³K8Öûp„0kY­Ùƒ·B7‡YW‰GAÛQrê ÔªóγžgC½q«ä«—"‚FÌÍV,Pì–µå‰M#™b£D¨¬™´ž­Ñ„à Äóæ®IˆÃ8"ò…¥Xf›Ñ“!Ie ¨J„(;ÌÅ_£f6݈²›dÊD#†ÙÛ,ž­vš¬¨Šž0‡; ('E‰°HÚ ¾àqÎl¥‹’.ùì.q KÌM’)&@á S:XáË{‹›£×gü½¾¿À@&H̤2"dêáâ*ÅV³#'+-h¹™¹Ú †ÑÒÓ^ÃQŽ«&zÚãteg„6*¢$±)%X ŸòÇÁøbŸ|µx^+‚2eì4Þ™ØsÁfPˆ\Àqx)°±ìxpœ7Ð#ýÐ~/\U`°õýœ=™$ë³y¶î,Â'ˆkh²âd—Î¥(p뼎½B±¹‚BD^”ÚRÜ÷0âtZkÎ+@‹ˆ=Cß6Z%)ªø¼P½ÝÒ¾úY$ÎA…ÄÔŒbX 7ê  ˆ wô_µÎ£\‘ Ͻ5jUKbΤñ>ºdx?c´‡ª}ǘµ²=Üë"",1Ζ>£œ|tFyê•$ 5)w76)œùœD4•cæ9˜÷¥–’@‹:¨iÙJÑ8€DAåD°¾rT/_” "|Élõ¨Í "H‡µ@vzý©¾Ðªß:sÙç’‡ÈP€¨P޹½ ‚=žG­ë4!åeǾ×(€,Õ´ –]ä¥û“èÔÛ2¼è]SÀn¶Ô õ°‘¦:´'Ðxf³]™émÌKŪu4NiC ×k)%;%€Ðó&ÙáD_5ù€V!·wƒ¥¡™ÐS:Ú ÍÑ6ŽæáAN¼mÕ”g¶ü±Zý¼’’+zvhV.€žáDb…I˜pÆ…ˆ?BÍšhVªª„q“tÄžÄZ(ÉÇle“¦ì»-vl(ÈXfƒ¯= Wnl*M 09ª%Jç%kèÐн¢vÒõàó †Éˆ'Æ£¡|Ó–ÌìxOÒQ%œ– —ÅßÁmÆãÍ$)z¦³ðJƒ=8;»Ž ¥€ÂXrU–aREˆÆZêÝQÙ muø}!³€AÑ2ãt“Ç ¼«¯r˜ C&räøÊ¹»Qõ¸)¨³Ê!ÔI„J×lÎUm©®ÙÙjPý cÝQ:«v·€ èäoYA|NP©ðI¢lqó²Ð’§8í^µ9:KÞ© ç%(éÔ82Rö¯øF7ÃipÏîì´ÏTOnb±+ü›ÉŠëQcQq%9æn<9•Äþ‹´@¢ ÎÑÆ.{&±Aœ1*jÁ`ÊÒ¾3‚nK;ˆ}ÃMËZZ»SîS<=5lfä”÷u&g‚•@Î2 ( ”XrSáÕ¤˜úžgÕúÛÛü 8Zñqò6åæçèéêëoÙÛÝÞá˯~>O€õHð yúz¾ö÷ÿ=ÿûÿ¾‡ÿÿ½çÅêô€»„;É@Cúó|Ö‚FhÐA-üŠ(¢E÷0à 0Ãcccc­M ne¾… "£ÖÍÛpCÁ´-3+,›ï¥iNiŽFfY™™iZbdJRŤ¨¹"™%.BÓ–@™…C¨$rib U¤'HLa¦€Šª„×…Èi‰¥(D]âÙP4Òëh首„4é&CT”¨ÒRÐÓ@"é J&¼£¯ šB#¨ Tº¡PÖÒÈ…]¬­ ”šð†@®©P¡ÉZ¡DˆDi R)¡TF……JaD "H&ïŽ)~ÁpË,²Ê”¡&”d‚dÝëZ×éYZÔ“ZäòÁ Šª©UUH"ªªAUUT’I$’o½iJRûï¾ËëZ’k\oŒÉ$’I$’I$’I7Þ´¥)}÷ßeõ­I5­Ï"I$’I$’I$’M×,ç9Ýu×YukRMj×H ®iÎsºë®²êÖ¤šÖéåºmkUÆ0‹Þò"|A­k\cÆ1{ÞDOˆ "ZÖ¸Æ1‹ã¦˜ˆ¦ˆ "¥)QŒcœç@Ìß@D>7rœ'ãÀÕÀ‰BP”%,u>ž!¹:3ì­ìÔ¯là )J…¥Zˆ%iiR†‚†‚JQh¤ „2R€F”iJ… B(F hP(D)i(T B…h ¥6ð "Õ*4¢R*P†’¦HÒ‹B…4&Y H… P…"}¾ÓMÐ_æMÅijÖÏ‘¾ãÔú}ÎójlõâwÉ7oÒ… .@´-Ž*™" !T%4%*4¢…*4¢P ”%”4B”oò®JÒ4!IJHP5TÄ T-#J”4¥!J)’…B™@ (RRR1´¥ P…Ð…DŽB&Bá 9 R -´”$B”@P% d†CJS™)Hºá+@R*¨©ò¾3W£ÜÈÇÚwÿ9º½ß5þ¯>†îY9J#5¨ØÕ؈(åÚV¶ab²ÍO|ÆÄ ‚³öû‘H26pÌB`O§ØxO[ÜÁ×(â ž?re'ÓB¸z¡Ý~_7o >–Iz;PGë•*¤@¼®Ïm ;Údü•‡Ñ¬‘ÛA¾´»qÄØžÒ…$§4È’Ïaº% É·AgÁÙRÅ#”Ç v,_MKCG!µ’G“ÁfLÇ<ª¦Ñº$;¿R3ÕŸX¤Qo/zØÑÀEN‹ÖÇä]6ôÛSUM µRY¼²ƒ°t`±GÖ*©-HÖj~%T73žÏŽ3 å•hoÎõY¬òÌ n.qZ ":P±XijIÍ—Þ¨i¢­b1íâQ¢e¦mOèÒ,•i$ð×$S‡C»E# Œå$pÙ\’“ 4–FØ“+$¨ü*î‡w&Mnuo›y*»†V0òêÝËä4u4šiS·¯–!uTÑ– μ+`W~lÜ;ÔÉÓjpE…Ít Õ#³VÃålõGßBt üˆaÈŸN­c”—ÀoQD1º|³/ôb™¢\ƒ¸`³LÒt@œÙËŸ‚VÔ`sÎ)Ã2­…-­-#AµSI I zs%¡I8ᘠXªT¡J“-”7uϘ¸ œ ’b­l‚SœÂøÛC¦ÂÂ’ˆxOÈ3Š×ÌGºñ(ˆÃB†ñ›yb JмÛF¶xG»\HÄØkŸA ¶†15yõ)A2ÔÊ'6£HÉ‚iÈ và§õ°Þ/‘˜X$0ì&ÞøS‰QIe|ÐH}ÁB[û“ÞÖ‡«)¨›….Ógc¯PC9#VÅöäžÁÔîì)W3ΚüÔô†"!9ó3†)¹K TúYš‚‰:Òu‰d8•I?`‡~$JÌqÆHˆz¦c´±Ë»bËÓn¥Q𑺠Rg­ ‘Gb k2« æÚ:ò§©™4=”UŠgÄIiWZº/K™dØei³DèIAzª¡ÍD/ƒÃÎ{¶¿b£„–!Í:ƒÜ?Áà<·Re0]îo½Û™À{õ²y¥&u0€ê)ö’¥ÅÞå§ëI^÷b.ŠûˆÉ5ïÑåÂØ(®‰fÅ`Àr ¥(f C­¬J”†ÿSð£{6ù‰‘HJµ$f¼6µŠÈwxÔí¦–„§,f½•íâË"SzÅeVsk<.L ¶²­D±¯Ef?|­¡z_Ã$RÛzÍ4!Vöú~êW¾<=e•²;vÔ£Že’Äm¹‹fhÁ½Ë Õ&ft°$äg ô먾,v…¹Ý\î€;…˜…ü&<E­‡xÜ Ç™â|ÃÍx°rmÏSr²à°X§%3­Öiv\„WŠž²-ó"ÝÈÌDv–£³Ú è4Û´YÁí¢DesŠèLáñðtغ畜Nã{ŒƒÏyò”wùI×Þ‡ 9@=†‡êåêN%’ˆâ^±Õ€†±®²Ð—5&}I2ÌtUäyã4åÙ`Ì(hóSžòHcQëº L$Aë§©ŽŠNl™™ŽZ¤¾)òwÎö+ÎË­íXlƒ\Y}Š>±¬±“YÞ@bößM¤½]->“àp³6Y+/HµmuÍH*¶›x‹o~¥°¸‘µ 9ÍQfØ“à g#R 0!f÷ßxEmò¸ÕÌ$GJp¢”‡#Q'Y§Ñ£=¨©j0-l­2©F¸,½ezÚÄ5ƒèÍM–GÅ*À³EÆÕ°%ß ÖÖ žZ­H( €{wäæ´Bz1Ý5Å3¶Äù«TN–§{¨l¿4[§Œ]II„~b…‹Ä®…´yôŠÔÁõ0ìX%.f)k̺âã>ÊÛ; ðX¦ÛêZ׈âu*˜@†»3›_iE«{±Kd·ûç1ÏΕ¤@º‹cÆÌ—&“-³Ëm.nböÝšÓ’Cz)qÙ ™^í‰#‚w($XE¤c.=X©"!2§ÐóEQè 1k Zí:GFµ4ª œEÖÇoLó@¤šSo”ð}`"lx@EA ìí[×t œq´¼,sw ­²ŠÐL73EDµÊÌ*ݪµÆ/l^>)”Å×9=déQ3Ú Í ƒŽhÇ–+”ˆ¦I–W¥éÉ’eŠØ“V…&Qí·T—¨B›[E¤(ËL€ïµ·>u¾d¬ÅôæÜ–Å¡“ @7RFÂÃa¤(€#ã¥`„AwHí*9‚qÑ4î÷ºç·Og‹Åµ£Ü™ûQâÛÈ2•¸œø¬u×­›ŽTWk:$¥¹¢øán^1ífÜËq_ “`dÁÚž*¢Ã"·¤©Œz|1²·ËE•².ø»’)„‡ÝšˆÀmixtools/data/CO2data.RData0000644000175100001440000000120014762772101015211 0ustar hornikusers‹]”MlAÇP°µ¶Vñƒ¢6`8ÔZZ d¶« ]ØHL/á„¥Rü<šxö¬W={1&=뵞{3éY^ê±:³óÞ«a’·ó{3³ÿÿÎÌËÚåµBŒ1/óùåÓèóʇ‡ùXPö§J5þ¨=j3fœ—©š?+#"RþèÞæÏ7br+qôõí–ȧÜ&Ê/ähtOijºO‡C…â¶|„ OD>¢×¯B>£²Ä!&öeû.2wB¬šZ?ÿCu×ÄM¥¶ùKLƒ_tR‡ëŸf_ŠÜo­—}-厾‰àö¹Ÿa‹…Ïúûr_´ßÚ‚ö ¨×v>ŠÔ;ÕÞ Ã•«Ð>oõÜ&¦`é}ýÞ}B÷òJ'Õ>áng€ÏɘvË€1¥tÁ-Æüª$d¨’9## cÎê´Œ)JOÕŠrËPetYÕ•Œ+2®Ê¸4Vf~÷Y·¿ Î5ŠNñŽy±T´½¥ ÑCœ.›¡µè3«¶‰Ãf£Ž¸Vµí"âº]B¬ÔÈ·âÐÚj“FïIl£f#Þ7[ˆz-úÈZ£‰X?q¨ŸØ´uoã6’rpg†Ó(ަ¿ÓoïâaÒ÷ÚÑ`(éx|ùvûq—tíKþðwÐ<Ý _Ž)‡ƒç‹ÿ«à z’¨àI!¤–V2Y„î;¹D”$âD)¢4Ñ2Ñ Q†(KDœ<8ypòàäÁɃ“'N<«ÏËø;v'!õk]ì åÉé{aÇÿù¦qÏ“mixtools/data/WaterdataFull.RData0000644000175100001440000001153014762772101016542 0ustar hornikusersBZh91AY&SYjäB Akÿÿþ{\\UÕÿÿÿÿà?ž€PÀ@ àÜ» (@Š@p6žøxøî¨$w€ð=T ªxLÉ“@&F¦L¨êE<@ †L ¢z§ªmFô£È=F@jŸ¢= @ÐÄhb0Éê $õJTÒSjmFFLÈÄb0#44`£ÓE$‰¤2zj0FLaŒ é7ª<24~¡m2˜$ÑI%'©´Ôf£ @‘ˆ€dz€“ÿ-òØÇÿ.\æºã¹Ìrå±QÍÈ£›ÝËIsIt®UslPW7s±°î®‘Íæîâ767wW7sŠܱ¹wu,íÛníÑ͹ntŹn•r× œºÜ–"Š¶Ú–ÐP?áIæ²cø¼¯“i Y`x}ƒ4¼˜ÍœíåqƒþmÁ»ëIŸ¢0KŸˆåð\ù Ïñ9i/Ú¡,"ÚÀüƒ#„cÎJžÇ¸¦D©s¨Î4ÐwÊJßfŽ£ª!Fø~zæ6רIíŒF"#ñ\f`€ˆAã÷jàz4K݈@3hvm®ÍÕœkÙó`‹¸Zî/µbñÃD!ÓÞ²oåŠÁ+î-Ã9¶]LCô¾Øc²wOgiM~8­¢NYS\mæÀx™ /‘®ÕÕÃäÝr÷Æ5¬Ç†Ý¸býTŸG¿ïwÊQÛ®ˆ¦nÍÈa÷"ú›Á{z¼9øBc ßu¹¨^!„6Æ#80 ¥ÉÚ!È8áÊ{4å¿ç‰ñÕ–Õ-2>µ§¿ ;v‰œWP x2Sæz…D¨eÕ{ÓW ¾›3¥eÃɲ)mXä‘SãSŒþhÆYÊ¡ÇJê‡9Gd¬Ò:©çæK`½øhh?„ÓM…êÀûXC¶»­ õve“ØE‡v¨lò¸Ø𫵂§zò1Éó ¾*•¾6³—Š¿-–XÞµú_<û§ˆnü]/·­½ï¥µ€¼$à÷óÏ+‹ —^åÔ‹9Xe—S„¦qÀ! eá|<“nZp‰VI 2(‡”ÀéÀ³Z‡|0t<ßÔöEܶ]Ⱥ¦bkÞ[l²Ë:ñÌá|áÎŒ¼(öw¤«k.ÝšlXæFv!e–X:p®:®ÕäjÌkù¢¡­êã*Àà ã#D0ÀÀ™Á«¥s¢SÕTm0£fŸýý—®ó<1Âjsˆ|äÌŒ æØ*8‡&È”ËXî.]ã‹IµwS£"Îí¥õ 0˦ÝtÆû™}yÚÏpBÚ@, ¯Ä›`ßhxWœq³Ç–Z‚^1ó>::9QÖŠ×W““¬ª Ÿ¥§Y'JÇ<*1$ÁVšÖ·çª¨³Á¥< UÝ9·DœÊµÄ@XâZöª X$›ÒtÁÄ<ë{çØL´-9‹h4ÁŸlTPù¤Ñj»Xë¡¢$¼ïí‹N•€Mhj#ˆ¾øÑ6Wš²]yßLÑÖÆ¦È¦”L§dÒG£…XêÏQ¨YÁ E¦V/UìJóI¯œð×@, ¤âÎñÉЊ†37£ÃäîE#ÓÓÖ<=ûͤ[õÈïaO~M׎ZØù³ª=U€BLïÌ‘²ŒÊA‡Áž]ùÛ-WH½‘E«ö{ó9´¦‡´Â:™4ç•­=– L<ûŽ9T5 &é’… ­zùÌÌ·¼­Ÿ_D^2ï¾<ì¤qV4æÞ%4¬&&‰qü®€‘x5¼w ”ë$/ÊEM¥H欇_Iõ‚6ÜåâolÙp·ÛXg0ºä 3˜²í y.ñ$@æHïÁÓŽi(ôì%ð âê#XHE¸EJ󅯹â0+»~c7^— ÖDa½y•¹]¾•”?ô/ZÝzq¡ÓEµ˜°’®++)'ÅÞƒºÇ#Õ~QtÎ7¿Uƒ¾¼ŠÑN@ÃâYÁކ»£³åá볨뀔NŒ'„ç«b`Ø!æògßÉXÏX”Ö)gQéã'¤o,Ä9§ #!b8ñ 4(áŠI "‰ ] ŒŒZ]yÕ_XòrL†R9š<±¯AB`€'y„]nçˆ#ÉÁ‡ñH)éY‹Á1è’;{ ‰àÂÐ]E„°!Õ’„ö¼#1$Œƒ Ë4¥ò1X"d²ß'ZDðnÅ@̪xôC 1M2DË™vp.1!Û›“×=wn¾ÜTÏY5+QJ‘¾ÀBÌÂÙhä°äV–kã·Ÿ7ý±ÅÃÍv(ge“¡ª/3Gˆnr³vQø¤e¦º]=r½Ê®·ÁmÞ† íÏÚuÜ%Ï,½‘ÒžuHk2ŽmÀJ,Eâ€~‘Š÷eYp§p÷M„MIFÆL9ºyµ×9ë)Ué.Nôë&ˆáiôžÃÐ[¸K·E-pj"‹U¤L5¡ebWËr”°ND0Ä”èŸÌÌ 5Nm¡6ŠÂt„”Å»+Z¦•ãY@  FøXŽžKºwÀŒ°â¢ó¿*Õ.Ƕ45Þ‡,Hh¤„SI)±tM ×Àah /•L+%E±Á3gÚ^ÏUÂå´„)c ã>b|Ì´ì! Q½5ÃT8u]ÀÚœ˜Æ®Q‡%ªß$1È!!)ŠñZöÚµD¡yyÈ:´Ýݘ¾‘†¼jzÔ4ïÇ}%ê¿làÛÈ’n,Koeêð"¥ð$§NŒï"v¡\Fðx!0ÁrýT¯ßÆÚß9§CÕ=ÊÛüÝ<||D/˜Zw\³F§+«2}Ê<`£“$[¡ |3róœÂ¼TË$X¹"ãÌ€d$‰ /dºªæªt*ÜI –2 bE•”ÈÆ>U‚µ õFÇ:„…Á¯¨’PuÅ(43´’š+•ê¼g?cφ59]È©âªÄ–P9~› à³\Œær¦I-#ÕN.+¦{b0{V¬t@Ìl/Ãgx˜ïŽçQ¦îñÒ°75ß!Jäñ¤}Bj较ª©xÏ‚¥t9!ÞÑÆ¾“’ í»3êü6„S»Ë¨ *gšâ{+&Ë=>2ÉWøH95Þ4íK8ŠW´³É.’ƒƒ3•;„q´\D›'O§¯•\Š[^øª×‚ð»ëlÑPÁ´z°æk%_’EòšDšJnÆ–P‚ž‹ _„r_Ûçåd¹Ê1ÌÉ›®ËÍó6žsÛ~–žû êpfϵ±ïˆ]ÇŒ½pâñ˜y¬üÍÞ"ÛM9" „Fks–Ž7úŒÞa9¥Àyu§å„¸„˜ñ’KQ]õ÷J½â°ä3ÜúˆzšÓÌä¯Ìûòk5Ä”&p=8²«'{—KáKDãûs§»ðÕ÷f]lšìè76z!ÌÂf´[Ä@…•P/¬W]Ʀs Ëô)« ë*UDôi¿NHͳâõjóy½ik7É–+®#Q ¤ÉIÝ«;Gîõ™ùbóîÍó~Ô{ªw«ÜüOcËå{?÷>Òˆ”Ð’1™€™4ÌiÆ‚ˆI0a™ #AM¦”a Ñ1„Ȥ¥1)fPšI$#¢(Ä…F‚•Â眽 Ï+AÂóì«I¸Ã_(5ë©î!\‚Vdó¡Ü”ç°1¬î!¤z0¢óÚƚΠ†•2T»|×Zx ñ(œ#©¼MLtb,\««ÚÙÏ †”·RÑêàIë"–¥G¾]±.Y?-ĵíð / x‘‘)° D~z2T7ÑBCä¯À<|ŸlŠ üáQQ èZðŽì¤$ “Ô’ˆM‹Ñ*’&Q9ùÓŠÏ Šˆ}„ý@ ¥¯Ü•A<> %”šMhP²¬*ŠеU͵¶½•x­üð 1)))2 !™˜›¥˜#HÑ) °lF" d¤eŠJ“HhÁ¤Ìi#ºÕÃ[WÎjÛzʽ/C¤†BˆÉCP&lÓ ddB`ÄÆ$†£Ld ‘$E2¼¶½Ú»xa™ $F`’ˆ›2)’ˆÒRRb( Í $KiRbÔ̘¤!‘E4#@¦‘Iví\ÐÒ¬‰,DÚK*SHfiÌZÙ"‰2R‰!‚I3H!€(™FYjÆCIB`¥E”Æ&'uÁ,Õ¢£‘ °T"„*¨¥QÙ¥øªpÌ mZD©3,[0(¶¬h†È4´e @•j(h 5ƈj‚ÍF Ò[LûßûÞVF*ˆWt2*LÁ’e&Œ¼¼ø~«Õ(£l¢*Ðöþuæh¨È“EeE61,&Â5ÎʂȈ48€Æ‚j6$Qi”Ú8•D&[%Ý\1¬D¢ÔlX¥`I(€´¢ Wín» jŒA-ˆ”h©$kdf¬ÃF5ˆ² Ñ´jda¦z¬ð‰r.B³B‡l2J A·†”ÿ¨H‘jx’CÊaœa ‘OކCÅÊ*‹&C0ÚÑ9lã É¥­«ËE“ÃÖIyeH~_Óøiê7Â\Ú:»t R¨¥Ž*ªÊªcœCKŽGÕF±Çy»ÞëÞéX°Õ{j½§ô-íÛ{H FŠU´‡‰+"‡VŠÿ+Ó ÉÅr,™¨ù;Ì-°<=‡ä½É0앚ؤ¬Öލ• JI’fVBü + ʦjdÌÌ+À×*åÓªõ+ÙoD•½& ¢±âXL…E&íC®¯d!^­€«tõ£^Ûº|þ«z*ñEÉ È2ví-³ŒRH¡3™%dY+g$’-T¾5Ù¼´˜m¢Ì‹ ²Hg6”’ë¦Bá“$¬!• ÚRk@Ì$‚…bÃ%5©-¤$É2¤+ÅDC2f’PS¡¨E€E©ÌQH°ÖÁ@ì…å%e`³‰™X µÍâé·ŒEk›\‚Þ.fZ6‹xÜÚ-Ën…¹¹<óÍà€ÜŽh¶ñ¹^ÂÜ‹×ݯF]Ú4`Œœ«Ñ«ÉŠƒ›Æð^¿:żb+›r¢ªÈ¡Ž¶Y†C²f,X)‰ Ë å ®µ{%@EE‹Ñ¹@`½MtÁbf]ܱH%¯c×w—vº)Ü×$š%¨¹ÌlOGž\½mnSP¥â»×Õºk¹oj½¥¦  j@š’›blSdi¤–mÖrf]ÒS_½ÕÖ2ÍI¤¯ä]ƒBFLlÃ!Æ©P “RjBH•‹CA´ØÙ!f¢5„ÌI¬&M b”Z1-ŒÆ²$5#jRK-FFM c%Ro”êB_ µÓB4™™BR0$‰B”™!€’H$‚@žÿr¼ŒCn8ÆÅ±j-pÛ@ ¹c“ÇšÐâVäÆfå,êðlJ‹Ð+[ÚÌŠñT:ð»3裘ÿºú¬@ÿ£¢¿HûÔU~©¨Òmõ8þ˜Î cöÙÍ ¤nÀ™gé3N­0~Z“p…ÿ PਠþçzÆ’ ÐDoÁMouRö™°>÷˜Ü 4PGŒ…ãvVÂj9=ßqrút7ÂbtKÓ¶7Rø, S0SGbÇm°Ó „Õ–•´0ÓJe}ô•hS·IKåHÂ÷Á´È¯‘µak$ð'ßGAψˆ6BM,Þ̦ı²Õ ¸E@FËVC8˜÷¤ 06¶XÚ’¼³ðùGá÷ü}?±=ë¾È}äŸSí¡QCž­“ˆ+Ë-¯¦PP+YX°Qh•¶Å3DG2¤-¹•¶Žµ‚ç3#lÚ‹- ¯G7Æó;ëåÓ3Àð-|½žž6ÝG<›«ÑÝÝ;Ýê«2 wŸŸÊªõN2) êT 2í£×1’²ÚE$×aüQ¨Fg¨…= ö<’ë12óžÕ¬šÔÝRƒìÝÂKö½CnüyUZóÊOUÈ_çl:ý’t8'áI ­Á9ÞUç!Ðù)N×AŽÞ‡c÷éüä3ï]“×5ïýÆ0ö€‰˜÷ƒL|¼ÁóßñšzðàÀûÏxcß­èš¹{f-½‹?*SJî[ÑÌü¼Ñãñ»ÁÛ}¬iJRŽëá>rö}vô)²ö¾oWœB>ñãÖö¾ïÈwÒßdŒ²¸‘÷vlØ;¯Ž@¦]þ–`Y[WCoÁꙸãs-ØõÎù¯o2RO\ßBqÒ+3Ÿœ¢pã¸Ö£ä{ ÷‰ëå÷.Ï&×¹?r­˜|ÓäÆŒüµ2à6œÄÅWWÏôp?y5¼z²Ó7ÁdåHªÌÎM^»ì8·u] euG¦Â‘KX©'‘×?¸Q™Rãk^l²ŠŸ¯Ç?û@ à Ò‚쨬„@-\ZdÃoT«BÙ æÑÓ˼’Qr,$ÈQÀɯù'Ÿd+o ùu]J†‹bz,ºSÿà&öiž=]þùlûL²››ŒLªsÓd¦ÿ½ºÈU{òw*àš‚$YØfËð•h]ÜP¢8ÓwGlšÖœåñeúfyäï%a#bºq:TB««YÐ|dR~õ Ôv¼¹²¼+Úvع´yô"“Ýÿ™TSÅ/d­’ØoŽÏªB<žlvŽ%š¢2w£C«gPòYB `Hsù}䪭Ô6c ìLnôìÕ«Ö rÓg¦Òl=sÛË«îr%UÈu~«cdr쎜³ñ^_­þd{5ȧ_,ÛÑgæ.gçßêBóA`ôlçÁgæ¬ÎTø¤yî÷?æ/ m,(7É ~Ú”1±,.ˆ¬+ ‡"ëK­cd³øqë½nC¨ÌF[cPþÞM- ‹ÄýÜÂ¥[¦Ú ‡È w‰ç¼X\˜<~ãŽ}7A mixtools/src/0000755000175100001440000000000014762772101012744 5ustar hornikusersmixtools/src/KDEsymloc1comp.c0000755000175100001440000000300614342153463015702 0ustar hornikusers#include #include /* Implement symmetric kernel density-estimation step for location mixture model with 1 component known , as in Bordes Delmas & Vandekerkhove (2006) normalization before symmetrization must be 1/(n\lambda_2)h */ void KDEsymloc1comp( int *n, /* Sample size */ double *mean, /* component 2 mean estimate, scalar */ double *lambda, /* component 2 weigtht, scalar */ double *x, /* data: vector of length n */ double *h, /* bandwidth */ double *z, /* nn*mm vector of normalized posteriors (or indicators in stochastic case), normalized by "column" */ double *f /* KDE evaluated at n vector of points, namely, x_i - mu for 1<=i<=n */ ) { int nn=*n, i, j, a; double sum, u1, u2, tmp1, tmp2, hh=*h, mu=*mean, lbd=*lambda; double const1 = -1.0 / (2.0 * hh * hh); double const2 = 0.39894228040143267794/(2.0*hh*(double)nn*lbd); /* .3989...=1/(sqrt(2*pi)) */ /* loop over each f entry evaluated at x_a - mu */ for(a=0; a /* in order to make the sqrt function work */ /* First, create the function prototype (global declaration that there exists a function called new_svalues returning void and taking these arguments) */ void new_svalues (double *z, double *y, double *x, double *beta, int *k, int *n, int *p, double *out, double *sz, double *runsum); /* Next comes the function itself: */ void new_svalues (double *z, double *y, double *x, double *beta, int *k, int *n, int *p, double *out, double *sz, double *runsum) { int i, j, l; double sum; double xbeta; double diff; double diff2; double zdiff; double zdiff2; double zdiff3; /* Create the sz (column sum of z) vector */ for(j=0; j < *k ; j=j+1) { sum=0.0; for(i=0; i < *n; i=i+1) { sum += z[j * (*n) + i]; } sz[j]=sum; } for(j=0; j < *k ; j=j+1) { zdiff=0.0; for(i=0; i < *n; i=i+1) { xbeta=0.0; /* Calculate i,j component of x %*% beta */ for(l=0; l < *p; l++){ xbeta += x[l * (*n) + i] * beta[j * (*p) + l]; } /* Subtract it from the i component of y */ diff = y[i] - xbeta; /* square the difference */ diff2 = pow(diff,2); /* multiply by the i,j component of z */ zdiff += z[j * (*n) + i] * diff2; } /* keep track of running sum */ runsum[j] = zdiff; /* divide dot product by sz[j] */ zdiff2 = runsum[j] / sz[j]; /* take the square root */ zdiff3 = sqrt(zdiff2); /* put result in out[j] */ out[j] = zdiff3; } } mixtools/src/KDEsymloc2.c0000755000175100001440000000306714342153463015033 0ustar hornikusers#include #include /* Slightly modified version of KDEsymloc.c that can handle an nxm matrix of current mean estimates (instead of merely an m-vector). This is useful for the regression case, where the (i,j) mean depends not only on the jth component but also on the ith predictor value */ void KDEsymloc2( int *n, /* Sample size */ int *m, /* Number of components */ double *mu, /* nn*mm vector of current mean estimates */ double *x, /* data: vector of length n */ double *h, /* bandwidth */ double *z, /* nn*mm vector of normalized posteriors (or indicators in stochastic case), normalized by "column" */ double *f /* KDE evaluated at n*m matrix of points, namely, x_i - mu_ij for 1<=i<=n and 1<=j<=m */ ) { int nn=*n, mm=*m, i, j, a, b; double sum, u1, u2, tmp1, tmp2, hh=*h; double const1 = -1.0 / (2.0 * hh * hh); double const2 = 0.39894228040143267794/(2.0*hh*(double)nn); /* .3989...=1/(sqrt(2*pi)) */ /* Must loop n^2*m^2 times; each f entry requires n*m calculations */ for(a=0; a /* Translated from FORTRAN code written by Fengjuan Xuan */ void mudepth (int *nn, int *tt, int *dd, double *mpt, double *x, int *count, double *sdep) { int n=*nn, t=*tt, d=*dd; int i, j, k, l; double d1, d2, d3, d5, xik, xjk, mptlk; for (l=0; l #include #include #include #include // for NULL #include /* FIXME: Check these declarations against the C/Fortran source code. */ /* .C calls */ extern void mudepth(void *, void *, void *, void *, void *, void *, void *); extern void KDEloc2(void *, void *, void *, void *, void *, void *, void *); extern void KDElocscale(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void KDErepeated(void *, void *, void *, void *, void *, void *, void *); extern void KDErepeatedbw(void *, void *, void *, void *, void *, void *, void *); extern void KDEsymloc(void *, void *, void *, void *, void *, void *, void *); extern void KDEsymloc1comp(void *, void *, void *, void *, void *, void *, void *); extern void KDEsymloc2(void *, void *, void *, void *, void *, void *, void *); extern void multinompost(void *, void *, void *, void *, void *); extern void mvwkde_adaptbw(void *, void *, void *, void *, void *, void *, void *, void *); extern void mvwkde_samebw(void *, void *, void *, void *, void *, void *, void *, void *); extern void newz(void *, void *, void *, void *, void *); extern void normpost(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void npMSL_Estep(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void npMSL_Estep_bw(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void npMSL_Mstep(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void npMSL_Mstep_bw(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); static const R_CMethodDef CEntries[] = { {"mudepth", (DL_FUNC) &mudepth, 7}, {"KDEloc2", (DL_FUNC) &KDEloc2, 7}, {"KDElocscale", (DL_FUNC) &KDElocscale, 10}, {"KDErepeated", (DL_FUNC) &KDErepeated, 7}, {"KDErepeatedbw", (DL_FUNC) &KDErepeatedbw, 7}, {"KDEsymloc", (DL_FUNC) &KDEsymloc, 7}, {"KDEsymloc1comp", (DL_FUNC) &KDEsymloc1comp, 7}, {"KDEsymloc2", (DL_FUNC) &KDEsymloc2, 7}, {"multinompost", (DL_FUNC) &multinompost, 5}, {"mvwkde_adaptbw", (DL_FUNC) &mvwkde_adaptbw, 8}, {"mvwkde_samebw", (DL_FUNC) &mvwkde_samebw, 8}, {"newz", (DL_FUNC) &newz, 5}, {"normpost", (DL_FUNC) &normpost, 10}, {"npMSL_Estep", (DL_FUNC) &npMSL_Estep, 15}, {"npMSL_Estep_bw",(DL_FUNC) &npMSL_Estep_bw, 15}, {"npMSL_Mstep", (DL_FUNC) &npMSL_Mstep, 13}, {"npMSL_Mstep_bw",(DL_FUNC) &npMSL_Mstep_bw, 13}, {NULL, NULL, 0} }; void R_init_mixtools(DllInfo *dll) { R_registerRoutines(dll, CEntries, NULL, NULL, NULL); R_useDynamicSymbols(dll, FALSE); R_forceSymbols(dll, TRUE); } mixtools/src/mvwkde.c0000644000175100001440000000630714342153463014411 0ustar hornikusers#include #include #include #include /* Simultaneously calculate m different multivariate weighted KDEs (mvwkde) 1 for each component, for a fixed value of block index l, and same bandwidth for all components (option samebw=TRUE) final value is a (n,m) matrix f where f[i,j]=\hat f_{jl}(u_i) */ void mvwkde_samebw ( int *nn, /* Sample size */ int *dd, /* Number of coordinates in l-th block */ int *mm, /* Number of components */ double *h, /* bandwidth d-vector */ double *x, /* data: vector of length nn*rr */ double *u, /* data: vector of length nn*rr (u=xfor now, ToDo for any u!) */ double *z, /* nn*mm vector of normalized posteriors */ double *f /* nxm matrix of weighted KDE - multidim */ ) { int n=*nn, d=*dd, dn=*dd*n, mn=*mm*n, iu, ix; int kn, jn, id; double tmp1, tmp2, sum1, sum2, xik, uik, hk; double c2, det_h; /*const float const1 = -0.5;*/ double const2 = 0.39894228040143267794; /* =1/(sqrt(2*pi)) */ /* computing the constant from bandwidth matrix and d */ det_h = 1.0; for (id=0; id #include /* Implement symmetric kernel density-estimation step for location mixture model, equation (20) in Benaglia et al (2008) */ void KDEsymloc( int *n, /* Sample size */ int *m, /* Number of components */ double *mu, /* m-vector of current mean estimates */ double *x, /* data: vector of length n */ double *h, /* bandwidth */ double *z, /* nn*mm vector of normalized posteriors (or indicators in stochastic case), normalized by "column" */ double *f /* KDE evaluated at n*m matrix of points, namely, x_i - mu_j for 1<=i<=n and 1<=j<=m */ ) { int nn=*n, mm=*m, i, j, a, b; double sum, u1, u2, tmp1, tmp2, hh=*h; double const1 = -1.0 / (2.0 * hh * hh); double const2 = 0.39894228040143267794/(2.0*hh*(double)nn); /* .3989...=1/(sqrt(2*pi)) */ /* Must loop n^2*m^2 times; each f entry requires n*m calculations */ for(a=0; a #include #include void newz (int *n, int *k, double *V, double *W, double *z) { int i, j, l, ind1, ind2, nn=*n, kk=*k; double sum; for(i=0; i< nn; i++) { for(j=0; j< kk; j++) { sum=1.0; ind1 = i + nn * j; for(l = 0; l < kk; l++) { if (l != j) { ind2 = i + nn * l; sum += V[ind2]/V[ind1]*exp(W[ind1]-W[ind2]); } } z[ind1] = 1.0/sum; } } } mixtools/src/npMSL.c0000755000175100001440000002730414342153463014110 0ustar hornikusers#include #include #define MAX(a,b) ((a) > (b) ? (a) : (b)) /* In the npMSL algorithm (formerly NEMS), it is necessary to store the values of each f_{jk} density on a univariate grid of points, since the E-step involves a convolution (which means that it no longer suffices to store f_{jk} only at the data points x_{ik}, as it did for the original npEM algorithm of Benaglia et al). In the M-step, we must set each f_{jk}(u_a) equal to the sum (over i) of p_{ij} * phi((u_a - x_{ik}) / h) / h, where phi is the std. normal density which gives the normal kernel with bandwidth h. Thus, the M-step involves four nested loops, one each for i, j, k, and a. In the E-step, we must set each p_{ij} equal to K * lambda_j * N(f_j)(x_i), where: -- K is a normalizing constant ensuring that sum_j p_{ij} = 1 for all i. -- N(f_j)(x_i) is the product prod_j N(f_jk)(x_{ik}) -- N(f_{jk})(x_{ik}) = exp{integral of (1/h)*phi((u-x_{ik})/h)*log(f_{jk}(u))du} -- that last integral is approximated by the sum (over a) of (normalizing constant)*exp((u_a-x_{ik})^2/h^2)*log(f_{jk}(u_a)) Current version: with underflow handling in the E-step and block structure, */ /* ********************************************************** Version allowing blocks of conditionaly iid coordinates: f is now a ngrid by m by B array of f_{j ell} values on the grid note: *BB is not used here, but remains in the parameter list for consistency with the npMSL_Estep_bw() version which needs it */ void npMSL_Estep( int *nngrid, /* size of grid */ int *nn, /* sample size */ int *mm, /* number of components */ int *rr, /* number of repeated measurements */ int *BB, /* total nb of blocks (not used in samebw version) */ int *blockid, /* r-vector (b_k) block to which belongs coord k */ double *hh, /* bandwidth */ double *data, /* n by r vector of observations */ double *grid, /* grid points */ double *f, /* ngrid by m by B array of density values on grid */ double *lambda, /* current vector of mixing parameters */ double *post, /* n by m matrix of posterior probabilities */ double *loglik, /* scalar value of penalized loglikelihood */ int *nb_udfl, /* nb of underflows log(0) cancelled */ int *nb_nan /* nb of nonzero K()*log(0) cancelled */ ) { int n=*nn, m=*mm, r=*rr, ngrid=*nngrid; int i, j, k, ell, a; double sum, conv, xik, *fjl, two_h_squared =2*(*hh)*(*hh); double Delta = (grid[2]-grid[1]) / *hh / sqrt(2*3.14159265358979); double t1, expminus500=exp(-500); double epsi=1e-323; /* smallest number; maybe machine-dependent ? */ double epsi2=1e-100; /* assumed small enough for cancelling log(0) */ *loglik=0.0; for (i=0; i epsi) { /* no underflow pb */ conv += t1 * log(fjl[a]); } else if (t1 < epsi2) { /* assume kernel cancels log(0) part */ *nb_udfl +=1; /* count underflow replaced by 0 */ } else *nb_nan +=1; /* kernel *may* be not small enough ! */ } conv *= Delta; /* Delta is the normalizing constant */ conv = exp(conv); /* conv now = Nf_{jb_k}(xik) */ post[i + n*j] *= conv; /* numerator = lambda_j*prod_k Nf_{jb_k}(xik) */ } sum += post[i + n*j]; } *loglik += log(sum); for(j=0; j epsi) { /* no underflow pb */ conv += t1 * log(fjl[a]); } else if (t1 < epsi2) { /* assume kernel cancels log(0) part */ *nb_udfl +=1; /* count underlow replaced by 0 */ } else *nb_nan +=1; /* kernel *may* be not small enough ! */ } conv *= Delta; /* Delta is the normalizing constant */ conv = exp(conv); /* conv now = Nf_{jb_k}(xik) */ post[i + n*j] *= conv; /* numerator = lambda_j*prod_k Nf_{jb_k}(xik) */ } sum += post[i + n*j]; } *loglik += log(sum); for(j=0; j #include #include #include /* simultaneously calculate m different products of KDEs, 1 for each component, as in equation (8) of Benaglia et al for a fixed value of \ell. If r is the number of coordinates in block \ell, then each final value is the r-fold product of KDEs */ void KDErepeated( int *nn, /* Sample size */ int *mm, /* Number of components */ int *rr, /* size of current block */ double *x, /* data: vector of length nn*rr */ double *hh, /* scalar bandwidth (compare to KDErepeatedbw) */ double *z, /* nn*mm vector of normalized posteriors (or indicators in stochastic case), normalized by "column" */ double *f /* nxm matrix of KDE products */ ) { int n=*nn, i, ii; int rn = *rr*n, mn=*mm*n, jn, kn, kkn; double sum1, sum2, tmp, h=*hh, xik; double const1 = -0.5 / (h * h); double const2 = 0.39894228040143267794/(h*(double)(*rr)); /* .3989...=1/(sqrt(2*pi)) */ for(jn=0; jn #include /* Compute the matrix of "posterior" probabilities in a finite mixture of multinomial distributions. The algorithm used is fairly safe from a numerical perspective; it avoids over- or under-flow as long as the values of sigma are not too large or small. */ void multinompost( int *nn, /* sample size */ int *mm, /* number of components */ double *loglamcd, /* n by m matrix of log(lambda * component density) values */ double *post, /* n by m matrix of posterior probabilities */ double *loglik /* scalar loglikelihood value (input value is a constant, which is modified before return). */ ) { int n=*nn, m=*mm, i, j, maxj; double sum, max, *loglamcolumnptr; for (loglamcolumnptr=loglamcd, i=0; i max) { max = loglamcolumnptr[j]; maxj = j; } } sum = 1.0; for(j = 0; j #include /* Just like KDEsymloc2.c except that we do not symmetrize. This works because the assumption of symmetry is not necessary in the case of regression, where the (i,j) mean depends not only on the jth component but also on the ith predictor value */ void KDEloc2( int *n, /* Sample size */ int *m, /* Number of components */ double *mu, /* nn*mm vector of current mean estimates */ double *x, /* data: vector of length n */ double *h, /* bandwidth */ double *z, /* nn*mm vector of normalized posteriors (or indicators in stochastic case), normalized by "column" */ double *f /* KDE evaluated at n*m matrix of points, namely, x_i - mu_ij for 1<=i<=n and 1<=j<=m */ ) { int nn=*n, mm=*m, i, j, a, b; double sum, u1, u2, tmp1, hh=*h; double const1 = -1.0 / (2.0 * hh * hh); double const2 = 0.39894228040143267794/(hh*(double)nn); /* .3989...=1/(sqrt(2*pi)) */ /* Must loop n^2*m^2 times; each f entry requires n*m calculations */ for(a=0; a #include #include #include /* simultaneously calculate m different products of KDEs, 1 for each component, as in equation (8) of Benaglia et al for a fixed value of \ell. If r is the number of coordinates in block \ell, then each final value is the r-fold product of KDEs */ void KDErepeatedbw( int *nn, /* Sample size */ int *mm, /* Number of components */ int *rr, /* size of current block */ double *x, /* data: vector of length nn*rr */ double *hh, /* m-vector of bandwidths (compare to KDErepeated) */ double *z, /* nn*mm vector of normalized posteriors (or indicators in stochastic case), normalized by "column" */ double *f /* nxm matrix of KDE products */ ) { int n=*nn, i, ii; int mn = *mm*n, rn=*rr*n, jn, kn, kkn; double sum1, sum2, tmp, xik; double const2 = 0.39894228040143267794/((double)(*rr)); /* .3989...=1/(sqrt(2*pi)) */ double const1; for(jn=0; jn #include /* Implement kernel density-estimation step for location-scale mixture model (17) in Benaglia et al (2008) where each component and block has the same shape but may differ from others by a location and scale, implementing equation (18) */ void KDElocscale( int *nn, /* Sample size */ int *mm, /* Number of components */ int *rr, /* Number of coordinates */ int *blockid, /* r-vector of block numbers */ double *mu, /* m by max(blockid) matrix of current mean estimates */ double *sigma, /* m by max(blockid) matrix of current stdev estimates */ double *x, /* n by r data matrix */ double *hh, /* scalar bandwidth */ double *z, /* n by m vector of normalized posteriors (or indicators in stochastic case), normalized by "column" */ double *f /* n by m matrix of KDE products */ ) { int n=*nn, m=*mm, r=*rr; int i, j, k, ii, kk, ell, ell2; double sum1, sum2, tmp, h=*hh, u; double const1 = -0.5 / (h * h); double const2; for(j=0; j #include /* Compute the matrix of "posterior" probabilities in a finite mixture of univariate normal densities. The algorithm used is fairly safe from a numerical perspective; it avoids over- or under-flow as long as the values of sigma are not too large or small. */ void normpost( int *nn, /* sample size */ int *mm, /* number of components */ double *data, /* vector of observations */ double *mu, /* current vector of component means */ double *sigma, /* current vector of component stdevs */ double *lambda, /* current vector of mixing parameters */ double *res2, /* n by m matrix of squared residuals */ double *work, /* 3*m-vector of workspace, which will be broken into 3 parts */ double *post, /* n by m matrix of posterior probabilities */ double *loglik /* scalar loglikelihood value */ ) { int n=*nn, m=*mm, i, j, minj=0; double x, r, rowsum, min=0.0; double *LamSigRatio = work+m; /* Second 1/3 of workspace, for frequently used constants */ double *logLamSigRatio = work+2*m; /* Third 1/3 of workspace, for frequently used constants */ *loglik = -(double)n * 0.91893853320467274178; /* n/2 times log(2pi) */ for (j=0; j a$lambda[2]) nblabsw <- nblabsw + 1 for (j in 1:m) { for (k in 1:r) { ISE[j, k] <- ISE[j, k] + ise.npEM(a, j, k, dnorm, lower = mu[j, k] - 5, upper = mu[j, k] + 5, plots = FALSE, mean = mu[j, k], sd = sigma[j, k])$value #$ } } } MISE <- ISE/S print(sqMISE <- sqrt(MISE)) ################################################### ### code chunk number 20: summarygauss ################################################### summary(a) ################################################### ### code chunk number 21: plotgauss3rm (eval = FALSE) ################################################### ## plot(a) ################################################### ### code chunk number 22: gauss3rm ################################################### pdf("gauss3rm.pdf", paper="special", width=10, height=5) par(mfrow=c(1,3), ask=F) plot(a) dev.off() ################################################### ### code chunk number 23: true5rm ################################################### pdf("truepdf5rm_block1.pdf") par(mar=0.1+c(5,4.2,4,1.5)) x <- seq(-10, 25, len=250) plot(x, .4* dt(x, 2, 0) + .6 * dt(x, 10, 8), type="l", lwd=3, col=2, cex.axis=1.4, cex.lab=1.5, cex.main=1.5, main="Block 1", xlab="", ylab="Density") lines (x, .4*dt(x, 2, 0), lwd=4, lty=2) lines (x, .6*dt(x, 10, 8), lwd=4, lty=2) dev.off() pdf("truepdf5rm_block2.pdf") par(mar=0.1+c(5,4.2,4,1.5)) x <- seq(0, 1, len=250) plot(x, .4 + .6 * dbeta(x, 1, 5), type="l", lwd=3, col=2, cex.axis=1.4, cex.lab=1.5, cex.main=1.5, main="Block 2", xlab="", ylab="Density", ylim= c(0, 3.4)) lines (x, rep(.4, 250), lwd=4, lty=2) lines (x, .6*dbeta(x, 1, 5), lwd=4, lty=2) dev.off() ################################################### ### code chunk number 24: parameters5rm ################################################### m <- 2; r <- 5 lambda <- c(0.4, 0.6) df <- c(2, 10); ncp <- c(0, 8) sh1 <- c(1, 1) ; sh2 <- c(1, 5) ################################################### ### code chunk number 25: generate5rm ################################################### n <- 300; z <- sample(m, n, rep = TRUE, prob = lambda) r1 <- 3; z2 <- rep(z, r1) x1 <- matrix(rt(n * r1, df[z2], ncp[z2]), n, r1) r2 <- 2; z2 <- rep(z, r2) x2 <- matrix(rbeta(n * r2, sh1[z2], sh2[z2]), n, r2) x <- cbind(x1, x2) ################################################### ### code chunk number 26: npEM5rm ################################################### id <- c(rep(1, r1), rep(2, r2)) centers <- matrix(c(0, 0, 0, 1/2, 1/2, 4, 4, 4, 1/2, 1/2), m, r, byrow = TRUE) b <- npEM(x, centers, id, eps = 1e-8, verb = FALSE, samebw = FALSE) ################################################### ### code chunk number 27: plot5rm (eval = FALSE) ################################################### ## plot(b, breaks = 15) ################################################### ### code chunk number 28: plot5rmcommands ################################################### pdf("npEM5rm.pdf", width=8, height=5) par(mfrow=c(1,2)) plot(b, breaks = 15) dev.off() ################################################### ### code chunk number 29: ISEnpEM5rm (eval = FALSE) ################################################### ## par(mfrow=c(2,2)) ## for (j in 1:2){ ## ise.npEM(b, j, 1, truepdf = dt, lower = ncp[j] - 10, ## upper = ncp[j] + 10, df = df[j], ncp = ncp[j]) ## ise.npEM(b, j, 2, truepdf = dbeta, lower = -0.5, ## upper = 1.5, shape1 = sh1[j], shape2 = sh2[j]) ## } ################################################### ### code chunk number 30: plotISEnpEM5rm ################################################### options(warn=-1) pdf("ISEnpEM5rm.pdf", width=8, height=8) par(mfrow = c(2, 2)) for (j in 1:2){ ise.npEM(b, j, 1, truepdf = dt, lower = ncp[j] - 10, upper = ncp[j] + 10, df = df[j], ncp = ncp[j]) ise.npEM(b, j, 2, truepdf = dbeta, lower = -0.5, upper = 1.5, shape1 = sh1[j], shape2 = sh2[j]) } dev.off() ################################################### ### code chunk number 31: gnpdata ################################################### data("CO2data") attach(CO2data) pdf("gnpdata.pdf") par(mar=0.1+c(5,4.2,4,1.5)) plot(GNP, CO2, xlab="Gross National Product", ylab=expression(paste(CO[2]," per Capita")), cex.lab=1.5, cex.main=1.5, cex.axis=1.4, main="1996 GNP and Emissions Data") text(GNP, CO2, country, adj=c(.5,-.5)) dev.off() ################################################### ### code chunk number 32: mixtools.Rnw:1282-1284 ################################################### data("CO2data") attach(CO2data) ################################################### ### code chunk number 33: CO2reg ################################################### CO2reg <- regmixEM(CO2, GNP, lambda = c(1, 3) / 4, beta = matrix(c(8, -1, 1, 1), 2, 2), sigma = c(2, 1)) ################################################### ### code chunk number 34: summaryCO2reg ################################################### summary(CO2reg) ################################################### ### code chunk number 35: plotCO2reg (eval = FALSE) ################################################### ## plot(CO2reg, density = TRUE, alpha = 0.01, cex.main = 1.5, cex.lab = 1.5, ## cex.axis = 1.4) ################################################### ### code chunk number 36: trueplotCO2reg ################################################### for(i in 1:2){ file=paste("CO2reg", i, ".pdf", sep="") pdf(file=file, paper="special", width=6, height=6) plot(CO2reg, whichplots=i, alpha = 0.01, cex.main = 1.5, cex.lab = 1.5, cex.axis = 1.4) dev.off() cat("\\includegraphics{", file, "}\n", sep="") } ################################################### ### code chunk number 37: CO2igle ################################################### CO2igle <- regmixEM.loc(CO2, GNP, beta = CO2reg$beta, sigma = CO2reg$sigma, lambda = CO2reg$posterior, kern.l = "Beta", kernl.h = 20, kernl.g = 3) ################################################### ### code chunk number 38: CO2iglesummary ################################################### summary(CO2igle) ################################################### ### code chunk number 39: lamplot (eval = FALSE) ################################################### ## plot(GNP, CO2igle$post[,1], xlab = "GNP", cex.axis = 1.4, cex.lab = 1.5, ## ylab = "Final posterior probabilities") ## lines(sort(GNP), CO2igle$lambda[order(GNP), 1], col=2) ## abline(h = CO2igle$lambda[1], lty = 2) ################################################### ### code chunk number 40: truelamplot ################################################### pdf("lamplot.pdf") plot(GNP, CO2igle$post[,1], xlab = "GNP", cex.axis = 1.4, cex.lab = 1.5, ylab = "Final posterior probabilities") lines(sort(GNP), CO2igle$lambda[order(GNP), 1], col=2, lwd=2) abline(h = CO2igle$lambda[1], lty = 2, lwd=2) dev.off() ################################################### ### code chunk number 41: CO2boot ################################################### set.seed(123) CO2boot <- boot.se(CO2reg, B = 100) ################################################### ### code chunk number 42: bootresults ################################################### rbind(range(CO2boot$beta[1,]), range(CO2boot$beta[2,])) ################################################### ### code chunk number 43: CO2bootse ################################################### CO2boot[c("lambda.se", "beta.se", "sigma.se")] ################################################### ### code chunk number 44: modelsel ################################################### data("Waterdata") cutpts <- 10.5*(-6:6) watermult <- makemultdata(Waterdata, cuts = cutpts) set.seed(10) multmixmodel.sel(watermult, comps = 1:4, epsilon = 0.001) mixtools/inst/doc/mixtools.pdf0000644000175100001440000123355014762772101016261 0ustar hornikusers%PDF-1.5 %¿÷¢þ 1 0 obj << /Type /ObjStm /Length 5358 /Filter /FlateDecode /N 81 /First 686 >> stream xœÍ\ksÛ6Öþ¾¿ß¶;;% âʾ™Iì8Ic'©œ¤IvúA–(›,¹8ûëßç x•,;nwG–Ippn87*e ŒsË$ËLÊã©L3.•b†qZf·"eKž2ž°T\ã,ÕÇ”‰$KLH‰.’ÉTbPŤÉh&­À}ÃT*1²eJ'¸Ÿ1e,K˜Ê„f)gš[ÃÒ”ie18À°V°T2Ã3´”x^3cSc˜åB2Pc\²Y& ˤȘàX‘°LÈ)za]<Ñ ®HœXôX.O n,.5Vxy¨-LÒÃN0!“´DZ¨ä8†c™8Q@­V˜ ÆÈœ`d™Z°äÏf®ʤJ0 F–Z YZàIad™iBÐGTQ„GFVŠ(„‘•1x#«,SÀ"‘‰Ðˆ‘µDcr­µd#ë ·4F6 ¨¡1²À=ËÄÚñN€8‘º4F6+$Ü&€\ ¤@…ÆÈV‚4#[B&ð€ â`dÐ 'Ùf Áȱ  fx#gÀü<“ÆÁÈ™ϘŒNÏ3ƒ'Áèƒùi’föo?ýÄ⓼OÇå˜56bñë«|ñxRËû7ø×];*Jön]—ób‘¯™ ×ߌÏó“å4gñ»u¾¹ë.¯!î™·ß®pÿSÌ—çìÑ#7ëãëòb¹b?ÍòÙ,I”LÍ“ÄÐ1óç:÷Ç4I‰ZÕ×´ÁwR?›NÂsUÿêˆ>& ÷Ú6ÌC×u3´[cðp?ŒEד‡g¬ïCð8˜«yšc„kn޳07«ûjó˜YåcÂöá¸ÌÙ‡ÿiT"›X‘IùÏ„ÿ=IþþðpöÃñømþ}-Ê vÜ®Vù ·_æß¾.WÓu…SšÓÁ€9 ó¦~=FÔ°jáïéiø>§þ×? øH4R/Õy_6Æä¡oúðšffÜCŽxçÀ øê6”¼Y-§×“8yöæ˜=»X®ËõdU\•ÐGQ"£Ïœ^ŸýžOJöÎßå<ß h€±ÀYøNüâÅ8˜qÃt Hq =k0¥ Ð5›cTH0²ŠÂs˜Lƒ‰6÷gÁUë£Jª–׋’wü²'Tâ }Eh%„¢£ö7µ¿šB}ºcÐ<õ”®kgá:t—?ú硱Ãs©?ª0‹IB[‡û"´}?ƒ0aTéÛ< ³ÝÝÑÏ)ÃÒ_ü­R.^ßTªe±X–´x p&¡™„6XáaFžVƒ,e¾À2\ƒ’œã'ËŒJ½T¦"Ú&%lF=ÞŒWèPi¼Q¾^^¯&‰àyzS>;-‰“9*öДèj99ÍKŒ¿9<šòÒ¶5—×[W<$¸º ­þ>`ÞwDÅ#Ú œÚ^œüþŹ¥ˆïD¼çgø˜ëÀGšÀ¬fÈ}7˜ŸŒ×¹ë¿xóëË÷ÿy|2Z^އùeÁ“Gùùõ|¼Í“å´Xœ³@ì÷«uyp{¤LhˆÃÜkVl@Apâãqx†CÁž-¯ ñ³ÿZLË §œ2Øõñjâ¯øHK°H˜˜•tJ‘>0N7Gë ¢­ #{†\µ*þ¶áõ„ˆUNæÎÕó¼8¿¨š@Qí‡xOâiœÇ³yŒÍû"_ÄEÓ¥=¦K÷d:ív²LØ]lGÞÌjÁ=û)(¿¡oýt³·Å.…›ü'ò¹I&?ea~[òp²ð$&ã.nN Zrȳik¸öG‘Ï€§ˆÝÑ;‡$j{€q'Îh©î©phÏ鲺C~ž¤£û:º ?ŽŸÄñaü4>ŠŸÅÏãñIü*~âÓømü|~NŸ,çËþ_^Ž=×dzY»¿/hAËÅçñE- Ÿ,, ËE_Űn‹å4^A8ÖÅ ¤¼Xåy\~]BT¾Ä_ã›ø[üŸ¦ÈÀ¥®„Fvå…îÁuUC"cº"³…k÷•°¬ôÄãý§×Ïê‰Õr%Ð áº/!²#!©ÚWB$ö]i*$f€Úà>˜„¤ñèkúÙŸÓ]IúR`;£oR_Á]:Ò û~Óз†v0ˆ¡‚ÐòÃáËjEÞ®r÷6_EN¯ñüž®µñ,ð+pc(?&¸ÁnÚY‚e'^Ño¶IÁ½¹î–GíÔn6 ‡¦pŸ®‹,õ›R]#èH_ó¯Ùîþ;Ÿ}×G¸é) ÕV@êôsü2>vjè5Ñ/A½‹ßǿƠ’>A)/¡RÖãÅtP=åãÉu‰Íç—Óñú"Îî@š«­¼æúë÷[P`‹ëË3LWœ74Yzó|Vú³•› 0ÑŠ+uw5¿^ÇÄ\/Ë|z6wOW ßÁµü©ÓØÐýZÖùBºr='°ÛózZä«|]¬kÝÿ'_-[ ”Ð<¤@”‰¿ Ý9jtT¨·í*t»fÛ[‹òÝZôô1›çë¼zªv^zjvôó»§/^7€éX!І‹Ç‹uQ_¨µ­LúÚ6l {„hÛå»(3̓ 0Ú¦€±¿KYY ÂV:VuëWlŒ ÿ±ºj›–µ9×îoŠÓ¾rU÷mŠ&7¡¾ Ý15p⽪¬æ¦c¦¬¿˜èá‡'•l¬LÃ(¢ï-¢®3Ûõ§mlä¦eá„Ö‰Á¬aR´ ë Š;åÏËP%9M™Œ´„Cf•pˆ´g^PšcwêËFˆÀ4dc ;î+æ.¦øcçGž²øÝèEÕ-DxÝ¥.Êòê_qüõë×è÷5Äg½œ•ÑruÿÃ9–O–«i¾ ¾«[ÚkÀš¢Æs€MN넼R‘ð(K±çk‘K ÚG'Ç%°GkÉq±ø¼‡ÜëÔnÐ5°\š*è›?1%"“Ây2¤ÅÉâz>ïÁ&Ž2^æÒ4Ê2}7Ø6qéý}éé­/é~é ¶Ô’!zå5@ˆh©*ÀUÓpá8Iý³ßNHUÀ¿_8áÙñë“çòt>^”ƒ†ëN¥*{Ì›ö¼¡ÈB­T«ƒJÕ›mCr×§i`V ´¡>¹©ŸD_“Ö.›é»lImÙ YŽÉ Ýè”é€Í¸-Ô Ú.šjªMo=‡â—¬éˆ‘ÝÒt¸®V霫›¶[¥w(>ÜÌ(÷„ù;z¯BôzïÎÙWÿA¤îŠxy|ðéÉ«ûpÜ{üÚu¹†ƒ ~måÄ:üjgC|9ôñµIúÁ2µñbêØo¼ÕÕµúãïRÏ.‡i¨îÖÆlšv€íø6câ¥ÏØ\o¶úâCLÃe7iÈÓTIÇ Ól!ÛÞq+u;³¨>³|:ùtrtTÍj‡üò ~j&é®RÝå‘äÑ;xÄhÓ£øÝ>”$ð‰›Öæ¡ï }«ûi¦<ߥ·poÿ¨Ÿ+ª"Eªîè¾¹(âI±š\_ÎæùMÓ"üãz×ûòùë×Ï^||»;%QíqïÇÈDßÓ»Y|—;ç3YÕÇ;_Mì~ŸvÆ¢ºº+;ÑÎS$žy7;ˆÐÕYÓL2áµ»ºq[a:ßêf§»Žãð*ó{;Eâiü̱?åõÈÐ:O¯C@VãÉç¼t–T8÷¶TÏ qto5~C¹­ÆÙÊÇ伉V̧÷3Ô¬ÚRDÏ=ÝÎù{KÙ-!ëZÊžŒNŽ»ÛWÇ#u©âö^’ö­ë‡ŠÝa±Ë ÕºÅ9Úó”†=f\ •JZ™9.¢–MÎ:#« ØP¥d9xKá¦hQ”ïHäR(Ú7r‡¢=ßq–÷¥i²·…ðäÝÑèø}˜íéM™/ÖÅrXƒZÞ£¬èS¶ï=ª;Öڨ̸/­|àjøc²Ô}oÓ˜.èÐ÷®š+ÑØÓÛùAN¡2î”àÎR¡*cÝe=ÙÒi²¥ÒŠëIqÞlž•ÍôW£U^µ´\£§kŸµ•`Ý×5ѹX”ùùj<Ÿë«ùø[­éh¤f£Ñ:Û´6s¶ZͦÖ–›9|ДñújœbýÕÍÍwûKNL:.¯ÏæyKþ2•m@ºI•ù„âŽöŠn—‰=å0M¶EýúE¿Œž~ sž~»<[Î×ÃRØ á Ø1=/vÛNýjvèWÓðKwɇiXf«¥Ñ)ÕØ&jI²‡ŒjU=ax7DhÓ¶™¯÷ÕSm×ôö Óa›Nû(~¿‹Ç«Õò«7 ÎÆ+úNÏæNÒòòá¸pI¹t˜Å—ñ<_LòÊ£õ–H±˜‹¢üæZér|µ.—ñe±€Áqy=/‹«ù·àÚ”è:…rY€wö´ð³`á;âuÃ⢟*¿…_÷Ž‹ïmãŸ<~5zû±=ã 3ÛÛ¦úê±kÑ·¸²»ráUˆQÝ!~×Oj‰&Ù&CSy›Sy‹S±r°Ëú3Tëņçã²,&y¹¼ ¼µÈÏêõãÕª¸lë\s«Í£\ô—æmsS…ýš›n¡íÞAÇmqó;æ•F_E£±+Ñ›÷L,§ÂF–Ê™è*‘%QJ¯x%Q&³‡Ì+‡· Z‰e%³Hðí‰å$"¹‚­J,ß ¸ºÀ<¼žá•D(•oååCå¹¾WøOB£M¢$‘LZ“à?Ñ‹Œ23‘ÈþË$æ)±[8)£„ê[þàRa"MuÁƒÀA7€â|\*M$mö?ðj¹©3"¢·`ÿ*²ò4JÔ6²RéGfõ8¡yd”úßNhð½)[g È,8^5pº†^…äÁ·Þ†³„GôΩ4ž¼iéô/R¥kQë¿¡z•¹|wÖAî*¸P=O8q= ¹áQ÷=Êõö㡲m‘®^*Û4rÇË,ôs©­CÈ^ùÁnôî+ɾÔüùèÙÇÓÇ• òŽÅÖáUËš¤T†»‹¢»ª¤åîK¯„Õ%zùC@íÎ’ìN]ìHR ¦OT(5¨½Ü÷Vï]µw,íõËg>>n{“ƒÒi»Ò)ûåPá-Ù)íNR†jÙaR ÝwÓ©\½A0ßܬëroÍ%L¤ÂõnSBõ’³· gOzl-h¼¯—rÉT'ôŠ}”Št›_+‰Ó¯º$0⨀]‹HY…ÕÚR|?«iDo…øí£ºBy°PÒL Á”Ü4èÍĪ)”Ý4¨(4$ý@N8•,¼¤s˪·ÜGôó.Õ@&eUuônYUx:2šUõ„#x çÖýÀM8OY•sYɪ¬à~A•OY˪¨îÈÕç6W»qª_>päá)\4úõÄÓo9l‰,(åœ%Ãá§ŸäI ý&L2ýÙ{’&zl îÂjÐpODB6 è×{4Ü“”ïÉ:ßCºO>Ïóÿ»œ@Ù–÷‰(©È½× ܸWR›ˆÓ»~À-}=(üýw+¾¤6.yPX–DVqo¾L-,È'M†öŸ7ç€ÛÞ'„žW0°Tdµ{e,¢º¸”g‘Ñjm‡qXÌfùŠ¢þî(ÿÙ¼þ¡Ís÷ ºÚEq™`­p¯ÓÝnc¡w;ªà/)¼v¼×EÅëðA…¹ß\ŒÜºãÆ&aV¸j‚Ž3(åõ]©•Ëw»"+Ú<6•ˆô»-¾"€4z¨ê¯IyûŠ+ÑV­ó.MÃ|ÙÙ¾˹Áªþ!§¢½hdoü `Äæû¡¬ý‚¨Ãœs•…Yˆ³™#(É„£(¶±Æ»¤''®vˆ‘Ûåp2Ì£®Ì•ô<Ðĵ>ÌxÙÀ-Tÿ²ƒÇ£›bÃà4-ص•èwüÓ,>`íÖ®E`z÷:G«v¡ÓÿÜiÂVëF°vëTU°vEëTY¸°K«’5«¶Å^åë”I°nmsá­v™ëV<ôfÒI3³Mþ™^1nf±ég¼êœ5k%µÛ„5Ù¯„¹ó•«œwcw‚ÆõioÿBÊ&—ÎÉtú¹FÙvRîËÿÚ0Mendstream endobj 83 0 obj << /Subtype /XML /Type /Metadata /Length 1550 >> stream GPL Ghostscript 10.04.0 keywords, comma-separated, not capitalized, Java 2025-03-08T08:39:44+01:00 2025-03-08T08:39:44+01:00 LaTeX with hyperref mixtools: An R Package for Analyzing Mixture ModelsTatiana Benaglia, Didier Chauveau, David R. Hunter, Derek Young endstream endobj 84 0 obj << /Type /ObjStm /Length 3208 /Filter /FlateDecode /N 81 /First 729 >> stream xœÕ[ks·ýÞ_Édâý褞ñ£nÒÚ‰GNšÔ ©•ÍD&U’²Ýßs±ÀK.)Ê¢"w…Ü],pîëà^ – ³‘Ï´’,\à#2o%‹ÿ†RÅ¢bRÏ¢fÒË¢a2X\[¦”D[Ç”Q¸öLy‰×SÑh#ÓÒR'‚i#=¾H¦‹ø¢˜Žif¤røb˜Ñ4‚°Ì8Im3ÞSÏL´‚À0+µ‰Ìjê£[ãqÃZ§ÑX*f=äRC¤@ sBÐ#Ëõ*¥cN9H….\&sÖÓÈœWx] æt$¡/ µTŠyEý(ͼ¶”‚/žÚXè-½å˜÷ƒB>JR\`Ax®¤†îu@‡€¬Á#­` hOj K¤Úà‹£ÆFqB;ØÀk2)AX€¥#LàÑ¡-º—è4Fo)Æ0¤6éž!mH’J8BiÈ.½Jfò‘z ¤èôÔ)-Ú6àÆÿÉ®x Oè¾tXRŸÒQ¯ÖN=µ¤TGO“2¡3 ß6zHZT‘ÚÅäd¸v‚ôÁ%9ˆ dU2–’î‘äd& D £1)Ó ù§o¿e£Çó«ÙŠ96z:],Wäæ‚²Ñ³1.ÈÝÒÕOÿ½lØèÇ«ÕÅtÖ,ÙƒéÕ' Úü›Ù¶Í¯ÿzÅ€Q+Á……ȳ«‹ öš~h>­(nR£ãEƒáB~ç§éê¢aßž7ççB˜(„k„ð ßqÏÑw+H×龋ù>Ú¡I{ï¼ýî\~Þ´Ÿé™ÍÏÎò½û·y úÔ¹ÌïšáwÒ¸ô7¡w-´ <Ñ>¤ó=¸ ¹5z­‘¬éPi’.’²@$CÊz±h>töékR˜³J t¾E›¤,Ú­TÄnÝæv|°á[:0Ž ‡¾Wľ ~H¶2®nÿ:|>ã2­Ì>&¯ÐWÁ)®Ã'Ék…ÙÀW¬²¯5D8Š!6¹>,鹕ë "‰CHä:HnŠ*µ³­©S{B*ò{v±2±‡ÙˆÀ­Ú$LŠ»}zÐî:ÛÎäÁÏ×¶÷u„Ú |aŒ­è4\­e®…åc°›Ñu®ŽÎa*K’”ÈíKÒ¬9Ëg$µË¾Ån¯î"ñ&}]¯©ú1*òè·"Ãô”P¬; gÙuÏ›ŠQnÃT‡ðùyû^ÒÍú×YoyNI˜ ëÙŠû3ó•w:\q7ã…¾Þ¢áε¡7;¨·ÖyôŽ8®H@\eøXÑŸ];ŠYI»œb’dE骟z’ÍFHÉÊ*cÅ1æéú<ƒt‡ë¸å˜n‚Í>Wà®S°ñùžÝ˜—*Ò=\0­U?ƒÒ–›¸Mú}Y3(YEG‰¨m~íÑÎVÆ™¬ßIN6Y;ÁuzpŸËl×ëf‹·¥}-ùȽW[¼]gUT7­‰»Ëf™{ÁnÊ2ùéºn×ùGÑÕ6{lJg4GA³éÜý|)îÍ—ÄÜ1sö‹bÃÛÉ£µîË#<q3) JwH Ö"ÇI°Ž4|¶&úy¦Ò‚›:¡ËzP{ô0”ÞÙS¡ìR#9ÏD7us^#úsÛ@­³™aû2Öù:£ëÍ©¢’ýál6_-ɯm˹T×¶Ÿ-?¿¦Ÿ­ ì’›¥ÞœMÇæŸðù…–Ór€‘pŠ3‹Ÿ6ËùÕb‚r”Füë§Õß^®Æ«&•Ë©ÁS Jæ¬ËùäeC½xòê$Å¿àRݾ¿m6£RÈ /F• ã63×öêœzË`Óc)~Ïós]µ“Ù bÛP›N^ޫɃ©¨XUVb }VQõU"•äÔÓ ÓúTÍÃvó²˜ÌpËL´ák½™K¯Õ’îuNÄ@Þ6À€‡Õù¥Ü±}¦öZs¡6™zSâõJJÏ)Jâ4]FÚ¡­#°0Z5ïú’p6R’é|}¶ŽÜŽçËJË–„a¿|›e§Ì­ŠÃVÚßÊ“®¯L—M æÑÏÏ_ýãÉß<{þr<[Jqòh~q†ØŸMægÓÙ[6úe:{8[N×7’7>~7^° ZF€“Åôr5_¤•ÒÎI»F/¯Þ¬!-H|ÌžMÑ_Ãh°Zk!ý2=[½#ªCžø¤%Àå„”ärŽ/¿k¦oß•K DDôÕèôë¤óÔR ¿‹ñÛ%sÖ¢’H?Zs¡ÃÐôöëöÉÓéE£Ç¬™î‡ñûf—‚¾_/¦“‡³·0 z>].¡„œ‘iG/WÍûR$V¢UŠ*v˜/ΚEF$‡§ Ù^l»ÕÜ+O«ÙŠ›à×>ô0ƒOÒ ié%9-®*åј)g¸•IâÎ"Ϧ³ß Ä4ÅÜ12ß×ί¡9…XpwM±ÎÅÈ­5;ÐiçxZ¨š;ßVœ4Ý)á¸õúžÑÚÕ(è¬ ÜÃao„îašÛ_¯O¿ïLVÓù¬½õÕ»ÕêòÏ£ÑãÓ‡?ðÓ“ËÅü7ŒÎç‹·£ËñäwÌèy?ý´šÏ/–_§©~·¸rÛúÞñØî‘@‚ "O{ ÊàZ&Á)m´sA¹cË)Ý)í-Èò=í)” ÚËÈßië Ü h] äTZwO<.B=Ða¦5zÀ²Ús½3*¤„üJCHÌh;&pƒtßB-^¨–ÏX£aw†„àJËÍ*Åct_´`¸‚‰M \ÑFÔ )mÒÚÍ-ª$ž:ÃLhõ„9GÛˆ¼wßà‚å!蜑ÓTxp²\”Ü.Tè”t\K˜Ó,·õ q?P©[™A…ëíÛ‰äs†c„ñýêÎF®c Ê,€@Ž£&æ¾_lZ!d…ÍÒäêon€^i'[z[ˆ´"ÛšSwPçèÄ® %{Lõ¥#‰5§‹§H™Té•ÔYÚ’¦|Lûغ&VíÀ2÷G{ÞígÛ'íx·Ÿ2¶õq¿fÎã©f.Ë5mÍ\f˜ÕÌwbVÀS` ‡ôË;šˆ- ±·)µ8"HUífÃ@`GÆpd½g>(i‰®´kÏ-læœäd§û2¸[:ÝêÊ ™1làöÐ$æ®ÀÌ;1Tàà¶t–â‹×•%°n:ó·DDî¬ð¾çD W36¯9j”c`Û ˆë3ô½M’Òb léA«0°ÁüC5]@r{N§“IÚÈîÊQ÷™$¿EÎù™É[æwèÔPúÌ•ÌãË<²ÌF¤ãBÛdíŽJÖÆÖdmÊŽ×íÉúÇ4`5ev:¦G: U{d-º´Á…ŽàâgCûÁiC[ÙklˆO+\ÇÇvãêÀx<…ël¥rù°e"t1é––69­T:êvŸÐ$jª :lhM˜îÛ »)x÷n’ͶøÖ† Dn`S‘ðÞ3´ ¹FF[ )/tkh[é^µn¤P…Óp:!„dog:å¸ñð7×ÚP’$`kÂ*n•MmÍm±Rœ¤ýdP6À§Ä®\Ô 0%r~ã Ì t<Æ!qwHúè$ëÿcÕbXIÿ­`LžóÑ/™÷Dè”ëöäç:ù•ͼ»×mB½Réma+ A§Pà…aÿ"ÑÙ&"ª ª#ø8_»®6D4Ð)œ²wV«?ý AU ³ž‚]Â5¢n±!ÐbÙ}£s(òû[Ô‘–hJÌÖµ@P·¢òýðŒQlP2½s9[EyT¥Jì¡hU›~ p·a_/ÿáQ —Ö[åHž¹%j‡*Æ»]:U‚#œél°†\´Ûz¥_ЉÌ;¯°+¢Þ9 —PÁ(Ø;@! u³Emcè;Ï,öƒ£õZZHéÀ™Šü; ÌêVõVÅêœCŽN€¹»µ†5 ªÄ.×4ÎrM+`tÄ:3H èç$”®äñ~èîÕ»ñ/&連åÉüêC³X5K~¾ 'Bh«Uô7ß¿¢ÃãVÂ$|O©ƒWô…P§$ÙW†?òß–˜¢—óóvîƒV£©p£›Gh5#„\d 3A€ iqÁªû»l·ÙXX8XŸMxõóÓGõͳç§ó÷ãÙ“æýTŠ“ß\LÿsÕxF!Æí3 ®:H“ѯ°öR(çæ†)˜´<Ñÿ§‘!…[ù§Á%tÌÉZÇnv¤a2º½-G«ÑUu¸áÄ•Ó ô[$Ô’ýã x áó qëµçö+ùÀs´È;|Ðaôk‹Žz¬=)¤ßQßþ‘l\endstream endobj 166 0 obj << /Type /ObjStm /Length 3108 /Filter /FlateDecode /N 81 /First 747 >> stream xœÍ[Ûr7}߯Àãn¥Œ[ãZ•J•/q’Z+ë•â8»)?ÐÒXâš"’Jœ|ýžÆ`¨±ÄÑu¥\2f3ÀA£»qºš…&$a)¢Ì»,LÔ"zÜG#r2(­0Æ$\0„Z0>á.zañ;m8ÜÅ(lJüu¤Ë“,Èj´‘´ òè’7ü©Ð=Ú”,ÚINPææ“ÎpË)‡q…sâÆ ) Wf-\6¨ÊFx.¬ðÖ¢L.;á#ñ;^ø„z“ƒaŽ"„9‰@}å,‚7VXtÄdµ!YŒï‹Õ$¢! '¢Íü²Ñ9~9ˆPou1®J"fÃUY$ AZ£E²„*cpá5.¬HŽ»ÀH‹×'RtüŽ)”5Adíù(2¿h11™We‘½«Eü¹å $TY+rÎ\…ñkã0á,MšŸAÚ~‚ÓÁ𘎑k! qomæ+ÈËdù dÄ@9øú05P\Ì’…˜ A,B*µ*‡ñ`à”ø*r+èøÖ¡ëÑ»uèÃ胅$ŒMŽkч͙kÑϵž¯X´}PÁ‚1Ešþöå—B=Ïë•ø¹( ûEÿÚ’jéjékjk™j™Ûz×–m{ï„z¾˜¯›9z†–gj¯9šNž->¡_~â³—F!Ñ ¾x=YâÑö¬ö›Õâ|yج#~‰ÖŠ.—º×ËÅáA³FCêõ‹—BýÐ|Z£…¯¾Âåïg 7uÜàöóÁ²Zñç¬,méjékjk™jÙ’Õ©-M-k{¶¶W…`«l…ksW_ûË~‹ÌÃ…ôõ§õ7ëɺAíPZ¹Ù$7Ûá®òÈ­ái§â³>ÿ‹ ?ì_ÄBÿn£d«C);iõ|röm3=>én1–áßÕwj_­¦§ÓÙdù¡xÄü ôr69ÆüµÐŸ]Ì\´¦´ñ®­y95„ÑölüûÉisEÞß­'³éáÓùñ¬áÖ÷¦«¤_r€'ëæôG¬e©/²Þ \¶æ4ÅÍÇêþcuÿ©Z”¯ÔWê«ÇðÕƒÖ¥À†m#ŽjQ¡ï1l¸Ç¸P䃧ÿþñé³/^íí-拃Ùd¾6úÉ~s|Ž)ìé5”mþt¾š^<¸Ppr[<\Vp{ƒ‚§kœ)O÷תfÿÉ}ÿ¶·rSëúÚ·®>½x_o½ÿ³þÚÞ®˜3Vî¾9cÁï™óSõL=W/Ô×ê¥úÆýJí©ïÕ¿Ôk˜ùúA½QoÕDaŠ›åtõQ½Wï—“ÃfÖ|X·WKn´\~l֛Ǹn+Õáb¶˜ãÿÓÓ‰:RG‹´N5ª€QÍ/ç“™ú >LmÔØ‚:VÇË6°T'êä÷³“f®¦ê꣚©Y³Z©S5WóóÓ÷Ír5=ž«…ZÌu¦ÎØ®J÷åªíü èGêlv¾R¿¨_ÎëæèýL-ÕJ­šÓi‹lÕüŠ>VÓOj5›¬NÔZ­O–M£Ö¿-Ô¹úUý¦>©ßÕêf¹è9¼'L¤«Ïµè;½'˜„R¬-Ò¿äùòeÏw½öásÙÚtá iȪŸêä;pïÎ?,–GͲú)]¼;Éî_¯‹Ó¬®ê§ÿü8i8dI”ÆQÎÏg3~û[ÀdwvÈß n’hF“$B¦¬Òcu‹¤%|껞“x5ì0G}=:]ð] #§/Ðy’Ñ"¬ 9KïÝ8æLCà•\àDÔšË «¢ÔÐ ¸”%þ€st¹,`[r+â™8Å`­Ì™ÓVºü Y½¬sT©m‡ϣ˜ü.ㄵ ÚF2-‚¥H­ GÆ)•>0ŠYÆ8dXï0kaÌE/=¢©û\bÃ¥ÖCÀ`›’c⨽tœ/±^â4Hd«Þµš… yø4dŸxÍCç=œ†Á4² àJÓ0îqÁ¹ìdÆg8IFïþ,pð0Á!?•ÓèØÅ€2’Ï’!Â>Ã#C£àdÄê´–’äåà.›‚í™(b©±ê§“L4l·­%'‡rŠKG Pl¿Ñó£JÎxx]P”¢Œœ‚ó÷#Ò2ì|E¸Aá `œî %’a`#Ì(Q@ØhÒB,EÂT’eý»¥¾ísÞÚ×@ 7œÞÜ€p×ðg3w—œ)í®“¨©:µ™u×NØÍs¬Ÿ¾»NÂÖ r?1Åꮿû–ÓêÝ·pàÔ} Ùå`ö³.©þzƒÛ†®DÃ5Ÿgj>ÏÔ¤›©é6Sóe¦æËlÍ—Ùš/³5©ek:‹ÓçmYóNºFÓºFÓºFÓºmï³è¹[WGŠž¾`Ø%1èùîLÅ‚GÞàÕ×ç!Žgá 4)D'ù{­4e["JNâI º¬Ä†hЂ!`,SÓ0o2ˆUذГš1Òqj…"11òƒ°`Þ ìÿ úÆ€d°^’5¨HWý 1çÌëvV*€Áy,Ñm¨1Ô3û Á=[*3Î;n’LæQ²…:9•éÝ™q¯õ z<´+f{K›aÎŽEŠ7eÒCQ…  ÂÅÈÛr°R^9ô0€mïVr²Ÿ¼Æ²_1ÌFÙ³‚„‚)#®ˆaT¾rghÖx GÓ!£\ÈËÈ®ó ¾dÞH†½EÙ W¬˜”†7la­‹+0¾‹ÍAÙçë­ÔÚ$3di±LðN)´Q¹û¡ˆ):m°ºór5¶1VSбkÜÀã\§¿†èꬲcãz̼“Ø?®Â,£‰è[B›óØ®õ¾ì(¦ÖVCŒ3DÇ8àÚ1‡ÒëÐêÂm©È>+ï“ßaÞÞãê<©{Å{%º›ˆ›*éñýV¿c2ea4:·IÏÈ9¼Èáx› ãæòîµöŽãS=äÛµ7ù’u .=tíC9““¼µt‹$' •ÀªG%{wÏÑ$%*L4ÏgÂ$b.ò<ªË¹8è$Áº6à`Ô&˜]€ÛÆ[4TÎ%ö,({„ívØœÝCÄúWÀæ8å/&•ÙŸàÛÉ3p•rʼ f¹¸lFËg•(ƒjxjÞóI|î «œÃ,·é G&ñ¹åÄ6fÎ>Æ1°Ý´Ÿâ,¨A܃“â3œkpä3šˆÏ"Ô`ÎŒJâï³¹hbàðЙD>VŠpŒÏubfƒ7j ½9µ<+®Ð*/ÝàÂê,ǰ°L`t‰²vƒw‚vì~E\˜†â6‡ùä ²gï‹—Ï`øl?ª-Ü›E Æû»Ëç>Žíê¬æÏl ¤áè‚·îøtn‹‹ˆ—þ;âÚFCM{æº&“QKÎlîØ?uùÛ!Ž:HEû”sC3ïè-ìg"Öø<”Å!xo¶ì€¥3tɤ=T_ÛÝož@©ó`FÓZvTR®Ä§Œƒ-Ûë6FÉç@¸¶Á–Á@ø<úøØ¶Dˆ˜Ö`†8Z¤ùœw‹¦HÒ»’Dá€ÇEg¡l6öЕNqèî>¯&Ú²l2–¤rúEK*¿€ Ùy|pƒÎdDŽ£;lÄ›ëw÷0‡6°C6uh÷·È.ïŠÝ_Þ7˜8T‘¯-É£Pö~,g*Ç% wÇ)²è¸À‹\Ü) ,±åw1Zþù^j³~ܬco4Æ ò¼71]±›+,ÁîÜíÒÜ9ošù—=Ò“ãßcI>ªkàÁA^`â}36pÝ/cngÓ;IžÝf;ü²­_rV·Ø½¿Ûºcï\ö5g®_L?|h–Íœ·µn3POÛóÔµsµyMþ|€ñendstream endobj 248 0 obj << /Type /ObjStm /Length 2467 /Filter /FlateDecode /N 81 /First 737 >> stream xœÍZ]o$·|ϯà/ Øì&Ù q;bà ËC>à‡óy1$C§.ÿÞU3i¥ht+í¬twœÕ 95Ífuu“ÙzH!üK­«m5+Z ÍyßBWG[‚¤.¸¨ArϸhAÌx˃ÔiŒ¤áÁ\Sž.„£w\ CüW1vV \-dUÞbφùú–ùôt¾¼zФx°ö â¸ÕRP5ü´$a XrÓ .ÃpÁ^­K[ &Î[-˜{y0ëìÕñÝøøŒ÷™ó+–èî9tw %wtw ¥4^”PšâS0hqç3-Ôdìî0`—nU~{Oo˜¯Và¥ùª+^Ñ5ÔŽû¹[hb|¸„¦4Þ׌ÖÊf·=´Æïêsƒ®šRd†ð,° ^ì:› @§É‚å­¼”¦Ü3/Zðî|ØCk¸è˜mÜWŒÕùv 0žÁäõFÓŠâ_ ø$I)ch¡sÐÀ û fŒwáÉ:{Â?R- ’oSô‚;aê5K‘Œø‡ L‘ÂELù7¼C 1f¼C¦^3Þ÷Âxï€὘e™Lña’µö?|õU8ûãÅÅåõ‡ðïÉR8Ÿ\anÛh}´}nás+Sûc8ûÓåÅõî£X›ÿvöÃîç_Þ}sù ãòéÒKÄûÝ$¼èñæÝ:›Ÿ>ß}¸üxõ~÷!Ñwmr­éÞ›«Ë÷ow×èìÍ·ß…³¿ï>]c„¯¿Æåÿ~Ûq¨ÿìðóîÇÐÞìNkÏm­vþZyne´y´:Zí/ñò/ûFÈ3õt#|syõóîj¼4MÐðC–ßî>p ñágÿøç¿@7Ö¸À£¬™‹¿þʇÿÎþJhïÙE4G.ÁCðnÑ;ìª*±auâñ·ºžðüí—‹ÿ.ئI998,éˆIÂŽjpüVbí3Ø Òy]pT1Bñ¸“j5 2[¼¸%º²K×ìÊ”¶HNà\f°¾ƒHÉhõ0`ç ³á¨çˆv¢ãš|¦‹w#è©Ö彯ÇÒ½,× yË5círÍ5®ö–×9it¹ñ-}I´K_RãÒD–åyN†žzÔÂi²ñ­…Mo sµ)âZ+Vö‚LN56F9¡ÑÀ¤Ç ‚:böÇFæB¹g âÏàî»f½ã˜U±%]sLKQÐ2=©=ÅÆ(! @ødKø(믬 Å®5ð3³4:a=yÄ(ˆPÌk“‰È`X!µJƒKT0³ÍW…–¡«¸84ˆ›ñBÐà2Œ˜k®Ø@„³/`æ’sìÈ`‘ÃéN>¥ƒ[| ¢#Y&Y3ØV`ô²­²¯ûì‘è˜ÜC|d*ׇ×)bHc0SÀ¢Æ'ébõ%bˆ€¤ÊåHQ{#dOžé5¨ ÚcR]°4l«,#aéËQqbuLxþœšîÞÐ'¡ª,p€ˆúQJçxh4¯@~Ý`³»›ÿ?4æpVl ¦Rò­ÙÄúE ³&ЬýPy¡ù¬ˆêkñdq5‡ŠÎ¬¿"—Ætæîètò€ò86ˆÎI<Ý€cbùiàîq 3ÿ…yîpÛé“÷µ„ý~Ž~+Æ}&[Všçvˆr¢Ü‡(÷¹¿ ö—Q”Q”Q”Q”Á—2¾KòCâ}ý6â]ò¾x—¼x?HRÒJ[w3hÌ`…{eVÿ ´;ÄÔ"ùxpZ ¾ÞoÁ!;Ï/íñå‰õ¹Q!mjá6 2sÌlE¸*åäzïqp& ÜZoÁAQ5 À/¦Ü§ ¥¹ÿ±(å‚^å¸:óf¡ 8±†•Z4pnAÜo’OV–ÊpL†lÁt-Íf±Å33ä· vµsà ³¼-ºgÉøÚbã6¤±üéS‰>3ºHQÛ´.µß…'T³•V ¡‚¸éŒ£,˜sW‘ƒIÈF7Ü4 ’¾çwÒ:æ6‘êzô´f=«ð¸Ú¦DnÞ’í“Dð³l«EÔÒË©µ·õ )¶±¬7£Ñ–'11“oªâžƒ®ayz¿E‡©®OÃöùôò¥,I òE¿ù¡ ÚEUí%kbë Ü69l§d ãn¢#Õ4øuíLÉ1wX~¶(}Óýˆç°„)ëpf⦠`‚c…^·e‰çpìÌü<@âÓ>^v‰<ð”­mº ð㯢L_;ÏY`=žrá&Ázm³½€µÕ·ºÆ>»–žXFOûö™7ÆcðYË”%·(> stream xœÍ[ÙrÛF}Ÿ¯ÀcRSê}M¥RñÇcÇ.Ú'™ò%BŠIÐË<̷Ϲ I„LI”åRQÝ z9}ûîÝÔZ¢ÐZJI”º0’žMá”Ci‹ JWH¡ *¾VЛPÈ(<*±P†ÚQ¨(ÐÆ` ‰‘´Q…VO*Ð+ú ‡6¶Ð6ÒÆòSŒid #ºšX¥ð ¯öèeea,fÖVÆEô° f +hfk «}ã ´ÅÖÖB ëõŠ…4²…“ ¯œÄ‚ºcbg ½Ò…³“:ÐÂc0ílá¢0ç /½ò¨ èBá•§J,¼¡µ{QxÐÆËÂ{ZœW…À¼Qµ1EÐ* ³%jyWG“b,,‹hŠ(hR¬?Jš4ˆ"jÚÀ†ºUDGkÇCôÔËŽ‘ºƒ4RHIÒ¨`)Œ¤€M6 Qó´î(P }£,$^ƒ‚Q¡¦h·£FH¢±yRZbšh©F»Š^Rz"#öFÊH‹Œ˜CÉ@#cE»aæP–˜M`å%}‡9T@#0‡Ô0‡j˜¼’X5Gœ<k§·˜ƒ‚)æÇÄÆ¨Q_p 4ÊÅüøcÁïÍfu³(þ“˜R£Ä“misérésrÛÜØ–2•ï þ ž5å £ߎÁŸ—“j|¿þ„y¨µ–Ë‚‘ €ÐãåxŽE;3•‹z9?(!|ŒÑ‡§w/çõÁ«²Á@üåÃÇ]~j0ÂO?¡úù´¤¡ŽJ<ž[œmG‚Ж.—yQÂlïv^Øw-…•n)õ’K™K•K½aþæ‹xô©ùåU3nJL‘¤u)suÝ/ÊÔ?|úúÑ£Gÿ|öüÕx¶boT-§ã9&œÔ“jvTð·ÕìÞlQ­¿x\Í̓c´‚”'ËÅÁ¼:mêyÒÏ Ð³q¯Ñ«å~“P‰¢~3«0^ ê´¼œQ¶¨ÞV“æ˜èîÀùïV»±8 ú8ˆ90>}RVGÇÝ#&¢ÕÇGßcQeÛR`¼éøh­i!§iðû½ Ù©÷»öÍãjZBü}\“÷·ñIy ~mÆÓêàÞìhZÒ\Ï«ÅJà õÂ_5åÉ¿¡5û«ëÑêÂn<}þvôÇï˜iTŸŒg˜ª¡·¤9Zx«M€¾»¸ þÜ&HjuÉ.qÉ.Ø4éådÄÖOš3l•"õßô½ÿmËÞx$•à%, ¨Ÿ8¨.¦ÃB‘xX Ü}’=—øÉC[ØMê=„˜f5kútuBÑ=·ˆèIÁlÒˆöÔSµê|«Ûž†ÈÐ'\ä\BÓãÜöqŹ÷ø}þ€?äøcþ ÿ•?åÿâÏøsþÉGüÍÇ||rZÎãÙ„ïó~POëþŸœŒù„—¼œMÆ‹c~È«%?„úàGü˜>=.g¼âó)?á3>«f%¯yÿ§Võ„¿çs¾à‹òZ6¼9ž—%o>Ö|É?ðüÿÌÿ[Îëžpí)¨Ô,_^œ®=ìLz-ÉÒ2ÏŠXèxx%bƒŒß±=i†…Œ ìf)ã¿gz(é "÷˳×¼yŠ™Ÿ×³úÊ NéEÙ‹dÏ].{ê2ÙSvõÉ|»z꿻ΧM\a¬Mm7wñùç›áÞe7Ó—ì‡ÒÃRørØÊà‹,ƒoø[’ÃÅAU5ÕtRòqYÜŸþ.›iyØtõ9~AH'õÜE²š^—ï—ãé°ÀþuVdgË“}ˆu4[K/ù iÚTk'Í"}:].øûeÝ”“ýiO¼Õ'¾˜’¦ØRСL³ wüÞ ºiß"ºÙ`Iƒ>/æƒÂ¶¥%…‡~!_{o1û˱MröÛRæRåRçÒäÒæÒåÒ_ôî‚Ù‘‹J!ÃM\¹'åôCÙTã½ûõtÒ÷DÖHtÐZá vÆù[TÏ'å<ÓB$Š¥Ù>`çh}yÁ¿ÿñ'ì'C¸JQudÑ"â›-§SjúÜAô: *JF1"m&(ì•ÌS<$‹ðpÞõ =«fwÈ'Ü24DÞÌ$÷¡…sˆ¯¿4„L Þ¢šaˆh c-3TËd$¨Qà.±ìh”z…ÍJ‹nzØd÷±)±§”aÂkARÇ‚C›ª-³1¥˜§øœ „_Ð̉íé°å|‚‰‘IC‰Ç,4ÙÑi-{ð4Æ—”ª2‘))‡˜D¢ŒŒÒ‚¹¨¦mH!2HzçðdTLQâÔ2”.õ(¾!2JÝ1< x²]`À`R~Š¥§ Ì›¸¼z#hɆ1vUJ”uu š õqåUóƒO)ÕöÁÓvuÚԮÏA=9—ÃG2¯]<Úõ¥äg×R—,!FÎ1ëÕHkÍš´RAóŠÞ„aÞ…¡÷REéKÏm8L e™²[Òµ—ÓÊ :»É1ØAâ­—öQaíMª#îÕ|…-iêÎÒÔÈHq°d ²<@Shm ÿEI©R ¦Ò&UF¡«’5ûkÙïÒ¢Kvßç¼göG´Ü÷ ;H®É¯¥ê‘_wsäïä£%€åNÇ0=Î j lާ|4‘òäÐðÉ¥1̆-É¿-<µ†Giu((‡ø®'³ €(ȪQhí¬½cr[`½,l»Ït"Ò–9_îr¾ÜÙ |°Óì+´ôøÀù[ãÙ í §¬"´VN–‡†;E‡O Þ(È¢œ¹[kkcÏœ |¤\˜p{‡Ô Ûê\ø‚ÒS JÇ86‚üá®áé_U3K&)y'༓kEò£Ì.dÓ“îÎC†×†MgŒg–l.J:4±¤[á¡`5LÂàÞ)¸¶ä€Í<çAœ ô¾—ão´¯7Ç&É €6\ƒ2µª+YLcûžÉÆ.(·ŠBJ—Ž•/:Y}Ç žÜ—ýªûR|)ý²_µ ±aÉcâRÄk$É’!é—"Ž ºmF¸[€ñ1t@nHÐY2Ø/áÞLùœÇ¦¸ÎÂÑ r(Œ“àN öBçHUºo,B Wèb+S;@wAqû¾ã£1J¾¼cÑeÈ=u ž·!J’F1:¤ÑÔÛmÄ­Ý‹|T®ó©³Î·:Qê|4¨óa™Îç:'ðuNxêœÔ9ÐÙÕÙ¡;m™Ç‹y¼˜Ç‹y¼¸á09÷Ý•;û‡Étmâ«DâF­(74¨ÀÁlÊ–brºh¡,!99°êtÉâ–•Šò¼?N)øÜäÊB2¬–mÂa tÝæNÁQ Òµ–œØ@WU¾8 íì8°ªOw’dÓeF=åØè–×b#…ÚkO-8tsö«³°cØ·!pð–¥[ƒSPwJ»oœ‚¯LG½+pp¬ºp›íTŸ7Cûª#¬œö)ë ç¡GaõbŠ«‰„w‹ÎDf½B· ¾ tÐrÌícJr.Á†Â“󩙨©¾ÎÆ’»ƒ½[áèþãÁ·`gì—…÷CWáy1(¯P&’®2 ÊvÐAJ8jÈïôôà¬ë­, Ö@^… Œ)%Â[eX%Z‚Þí¶æ¸Ú.YzéQÒÅQÛ±Sóu lÒÓ9`X£“ºˆtsp7g9Ê`Ä|N@±¢Ž,]¸TîœçlrÜT‡®;ë» tý3òÊ ŠÃa„…c)œIJ ]ð*gÑÝ(º Gñ*œ{ò†éÂ{¤“Q c.ܵa%“t\gàÌEº‘}pW̱Hì­]?è¢;I‹7]je›TŒN¿+ØpøõõÏ»V7/½|tïÏëë¦/ö§Õûeyƒ+¹ñümÐ/\ÉÍqé\Éõ0“/åø¸w‘hFÛ^$þò;¹÷R üªàoF¿®xö ©êYûÕwÇMsúç?~d£½ÓyýÄÕó#þ} “‡åMnðþ£“G7G´]iÊø‹m¼_0<ú1rteÆ…Âò?‚ËmóªWÁ»hÆ ;],Y9YòyyZÏ›Åuè 7ÌÐïl¤<“H· ^¶Üöì÷ëãÎä6aœ‡Ãæ$³tSFÀÓÝwœŒ«iSÿ0©&U9gÇãå‡r¼üy9«>ìÕói 1c‡ó«c—ÉÙM¿bvXÅtFO¹0&Â-Ðüb~2>=©ùIy²?/¼[Ø5vA‚Ü>Ý8K?Ü‚¶¡ù+\ÚzŽ—³¦œÿÜçŸë“^iÊ‘Úäðé••éNÓí²ûÿò"®MiH(Kv_äûC:0¹mD·-¥›ñ¾VrG„–töJ”ŒN!á%ÁÝ-o,>ƒ ?߬ô銀²õÁ)“n·uØLÊ:­n ]'ÚÊÕ8ëùE—8>«ÃÃr^Î(µ o ~RÍ– ZF‹{Õô[~„ÓþHcó€ÿoÑÅŠendstream endobj 412 0 obj << /Filter /FlateDecode /Length 4615 >> stream xœÝ[KwÜÆ•Þs•YçœÞ£†QOTyÎ,äG&ÉØ™‰D/r¬,`’¢`u7Íüãü‹¹*  &iy—£…Ð@=nÝçwï-þ}S•bSá¿ðÿÕá¢ÚÜ^üýBÐÛMøïê°ùòòâóWZnD]JaôæòíO!t)”ÜÔ²*½‡O‡‹ŠÃ¶*+%|åtÑþa}ñ°]cèIY+8iz¨¯Ûëö¦ŸóÕ»æî#iŽÑ¶¸iîV9DB‘J/8ô=ŸÒx Gn?2=ÒœRúÏpL+Šë„¿ýß~ÿÏtl“1tõT;áuYY;eKQ ÎÕl²¬®c´"p[‚î]Þ¿¢5 [Î:ø‡»#Oöu1sÖuHºœûWÑR©7Ù¡¾¾éoÞ¶Á¾Ž¬ï÷×-p¬ßÝ8ƒuN™RÖÎ?Å)¦1åÎSœâ/3§ÌYN™NÑöiNy8õÍåÅ_àlBÈp>Åmî!œü÷…ƒ0bê |Ù.Œ”óÏýÅë³Ñü´/½•6 6²ö¥qr\*¥ôlŠ—?cß\Áã»dÚNP*k€³®Ôµ>ï[¡PµŸŽåàWŽL–€¨&«jŠF‡$šUvŽf5, 'áÎÓ5ÄV¯}œþÙï…´tp#uñž# 0¥Ò5D`¾±à /iT²¤‘¥RB.]º©‡³ZoÖ6í;ÚÔS|l¯“)À‘1hêñÑÀ U Ù˜‘? ùuoà "~^ó.yf…´Ê*Q\Á³WVWŒmwLF `.éBo‘ '&Õfîþ‘Õ¦oã¤ì`$ðàAµ›¾]œˆTXó°<¬^ú³“óð3Fõ\‰À’ëR€Pvì:Ĭ=)S0®kNCT+‡ ¤.VC Vìp-µÃèbΫ1IJkà£5Ïa x­ÕŠHÀ'Ûϸ{•n¸OW¾NVެUñ#›Öïø½W¦ã½Î˜™ïßìN‡\^ïR Ü«mƽáÌ®%ñk¸ËÈGb´ÐE$xÕ o•.¾INN³Ùßv;2ËI²ß^\þoÇTTe«Tž¨2¾+Òà©€ ŒåÍú–}´åh–é>Æi 'S€¶á,°‘ƒ%Ñu88Ê~lIÓÁw-–Ñ™îvý9HZSÐD­^à@ð3 Îr<Õ\ž{‚uèõÌUÙò [‘K6Ît¹"4c 0{Nþœ£í*÷(\”èÐw[‚a=:-'´Ñ«“Ù>³/G‹ž|%%r"‰Çç.µéY+ô¿ã)žà ó„ "R\•"í1å 7ÌÝ iL þx ”ÀÁ3FO‹ûfO¤Š´•ó¶É‡Ývýøðb»xU¡þ©°›FíEØugÂîs# ¹qeªRyÝx€Îè&sçÉhîZ*r“Ks‡÷‹ÅÇöùÖ"Vñt‘c„¾ vsö«»"£QKh k1Üi©)~Ý/ÏHtô¹•Ûòm2ƒ­¹P–ößs2–jï×£ÖÓdºû•]GGyp»;B¡ ;@é ‰¹Þ,ÜÒEŒh¾™æuL•ëÈuð瑼ÊS²cD2†½*Ÿ;ê}.·îÐ’û àâ ÿIèæ‘8Ä[{ŠC¼ä¹uáDp+µ@·¾¥<³‡Sè£òØÓw‡ˆ¯T.Ï!cPé­©%¢'VMj¶Êl:ÐNꞺKL ÏEžƒmf<ßM>9D5ȬÌÖ4€ûJç'jÆ#¿òDÙ†¨I3é¥awÝîbTèÛ+^±$?wÙf§ w×vÿé#嬗~•ÞC¼?«‚Œ-g‚Yâð&ä@Ew66³ˆ4drãLùY×xD[µ(`C»â5QN O:TÔú”&4öðÜ> †cö +i´8…sHiÇÃj”1ÃP2Õö³sIOÊ"½YE6ÒAV %)‘taûÐ>Cu˜æªƒûUº ¢üc3„u…@—OÄÁN¹¬œëž!¹VƒqƒÔ‡–Ôƒ¬1ËȽêcW‘Õ­,z>(}Tg.[Ï iP£dëa)>š¡Ééó³Yl½Û·“U¼§Z€S™Ö÷XEb„ÈÅÞ ‚µ£P3t‘¶…[o‡„è±ÍÓç¸ Äþ™†_’m?aƒxÂêPk޳® v¡ÎçÆÑÌü}PFa3ó^äʬ諦´ô$-+?žãËxÔñ<;Å Å5“cëRÖjƒEY€žÌ­ÿÙ‚®Ü•y÷Ér(çfVþ•®Ê©ò>Vùdž‹.È$ë3+ıbƒ©‚AÃÄ>³(©;Œµ¡?¹‹å–û¢h`G×wW„]BG G7·d?;†Â :LWeÀaãuˆµlª\Ï…Š„Bp%ä:kµ |süt¶2«ý„›\Údèþ¼dèÖ9ˆÔÆ»~ø-ì£9ÑÏ”~Ì4\®ªX/žl“fB ¾ã6“!f´RsYá|ÿ‡â¨F×ÁUrœáMÓHQ÷/ö±½=žóT@¢6” +ÅõXZòÔxú‰¿>s8©–fúöbßsUÙø!WãÈXM¡’ÆÂÀÈM9·²^˜Èt€ ° ɇTòáÔ*ÌYÑôO¦f Ã2Êa Úf\žU"•ôZ@‡ÁOFíüSwש¦nkª(RÇ2xy=Μ€›ãAœû¼îÞŽ÷ ‡Q2ø l®ûC!Á BæXi©Ý¯¡Ûb9DçtoK$|'\Eßvx‹É«:»®¬c¢e=UI˜ïû$awC ŽQ $Èg)+2Ÿ—zÒ6ÖÆy¹»,:LkAÄl’û°¬£ x÷6Ÿ+Ê1lntlZJ§ðee±ˆ‡pÍJ¼5_×h¯wÃÅ)9+§Õlà²v*DøŠrÅ ý˜êZßå)ᢠÃÚ´Ö,ãÕÄÎìõGŠÚ^žÜÙ`2Õ\< ÇÀ?ªªrf øé”øÜõ¼­«ý‰Sš\·¡&NÕ@ý¥Ä;ôM–’äè¡çˆ¼Aù;C1”Éa{ÜŸKD.ÍÐê*—Æò-Ê9¾Qs\é„ÅB@ )¦./)©mNIª±Ø ˜—†¤¤A]Å¢•®Qè¹ 5ÀÕ*™“•‰‡/ÓXˆ¯ýL,B8NŽàUPžkŠKÂ'šÜØK÷’3šàêÌUH`nyÅsÍÆ)Gž£$ÂaÇÅ$F¸½HoGguRAQ¥6ËÂ"³!ÔÃá1ñªÕ7„nrïsö\•Ï©bW‘S’ÓEÈcŒ¢›L§y *îû6öYQoßlÃ,t#§Œ­lv}+Ux6zyQ9;¸/„ð6é_bòÍ&m)‹Û_SCAÆÙ­Å\Íý:3ÉpaU/’Á}—Êæ°ˆjS+0ˆÖùªë£Ìlq¹uT\ÄÌæ9nmýhh@k›d†K+‹_ÒÒ‹º¢~.é+=/"ÚÏÍ¡]$³€ÖÔ‰¡)àä›Cêd÷q” ІqÄ-Ö çë>«¬6F’}Nr^‡µŒ88Àc˜£ó›£×áµMaY¿æ v5¿ìÛàfµw3_>‰…é“ibƒd Bð9V!Ä„ZÑæÉ ä3A[æéøý9GH8ót¥ADTƒ…Q¨0¨p4Ãç·{»0Dˆ&C¬ÎW ·~ñúZZaÝÇjCw©Sœ²=pŠ©À¹þ5™BQǪGP]6ÿçQ“&<•wßVYƒ„˜Qš4/I3_ãAû,[»¥¤ò”c].‘ Ñjl†÷ae—|˜ÆW×’t¥=œ²Þ,¤û6‡É‰{ÈÇ]‡= ²´4UGèÒ «bñ›GÊÒè2´µFS,çÅ#eiÚQrYúߢÂ%Ÿ°Ü N"QûvœasfÞ}óTa¾:-HGÚJ;ãs¼–ò¯-ãH}Ú¹ ø†¿¡;}^Óeú“T=¼Í“p\Ûò°UG¸SÀò8«Zð2³¾Ûw|RÛpºÐwr\TˆÌ¥Û²Œ®=©Ð"«OˆÄàsŽ!OÇH¾ŒE‹ ¦wÈHòû´À2,“äTäX=¦^Ôœ¬Ùf,"Ö´É=æ'»â}ºh·ÈùõÔbši8X]Ô O6sN'žhÄIjÄý Cö0­©…eZ³„ü2ÏŽd)µZK¤y^Ê€Œx>ePàBÊ C`ÜÄúü”r†;Øx“ ÝsÜ„$Hq8ÕÆ?vlè¡ UmžHœÖX@ÂBä›wZ  àÝr.§*Q|;´'È%ídy$snJÅÎ!ÿ:ý«‘—}¼¼Qdñ'ìÉÕˆíþœ¥ ãÔÀ™[9]ÿ>b9º£=£ùOí Èš.ôm„°¥àªlh |õêåŸËW;ì— SùÐw?Ý\qàCs…Òÿ/R,T§_•U€‚'ûeH)j|Í%[þòã÷™ ¦£®°¼ÚéåOIc]›Ç}> stream xœÕ\Ý“·‘¿Ç«}º»ª¼åR¼'“|rù!¶•¤®â«³³—[Ýõµy)®IÚ+û¯Ow ¹’V§ô î4ºýñë¿[ôŒ/züÿ¶¹è×ß]pzºˆÿ=Û,>¿¼øÝ7VÀæ{Ï—//Â+|Á¥gÚð…Õ–y©—›‹«îré$ë{eºõaX¿Yö¬×Ê ï»õr%¥`ÞÉîóË~áe¯]W º¾Ö¿Å‘0 ·Ý—ÃsúVZÞûnˆï9îŒëva˜÷¢ûâU6jý}öÇKá€.»âÝbLZ¯—Ý—kÏ…î~€¥Ã†wß°H½ïþ^Õ^9¤‡+éºCIÍ©p¦îËðÆ T'²%=߯¥€9Ez§}·Í‰|ƒÃ½–F_/ÿïò?A.Êår‘N0%=ÈæòùE§——¯/VJñÅJjæŒÁ§WÝïa¥à%¥»Çã¿‚Ç O$`}s½Ý ‡WÙ·›ðRß›n8ÂÛ˜ÇÞôÕžn~Lo‰n³~;l†Ÿò¯‹±{à—2Æênx“m{_òuý<‘/ºíËH³ì¹ü_àònû4Ÿ*Î$·ªAoõ%%ii»›íõêfø6h®(¾ò5·ËUš-|Áó.ÓÝ 0[ Ì3ãxØU÷gš^y!uÍ%.æmO£-SB ±Xqf$ì¤ü¥ü»o\q@53Zr¹È>éâH•TL(î¢Æü[k.Ôu0WòdÆ”Š—ÏrÕ‘$I&bOîo¥¸e÷#™†]‡···“Òê‘ßV‰Š¶Ý-[lä lÓhÆeï‰Î¯[[qÌ鯭Ì2ŽXÅWsÄx‡¼nͶDxãËY¬É„™Øª˜îuïJŠúl d oãT‡ÆTY$*•;—ÌzÞ«³å®p,°­]÷Ù2iœ,8똕Žs?ŽS›œ9cà)XEPaÎNð8îU‹Å,­¼ÊG‹*Ø’tGö½9œ³>Á逳`I³ú«™=¬›LŒ¶Ñœ¾ê¾§ÑxooÊy=¨rg«bûì¹HŠbkE‘àkÒšo«#Rkºs¡lR†OÛ ì”ëõÕCNÜKõWgTÏ&vdB® Iõ h¸=8Ä©ª½i”Ž ¢|¾ÅÒܬ@Xo+¡¸§Àº»Ü]•†#÷WQ”¥$òœß‹eJðhbfY–ë]Ok¹?Þ íá*[îªö`W-X:gºCµYeq º{–{æï³1»]qQÔâ/ 0 "%­Á÷çÑÍ‹ø-L½Ž#=¼„!yH8ƒlƒÇæ0 éè¸ ¤Q²¥ ^`>Ô£Ñ=:pùy8ðŸ¥5åA~>¢E—HäÕ˜t £0qšÝd79ûž5¬SlR‡£‡TñE“'€ÊÇBF‰ ܬK¥ÉŠ˜¬†b*¥ŠË5‡–>žËŸZ‡-Ïë>Ù?jev–9ˆÖJ¢åþÞiª6¤©èIN¥©ä³ó'ÒTž¼û|šjÏB~61ÛÂV ˜Þr¾€dÔÛˆŒ7 Xn…öÐôhäÐôTêþÚ°¾@žr(mÊ™³Ò^n†sNú´ûÏxËU!aÒz$0F’ Ê©û„#`½¼ŸøÈϼ«ø~jl5I*,ÈÅl£•ù`Ò…UßSÚ}©µ$ì&¢&=~>0¹3;B?j;<ÌÏ5,‹g\'DõrQmB´ÄóSGÝ3q ®À\Q.ãÉEÞ}‘”@[‚"”•¾ÞtE©™lXm9µ¾Ç©†]\¿G·ˆÅUH KC¸¯÷ðiO±T{ØAÀ§Ç¡œ-®ª¢ùuíœByh}´°? ëô‚è>_‡Äæù±]½Þ‚GÜîÄþ¶%ç6ËNîŽ 1¸<ÆÝ9‘éæpØuì›—‘bàIáú‚$FgŠfÛSø³˜äšž@Y‰u_È}÷yx3 73dé(q6V `-\wØ¢ Æ04¨ŸøB š¤5(µi¶m¨h?V¥±°nÌq`ZLÖº×òDÁ¹­DrJˆÝã¡øE‰’Üú›³!ĺËe4<#•€(¸{WÕ|Ì¡’‰ZU"¹‹¤¹ÛC| å¹XN‹“¡\bA·* ¿´`‰Ìý#®1OÉØ"'Õ€Q'Até-ãÂðÓUÙ”,JR¯H±Ï‡H>ÄÕ3 À9ž¤¿jk€µ@h^=Ço?©¸,¦h{AQƒ½¡h ¾G«˜UEè!œ³â¥’ÇÏ7ÍJ,uȪÔRá—s‘ñú†BPd0غ'Ý­:§P¾îÈ;¶FO°Šâ Í먿Hæ“”Vk3¬"¤{°ÜÖÝäkãE>—+w·š¡+B‰®¤Q@FmRÿ@z/óiÇå*×°ÒF¿ŠC@ÇÇlQ›Ù"Úy­Èîý©€§O%+N'ÒÜ[*ÿåéåW4¼l /löq&°_“ÚBÜÿt…°ò¸9p{'RáH×ȘdÎÞA‹‘ HÊž"{Pç€pŽfáÏ—¿¾šø‹*ôQ%t”7I\Qº[AÏÚöf?I’ªî>`Œ ÝŠZ¿]_'èÂ¥™H˜´<Í»qj0š °R077em¹«²Ñ˜L–º²Ýl¶ ÇVåd¥O0Ì'= gPy†…ÁgAT™Œ¤æ¥óÈÃ+ÐÆUv!f¹}4‰+&cF\þb}Ó¨•G!+/1ÉÒÏAÿrкí5E bØîþ‡ZÒø\¤»¢#mÿ1@È3L|7åzìd)…9…ÊRGà¿%„‰Àú¬>\Ç–!E@l³ _»úª¡¢?¦ý§ ?Iq8x·èa®‹™ß*[/¤Ò5S¸)!yÔ:)Y„ðH«aitZH¬ò'@¦k¡F1ÀÈõp_Jò·íÞ·^2®á Ið§Ä‚Û&‚¬(Ç×Ìêeög-ÐäæèWs:µ ¯“q΀¼Š±8ðù‹—Mtž™Ð<†˜ÌÑùºe fíGÿ»Ý;f$_!TRa Ì8kMÍ ÜSÕ;Æ¥ÎF æ`*Q²®œ †è3µC(ŒA4ÈmYø<‘ÑÿoC–)e\Ä1Œ”… *Îö¡/yœ“èø²Ë~Ì5 |ŒÏ y n bU§-D¾ØSæ².À_4 L yƒ” ;qR€–⤼n >r%ÁZò±aïWMâõƒÞèè›Þ#LÖ |¢]5áóØ/eIýÍg•el„¦==¾¼ø£Œ~q½ÇÞ3·¸»è×¥!Mõ i„b|±¹P äøàæâ/³·$ €5]’À€Óâ„Ã|ƒ—$F«”o ¨¦=¡9O¼Úà8Ë$u!Ah Lþ„ìŠÌ슌 «`¤Ú_ßg#×ò3-ü‚)­¤;-êÜʽ•ÎC¬˜ŽðëdhgÂUÁªŠ)èr`yŠB>湺¯çüÖÅA;Ëw8Çþ‡{@ì( æ::«Ùˆ ÎùÀvæ3šÞ•©û÷I'ÂXÇ<&Yt•…›Ô°5I¥¡.H¹Û^Ã/‘ÜV“^ˬéå–Ï`2„™òvüe©["ÿt¹â&¤óð£&øQõ4|üô8àMû:B8~4Чð’*Á!âMdµM3(÷\M6*?æF7í‚>s?&Ðl¹2½"Rþ+/ï–ðψ²d¨’£Ë`6t8zZ‘Pdg'uÐ-+„ÌÂ"Š,¨HŠË«\Å­}X‰à7RDÛ ›<÷+Áˆr;oÆ–«Cj¹{à]‘€™Åwyw‚-«×Ï8NBN.\óÓ‹Ýüõ¾ªÁ%z.0àÔBâwxt7±=%NûÎóQ¸Ïç‹IRíE¹½·ë²ÐêÖñ‚Úþøùn7+#J9~_%¼X>ÑAZñfÛ$'ÆÒ’]Ìô5¦ÐûýPç쾌»M¤´|kBøÓVÜž3Ï·N¥®¤k›â­uTòJO&*KbÁ¦ÃVdÈÍ…J®ªé![¤„¬ÏÓ¬ºêª(J)f©Ë}œ‚ƒxª‡ª<°RpÆÁ'н-5ÞI*¡Ó²™ ¥®åëw³U¯ÆmÒÓiϤå'š§ïkÖ8¾’¢‰q`ì#EšÁîQÕt¸ÖšÃfkô\ØöeCön»I/$q,#\Ð5ü¬ íCLP@L™h_Þ%]–¦]#G èà>ÎÔW•T¼ÈP³îVpUü²øñ÷¬àÃÃDVcìØß»íàÝ"«³¹MЬÊÜfZLë h‰L›ø*°O:©jì¶€J3- "-~–xÕ;€hoÕ5–£«Ë§*‹(“ BušÐéhðõŠÏ× vTº·\wÿž@êí»»8s=·Uôxþ¦òn‹}ý–Ó+—¯ÆûßE(€ˆÓTFÚij«!®ø1-ý„Åà  ue|qf,Å&k]˜ÔbË’œ)È6›%‹^ܯda­>†¦å-§œèXí‹›.xô"u èËâ-V޽®Š·óÁЀ7ÙÐMàò5‹­.cË #ï@(k¿ûŽ¥h´"ÃŒÕÀ z¨?:ûn`3§°@I-Y„ÖÄÉùÈFl€HÄT,Ä…˜" x†H…"¤bÒʆ ÏJ0¼2œn€Þ Aý ¿IK¾¬Â¹àðvL÷U÷?Q?a––ã)©ã›ÙyÊ&Ï|¥Ñ7º´=¡p<h2é«°©4îÚa³V ›V˜„ó0ÿ28ýÊÿÀÐK…EÍC/Ñ}þ, ÍÙâ‡Dÿÿà§ä`”%lDamÔ,6Ò€[~|r ë´ÍædçÄž/¼ì½ùP˜ý}®Àœ@Ù£Y;‹²Çq? •l>²Çq­hïÝ‹ZØrð{Ò"Ð3n”ÊÚshò…ñ%ÇÑÚ °*œ¤jK&3¯¼ s¡"ªb!5I´vr3öL§_ÌÙîR° !‡ÛP'DÆJ§H{avC–¢–ãoÿ´:IZ}­Û<óc wâó+Yx#k¦=B¡Bjã¼ ·L1ó|9þpJY§7`İŸ»èO,gÆþDwąϵYp‘]Žºêþ2°æªt’®«Q§¿´§ËtÆ>lî˜] ;_ÑnDøcYî¢0Ä#p`¦Å«£z’!Æx4´Ûã `ˆ…ŔیOÞÝÜ t®0§Ÿæ¯U'Å8ö.a” =ÍÛŠ¬J·Άa=œVºZ/ää}î xä6^òdh&æ¼fœÿe“wò,u§Ã¹nó—M8’mÇãSµÐµYƒ¬ßŸ@úöLôcß}£¸?™Òc÷ÀÇ‚úËIC2E÷FŸt ØßQø{B^kAŒ–x¯Râm¢±æ¡ &â}OMÌ¿“Ó=þ*~¦04)nbj–Áñi¶nn!GÑò¯/þ L endstream endobj 414 0 obj << /Filter /FlateDecode /Length 3946 >> stream xœÅ[ëܶÿ~è×~j à6^E|“AS §i‘´y\Q¾ïÎ{Šwo•üúï;3$%’«=Ûq€Â,iÉáp8œßo†¼ŸÏÛ†Ÿ·ø/þµ;kÏ7g?Ÿqúzÿ»Ú~qöñVÀ—Æ·žŸ_<9 ]ø9—¾Ñ†Ÿ[m/õùÅîì»X9Ù´­2¬ûînÕ6­VNxϺÕZJÑx'Ùç7«5þàe«+m¶}÷[‚nÙ—ý5ý*-o=ëc?Çqìšy/Ø·Y«îyöòb%èÃ%+úmÒx­d_vÔž Í^ÀÐaÃÙMÔÞ³¯CWí•Cݱ¹’Ž¥n$S¡$öeøÅc„­Á’NÙRŸ§q(0οтÞiÏö¹’wØÜk)¡õfõŸ‹¿Áº(—¯‹t¢QÒÃÚ\\Ÿ1ÁW?­•âçk©g ~~Ä>`(Ës‡ÿk\9V,Ç«n÷,w[è‰ÓðÊ{, +}C›Ö²²ŽcüŠc¥GÎÄú*—·‡±ÖüÇHÁöwY÷bØ`féå$µål·]6ìúTÏmÚ²qŸž5oËô]9ö—¿^¼(…vcšDkØ÷Þ¯P /${™Lª-ë§göU¿Éò»®ã˳ïÏÂnÔç‡Ó»°\í´ •6âÜ B=îBæq飨w–g@޵…¼&“÷KÕ4¾qÞäb¥­í’­~po­sIèBï~ÄnÐÃkÖm31Í*³é»jé šµ®Ñ‚¦}ÉÞÞN7B “‹hÞcxkÁ‚¹¢Øå ¶‚ö` ÏŠ {]ÚôýæÂ! i#Š‘c´‚­£U7ßÉ›÷Ynlc[õk/ ·à:ª^û>Ëâec>¹,C–â[@‘"$–@r%(É<Œ½l9„j£ß.„A‚Í“<Ò¢Œý•p®Ž‰å¬FÀ)8ç;{èKw˜F™"¸T÷FðÐ^%F$Ýo¥ {0DÐYVæ=ôc‰ÇÈ7ÐAל ZÁ5— ¸± æón@†³×ñ„*sè K%€†bݳlä8zØwW$I vKXn`Þ Ò)x r¢èHPEÏö§6³”)€ù~76‘è|µvÏGhæì˜wn\æIš¸_rJƒ„Åßï” Š]ÆáAš²I!,t¸Žß¥ 24™uCB…RíÇapé½â´Ui,I.ì!:À7I[¶«ÖB ¬š³!´è° 3ø6eÈÌf1*w¨Ý'‘ïs. F¤Ýúäƒ^­µÐW¯!2_²¿ø‡À§†&ŸÅ°vÔ¾Çîêö’ű=XZ)µ$ÚçÅwàÃZã³"DI.IÒ¤>™õƒØ (Û¶Û=¾îf ŸÎ ¯.ÏZJÑ œ³çfêÁ4)Tü®ÕmËߌÝ,"¾ëÆCÿêqI9ð õ4"øëüÌ¿\e¿ˆìQü2ô›]7Ë›Fä8ÒÔ ÜFóÖ;˜›§¹Ü=ß=¾9ÌBGN6;t*†Oç1y»˜V«ø¯•ÃÜSÒ'´F7-CPw~ðÊc×ò¤=6rEØÌ9 Æ;'ÿ8ÆQ,ᎂ}¡ù¬*BIºmÓÁ¶~¼«B¸9¼€m«Ðq{Cr¶ÝoÖÛþi€s˜L‰°}™ÝQTòm4$K+눅¬2¦ÄsF%fŠçÍ˨3öàœå§Ø ¢B»1T¢­@§ÚI4´“Ñ•/×H…f>0.Üù2f5š—WÔÄì‚ÛÔ$/¡·ð¶m¸8 µ ~íŠ*”ƒˆÊ?³Ž ‚Ãÿ´Å1Jë>®ó¶¿]ÂLÓH£ZÑõAhRŽ éˆ–ÆuªCÛV–Ãþ&ª©GãmEjc½Å††{ò%ýTc¥p8é¹áÿUKqJK)ÞFI¡¹×ÑÚ§O;pýnA1p)=,/o PÉ7™æš5|«5ç¬8X©8ÆT“¨Õ}Šqxƒâ¸š…â÷Y4o÷IhWQ‚5l÷FCÓu 1‰É°{x¾Ûu‡×—Äï£ 5b§Gs4šHèôeÿø§›«1°m‰¯®§`‚ú\Q@JøÌ¶µÅçê³BDÊ˃@ÀÇœ¸m,Êç³m#ì{Ì"Zà8& èA”ÒyWׂÓù¥0ˆÜ‚Ï]c¬´™;óFqXùÇ©‡˜5Ÿ«Têâa<™§7S@(¨ ý»q–¡â“ ’­ fGÞÚ·ÁÿãLB¾7Žàúîå÷_ý»sWsƒÙMQÐ>t›ãÃ>»þ:q@ýñ(ûÄfþ8­¥©@Â*¬Y5‡šÖ¤¶"ÿ) ¶©ÐúDŽt(iÄõ?œªQX­•li÷åvœ’æð#Ú‘ŸìxŒÚlhVk+©8ξÞOlëKzAÄÈ`]m mœ£sE|È×§”ät€S@àgÈØªt¶xÙe½ï)o=™˜zA6X—+ÈFfª»LcR{ȳâ½x´/ŒªV©w˜6ÔÅõCq<ÓMǯɀ¸gBQ©ÅÈR!®>M(…¥ {âlbf]ï[0†À¦Õ¹D0B÷ÛašòEVe€ÌåòîkUŽø%î¤iªÞÿ!ü„{9¤AXÂxZzøúëýX‘÷£- ¨ȾˆãBB |t¼MNÖ2hð쨚eŸw¹ÔëL*VÈ”µ„GœTš*‹¤ž‚Lã„]çh€4‰›üðü”Ru%º¬i KѪ¢¦U•°-${@©¾Ì-·[,“h:2(K'ôÍŸÎ8—X o%`mâ†Ï¶ûq‰<Á®°ÖˆTÛ•a¼NöâéïuTI‡“ÝXÐ~äêÜ’+Y-Êe;LwêJdU,ŠÀl8UþCf§åB}wB"øS•˲뛻¡3ŸÆ.~øçì ÖmŸÝ.Õ³·hSúþ«m(7]²Õ¯€þ^7†:5šôïþ¦ ž Ä3VLà9¥¨œZ’…”¨6[Ižj.ZÓÙpÑÚ7±€äÚ"£—F8_fô?-’m,·Ü—¥ˆ+–à œ¦uoP@ ·¨@YÃPtܨ¢¦NÖeyÙR()MÂÏWÕõ•# Ú¨P _R@¢¸š¹«e[ikítõãètœ1µ8Æ<Þ#éÔzÞ#G™v˜‚}~tZ·FоR–REÌT¤6V<Ô12®tÁ˜bBŠG‘X_>œ'P™ØS¡‹_§Ã·w=N Ýu8­¥ç™ÉL¨IƒUÛã°Àÿfö%O܆TE*<‡×X/~çÀ0¹çTÝ2ω ±³%¦tì³í6\ÊÂ{/.1¸™`’XÀë¹`ž¬££%Ñëß×gøR@Rþªœ›iÛDĸÀÛqE …f’#ÜqÛØ·¿áúìúÍ-E#Ã! 9’>q†èšÅÕ©éZŽ?%ëy’¡QqΛÃxº ‘;(•NŒ#“véQ¥#ÿ¶w沓±4S:ÑÅgmëªÕPíºé!Ÿ’BöUHü&õÊ£‰aìîKÑæÄkCAu_e}ù>y€pGµ!?ï‡h²várÚIÝfƒK ÈJÀwÞ*Ò~[Ä*à™-žŸûí8¦ÆÉQÞI³³tü^:Vº4ëózp~iæÐ‡R3øÅ衈h}'XÄx0cÿA¹pÔݘ{Špe­ O´„ ÷“k„AY^…mk<]óÁ¡fô\>öÕ†ªkA¦%g¡>¸[7mŽhÌ“‹}BsÕå=•2Päîô$‹Pù&ÜFé>`ƒý5{šëªx–åeÒE—ňÓÙuu :L°ÄE£¡ŽYUvP¸Í‰M# r~N7´è"‡sBäIsJ¡Cº‹åÃZdeOtÑ 2Õ™°¹>.K«Øô/FVˆ]FibŸ¥i´•îl8×ËÃDªçoºæ­¸%¬:]9êqi^\š5±—¥ÂãN¼Å-¦ujZ¢Ô|÷›³…³Š9¡!`‹×CÍ¢‚†7Ve”óðxwÓÝ-d΂}õÙ7?>\> stream xœµ[Ísܸ±¿ëä|ËA•à 敆&¾½É’×vžµåÈJªR«wàJc‰ñ|hgèí_ŸîÀ8I»®”¦H 4ºýëæ×úâ‡5þ‹ÿ_-êÛƒ_8½=Œÿ]-_^¼8·ÞT¾öüðâãAè¹ô•6üÐj[y©/?³‹‰“U]+Ú®m–“ºªµrÂ{ÖL¦RŠÊ;É^Î&Süàe­+ÝÌÛæ[‚nÙi{M_¥åµgmìç¸3Ž­C3ï;¹ÍZ5Ÿ³?¾L„ƒùpÉŠ¾E›4^-ÙiCí¹Ðì 0œWqöž½ ]µWçŽÍ•t¬+çF2Jb§á‹Æ ³M:eËù|ŠCrþ…ôN{¶Ê'¹Äæ^K ­o&ÿñ7Øåò}‘NTJzØ›‹ë&ìäâߨFrµÀ6S¥øáTêʃÍ~f¦°6]ÃHµ`/›‰ä0kXÐýD‚léAsšèG†›:•VCsóîvÆ.ס!‡9‹±ŠºRÎÂ㻃‹ÿý™|Îv~½*ÖHϺù}°)X8jUá–+ÖÝf‹®ë NGyޝ¥ ¬qþ°’­r“ñð»°e_'°K«¤áÒòaìZÿÌí·Ÿìe5ßd;:¶|¥*U»¾ÿÇlwK›Ú¾¿Ê¤kWù·M\<® cšƒëå o°!L¶'L8ǽMNÁ^zÉ&l¶Bû½.æ’{\ÒXuùê&)l«ÉçtåP¢ _¹§]˜rg+%Üá”ËJ+/‚ú~Aaú¦Vl"¦ ¬Ëv_óQt è$5B5(!ÈåKšßÿ–wkó7؉Lö>÷Îr6¡¡\}Œƒj1ht3è³ÙÙÝ0gM’çD¡ß²a*ë6ªGrl‡Ž ΋Û$©~i$ Õüêâàï!(èÃõþ`PÚt ª–•ð1 AÊ Þ*Œ÷â\ë|Å­NÎ1ë`¦Ò-lJ&¦šd“ýݳ4¢dÈgÉ.åw®Þ˜J«\®ãÊ$ÿn‘ JðRŸ—€j[{° Í.vÝ&‡ms©SU[G.¤)@¬g7`Ågob˜(‘ÊW¦„©àe@Ú¾¿Ê}†` ¼Û€Ñó½þ˜‹]­›Ðc~;;ÃÎJÌY¯¢4å K»™¾i6¬‹‚‚ÝܬÖm/‹4Œ(àwµNc:öçì}7¤– ›äÐ š¼ŸšIûˆ÷OÔ‘âÎ9ôßãBЮ¯V4ÓÅ*hÃ)½æØ^ÒD¿î³˜0åZãîÐÊjd.ˆ¥ÙªzÝÅvxö­ZÒ*‰Ò¬ h›m_†æd,ã4ôÜäš.CÒu€»>ÖÈÙ¦YäSï®G‘) ¬Ë»|&:&µ2hCèP»hTQÎj1óE$OÊGÿzÌ d»ä‰‡°ÑPê`9BUFgŒ%9«Œ$¥ˆf° éû]±a›Ây¯C3´w5ºF@-¯ýv‰Wë±õ¡†Ùø´¾6ÍI Gîµèuœ$øÑœ ÂB;e(íÖù>–œ*étù~½×´ ²––4ƇžÜX‘n‹ãù PÀIƒÛ¹É2;²Æ¨B'9›U¨ R{dç`šÈöó{ôdDg§è‚V¶ _ìv6¿»dI¶û—ËÉØöz] Ëûí-ˆV¦Ñ±aaP#GÚwµÞ3–…0éùµ&¢ÄÓîGI`‡HßCÊfw©*ö×ätá¶®Ïs«‚ÞÄÖ4°KÊ@jê&(Æ Oå™j@³¿=„FUÊD S“ÇI[qn€K$yàC´î㘽 0fÌÞøÅ'’¦«Ñ—«‰D×±œ}Ï®o³%taÝ6qSc™Ë”Cޝ4 'dŽ•a¸‹]ÚMÈ ÑÄË\nS,¨Y_QÞ¡!‚ÝÆ.Òl»»ö¬»¶™S’F¼sµßÏò‚/®Ö±^mR´ƒq˜_È ­$ üô!˾~LÙ­m:ªWHÌ 1?‚ˆÒ¬“00Ùà¯2ùû)¨ÕYKI¶EðìôüMZxúUî½Å—6T2ø°rÐOTu]XmYƒÌ5îr)B:¾Kô”°]íºmÜðAn$!Íå` ¤ˆ@ïà@ý¶T]ÁžŠŠ`É¿UäÇä‡FcŒaÍM„¼B`ÊžÃ>ˆ~'ÂyD`DÀ1Æ *v²& ðËd4%”¢%û©ÙUkèC\¥B¾Ýđ̜‡À8ÌAÐ’íçhÁm”ÜiC¡k®Óbéí€NQÍ pªÍ¹î¯9¥é—éPYE„@Sù‘<÷·Ù›0Žb¤Xi#ˆ¹ˆ*çÔÑ*gåÇ-2±Ùz¶¼š=ŠU½T à{?5í§Ü…¤6Tz¤^2Ä6ʲ@>½zö6ßá¤"ÃEƒÛç•Í/š˜ôèà‰{s3èu›9¿f¨{4o|èÉqå[7ØÈí§Ív| ŸØ5p\,€×Yó­]„ -3»EÒ¸,êÌbu³æí°µ 8!ÃÞ‰A¾ìø€¶2~PâIFL„µ½Ë‹vëâX*þi2uTvì-–{ŒÂxÀ^þž1ãxOF@uÍ"k]¯zëøPƒ)æØKRáìdÓ|jñOMî}9áŒT—“£ÉX…ƒ{QIÙ—8>Ì&-ˆ¨§FÆaµÄµéÞöŸ-»ÙzIV†(£€î q|¸ÏLH„¦˜yç¦ý¼Hr ²aê‹+d~„Ä;Xn¨³Åù•)ÄE nã”a;Ðûý-GËJrÝW;C‘}¯·Z¥b¾bÂØçÂñj{ ¾»—¹-Ú¦MµyÃþ¯-Z®ª˜V«Š,¯4=мñ¦°N:†@ëUTæ¾8ŠÏÀ ÆŽÂvŽ‚aAè,)[:=ŠÏ°GO;G 1àÿtüp‰…%ߢ$Z±gÇË(ÈNgÓw ôLt~X…aÇã•Z®*’XbÏšÊïE|ìÁ4õ5œg?­sûdqÑCrÅf1ðÒö Æâ*^åe‘®M ,„REÙdx=äð6GN®ñH mPÛ$ wÖ×q‚òI‚Œ'ùÓ¨w € ½MAþ¶ú¼&_•ð0&&ã3Ìö$·ÑÅÝç®÷lj!1Ó¸NÍ {½ø´¤¹»mZp£ŠÊ(zšD‘­}@ñ  «Íh‘Aæ©ÖQh¢yÞÄTÆô‰ãnL ‡`«”¸;Xès Ô&¸¡•˜&7LIË£n(„§J=º!=Ã<è†È¯œÝuC!65¹!={ñd7²&7 ý¢þ’eøä‘ Ê`ž½lòìÿ:ãkq¤‰'¸&àûý«Ì¯¶´1<ö×>X<-1dªôlxô“ 7"’TAõR(t…„ý>Z–oA †Zô^¾”‰Ü¸/käÛöÕá~¯‹Ö\o£kHñ÷êvYúWÀØó>ôÍî²(ØÅ€è·ÅAÅóE)¼EW¨éH’}™­7[Œ;á£'¹ÜËÊj›ù’ÀÔèð›ãwÑ—¤§Zl^ÑÿÇù»íC¥é ᣌ²âÒŸês@®%,QÛxªÛuw?¼x ¬ }¿m¿Ì6€ø 3X¶ú «êf›êãà{XMRÀ÷œØ€.+]û|:À`•SákúÁ„?Lð¤7 ÁDã¶ÔúÅt&pzŸz2˜„öÀÎÓ,€Sþ«/7¬vÏYúˆ0ËN‘¢z’°è*Ï‚ Œ<WC¯g£‡Ù°¼Jо¸üûO³ëÊl³˜L­Åépv¼{Ð' bÈaÜ:Z7¸Õž`R÷öùøKG‚}¢´ŸTgݱA(îCa­ã2a=ííu­pE#~,>´¸ÊÕ{)|ì,éÓøÎgE-â×;ÄÂ;e‹tÄŒÏ`}¨c}#0Á”ƃ>ÀPGi¬3øákä/À´F±H¹J ó=p@@pl"ÅèÁ%3˜%Ašmˆóóç† wsÁɶ ñG¡Ìó¹}ô„ɾ~ýZý{ÊÚ¬>vÕj}óâ‹/ÚÚ¼øŽ#[á0TÚb¼€U| ¿ °jpŸ©0Í`éÒj†y'EIÈ„NŽb0ä+T™í–q ßRwÉ^SwMøz ½ÀX‹Ñn9£.uåìõ6ÆÞÔ1’;ªù=;Þ”UÞÍfèL¡7/’L4æ<ôÍèà<8´’nYv'iIïOÊ*ýŠG& H™aïí”n¤Ã®¾W—`·ÊÁnÖMWl•n-U!OV‹ýå=½d¨Î‚¨Z¨®À…eím¸7¦ $LI¥Àüö\Ù‰•@’=XáØô^œÕ^½zóòŽê[bµ% ‹×l6ÍòU¬ó{OtˆJVØÈúû¦ÃGüAù8p2É–‘V¥2n¶›mFyç5ýÁÎ`(ËY¬i„ —u%š7p +`EÖ`,,'píÍly˜žÚŽòJ¼ÐöHîd\º”·!FöØh ÓmIȼž[¡#ïsªRÊìäPé¼tä>=z‚Œw(”ø‡²',m£Gœ!TdûgÏYiÿ‡ ÕD^Vúá§²š˜N[ úE‹0XÀ ÃB"j!ÊÑ!óãø–P2Ä%Þ8‹ØÊýàZÆMêŒÃ¼"ÇÎB$=‹«ÛÞS:Á¹   —š> stream xœu“}LSwÇ—¶÷VÅvr)àËn«Óáö ‡³g¦ ’  ŠÛcÇR Û)•_D^ÚÓ»2pƒŽZŠ›»ê³ù²èÜÈâó$s‹OÜö(qΙeçšß’í^Œ›K¶~œ“ß9çs¾ßÃua&fMúzç–Ç ë–Â…‰ ë­¶íÅ9Û”ÌÈÅh\‹Ñ*ÉŽNÎNºIgPó‹è<:÷Ö‹ÈcÜ·×Ñ$Ðè6X`cuau^¾Ëù`=TõAM.À0ˆp²u¨-tìð1xŽV{kl‚×µº_ÏVRÄΡ;CL`ìîXç˜ A£Îîî, Øšs[,mæ68¥½ð¹÷à¦Õ¥>Á»ËWßÚ#ÐtØø%wZ+jʪöU ;Úœ-VЦ$m›ýÏ­{ŒCöP͇{Ã5ö@º63{WvŠC¼¼C¨ßïñ—ƒ¶j]FÊpå°·»ÙÝBSãþÖ&Øy€õ¡Ï¯åëRImŸ(Ã}"f•E}…¬EüVŒåÆÿ¡ÎpÖbæÌ; Ùpé €C8U¤S1ËÂyžsRöÉz­ã?¡,%×J/ýç+çݯÿðËÔ[Ä‘ ö‹–³Q7‘Åç勤Ó1"—¾FŒáøvººFcá.6Cž‘𹔂ŒÕk<‡Î|$~Ïñ£f+¹øO·ûÿ WB‚7••Çþn–²Ù71!ÈÆI¸Y•ä:b€žj_•×â‡NèÕb17¾ücª/¢±î…o — õruƒÐÛØâ{´çû7¥mÛ@c7Áíó·ìW/ŒŸèJá•ï„ãlO1Ò4d ‹Ó¶;r]£!ŒÀ¸Ž~ŸÂ©?O@Ä{"#µÄˆ©5bö-Œnëljþ¦‹œÝë©€¹þ8 ×íž®ê•OÇ-C¢ùPdéä+ym¾é–+FÓŒÙtÞîò"ÙbÓ-Ü»¾SÞø±!NäÞz_eË5TÇ]§zÍë§ø52ý)ÙWaIf²}'ã4•”„“ ûwCõ®zÏžza_ÙöÕËÁŇ*F*F<'à¤ö"àc7»ÛÝ ]ÂÞšªàÒ>\Èååý/ѸʼnÔDçß^"—›5ˆêöG„”!¿â:EK¹ß5dAQsE•ü]Ο8¾‹Ð•(–ÉeçúK@K§Ä/¡óé3ß¿ŒªÑ‘Σïs9~ùAÍTÙ\ùÎì™ùàè« U½çäc ÙŽáá@ß( Bp×€U9£±AÅ£køb0J>ØÿÃx,ÿ“”&3w—CÝwÝî:¡$c]éf¹ŸpÚ9#úÙ¾fïÑol8‰>K “dºy?,ÆXœqâÇ^ã38Ã@ײ|Á¿¼~änÌú„K9ĦweÖk˜uR’X¾»cÄt)žã?¢É å¹ Ê‹«,êü>î3éžáxAðM‹Ýº9gØö¾8 ëIß(»W þqÕý™ÿÙ#ëúå´RH¯h«ZnV&8 ŽˆöðÃÛyp?_ß“ÿâîjÉeªZ±)oã[Bù%~;¤À«¹ŽµZÏ]–¿C—ý¡ÂÄ|Q~ŒjÐÈ­ªþ+žîê©Kè@ÚDGœö·)ÍLX—ŠAæ:\ŠD¥¯0Ôx6Ô7@=¸a¯kK TÊë¤Sߤcü:ËÇôÞ*ÔOô¸‡KF4f)Ý@Sî°ð6| =);þ ´»›Ýå;Ý.¨=¥]•MJéŠÒÍ“o3íØ­Âw0Ùp›v?ÍéªÚ¥ÌVÌîmkgÅÉ8gŠ0Y½Á9)àoôú½ÍÍ—º"# ù þÞ1øendstream endobj 417 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5273 >> stream xœX XW¶®¦é®r7”Íb¨¸/M\£Å=AQQqidiiÀl–îÓ²+›l"KD¤1˜AÔÄ,j4‰:3Qcbô™—ĘSpÉ›w0ã$yo潯€¯©¾U÷Þsþóÿÿ¹2ÆÞŽ‘Édƒ–.[¡‰ˆœüℹšð Û­‘’«LzÁN*²¡3·ÃGýåÐßþø .÷ðÛç0i.ÌÈe2¿-‘^šíñQ¡[Cvº½èé9eÂúw†[`¼Û܉n‹6‡ib£ÃBÝ"ƒÜO\6Ñí M,½ê6Zé¸%$ <ØMì¶rË·U¾óWøº-Xñæ*ß1ÿyQ¿þÇ0ÌÔ×#çjÖzmŸ7?Ê;zÁÎ…1‹´±qñ›—í zcK°ÏÖ¡¾+ÃÂ#^?aâä§L}éå™à cÞd†3>ÌLf³œñ`F2¾Ì(f%3šYÅŒaV3c?f 3—YËx1ë˜yÌDÆŸ™ÏLb¼™Ìdf!³ˆ™Â,f¦2/1K™eÌL3€È bž¨GƉq•õc^¢Aeì™dæ±l‹¬ÍnŠ]‹|šxR1°CA§®²ž°FYPŽ2܈2'>Gjw´zc!ûmà;ÄÎkYÈœPÁˆvJþ2kŸBÍ~˜A"ùÄ[Í–›?ƒ£ôêYƒ7†²ü5dn¶]<^=[ U¿B·+¾kÛîŸ,Xn•¡¯ðyG .SÁ·Ó¯’98¢êèmháL»I¦ ]3ÕOºÚÝÕÒ%θuï;‘LÇ/Tóƒ¼HŒÁr\¤ü±tÖZñ(¹¥Z:“°YŠBºÁ"ÂlþÝîE“R/=o‘ÕbÌÇþr© 5*tôL&Ó¦'ŽÄéÁœŒÓî>DôÏUMÂqìs»þTR/”5ž*¶Â»P¿½Hsx+ø?÷4wR;ÝÉ/ÈË;®w8©¬¬Æ°"@^°ÓÌ©ÙJ8•:}¢3YIH~ ¸cU†Ê9˜™ógp¡SŽ×1‰V ‹Åh-ÆZe¢»dj’w$aœª(Å´') tF!™Œ'*¿É°¦û~ÒvP€ï ®µœ¿xãQîi¸8  †Ì3'ç@>på`®1’-‡ŒaŽ—ïé…¯ƒ ÙG&Lq µ½‘ÅØW¤¸!«­èa‘8«¦Þá1N&öwâK_`´ …‰÷ˆ«ÏšØ°Í–o'¯ÿ š®ì?ÍJ¶2¦9ê}àpèÏ_àH‘ôw$^k–¨Õe-áf±üÓÇÛ O¸^ºàCœiFåç= ûä¥ljÄû*Ô’ñ8ˆø]3zA3C‰+q4Ù6‘¼`Ré³Ç/d}Ȇ…Û&GÆJí8Vy> =îWX²ˆŠ&Õîn„ ¡MV,´:Ð œqFŽmÒ59ñ«±\ Ô’1Á³È\ú Olº ü.7p¶Ø„5Ê9Iã,DO%'€eq}g“2“]?ÑE=pWw(”ÿ.»¨³M"Ù ïñã‘sâݤÙ«jõ;êÿj¨wÀ^Zqr%•LÿmÅÝ ¡«†[PAƒ7³ühKNÁ>Â^~Äs–]••–¢“ÝÊù ¶Yªm?²î­LiB7Š–Q’ª{M÷zÖ¤¬6£Žúœ­Ä«Ï±ßeošÛ³©¹û6Vb5W⨜{ˆ  a’ncR,ø| ­¹T#k¸‚»¯È¥1(ªàôKlqà±ÐÌU¹KòÞ̃ÓÜ¥{PŠòÌùQfÁ”mC\)d”‹_±%µ'ÅÉ{„´t>5]Sœ¹¸2ˆã0S›*V¥ZRöCcrcp¯y‚vÍÒÂvrØhÚœÒwŠ„eã@_e†ÂÑ’S!g¡\ÎásùèbÌÎ9¶¢ñ·JVZ1xÝx©ã î¢%mpƒ0 >fg5º{° Íæ¨Ø„ð¤X£-»t*úÀþðcÑ'§Úþ°„øŸþ½"úøó‚¶“â±°w£3€Ë‡ÜBÕ, gS7K±VôuøeM8€"®]ꋃUm~좈Èð7áãrá+¾¬q´ÿèÑéÜ6ʺ·H­ÒýöÎÏ®7Ÿ¿N3/×”Ú2ʊŽ™¿‰ÎòŽÛŽVw©ý‰•¤ÞJ/7ˆ¤üó„“›Xüûû¶"¢Œô3e¤zøª)äÜñÞ$§~{ŸRBŠe» ÑêÖg¤d¥MJØez8!Jö,o!Þÿ€óvöÆ7fÍI«<'ðÎøËW?ûm;êãÈŸ+®Ã-«`š©(Më-ùát#’“£•ØÓòµ·²[ £ €^£`+]2Úwµ{5[o~Môzõ6Ù±[ÞÆj¥±V™tYòPÙž2@ ¼DÎV•¥êêl’Hú\¢ÂcŠsVåNÃ|Ø‘°vÐ×~Äâ¼.‡œ8sj9¸B¶9ç0ÎÀ_œ³ ög\/÷LÐQÝ=A¤!Æ1º—Åæ¼C?!-IFïZ•Ñ:Ǻˆ lƾ û“3Rr£!5-Ñy6YN,±ÚiX@G…?DÐ7]`qB×sYñûõeà’G‘—}ø ;?!…91¶]Ê #3«˜Jk§sVQFÖ{¶ÕÙ û’ëö*i¨Å¡šf'Ж›SRC™ª4ö KMP决æ~HÜ}IßÔiuñU5Õ¥ %úâ]y‚%§J€»rrË q3K^$S6¹'r±WÿòNSóa‘_ ê¿ ­ÊÒl(‰öQM˜¶.Ðòö Sûý¡'“4×­óY2 ÕÈ¡KÞÁœì/ÀÅÊN2D‚4f5[RJs’šl0ˆSÇŒÆЦ§aˆ€Ut§þ”EO²‚J÷¨Ä½zýt Ï|c®¦ ?j oŠÓÈ0ge‹PrâªP++ÌSê¬6:¦¯׺͂«Z)cžMÀÜzlè„ûd¨ÀßòõqažfŸÕ°¿5±E%E%…‡[WŸÓ5RÙžÜA*[T`6ŠèàpÿõIa°‚Oï-ãlú5âô[gŠ›\q0~‘Ø ²Þ"]²ÊÊP&ï…d¨!í)$á4$¤§§Óm<@†` ’Ñ4 IŸnH^dqY—GjâÞÈÔDíÆ0ïù‰ Ë4›jò¡³D—F„GkC×7¼ûìõæÃ†J™‡ög_¤FBJ§lãT/k žhö•K!4eù:HÚm4&¦ ú¸í 'Q}£49þÔ:¡SÖC* £˜žž°¢¸€c»*K¶Ü&læ*â=ŸZ&–¼ðí$…“k‘Ë¢)·7ì©Rj‘Óy:s{)ˆ„²ZH†d-Ñw½åLôÒ[É‹ZJ˜¡”w>VBŒÑ¸#-ÞkŒn§ZYnþk·kø¼Û5ìd·ƒ¢3"÷MPÆIçL,Vvý|@—™T.E™{ k:ìœM6 SV™Ã1z=†*šz)ê¥~ÔJ3äÒ\G}Ÿ{Œ/qÎS‰5’2'ÌéR’qù/¥ŽÌQ4)3¿-kF9p÷•¤¶‹MÖÑùõ.±9pXú){éOêKádc@[X3mE¶XúêW”XÞú ÈF6¦dSµ7 ó°‘Sˆþðet9×Rb9!ú±üœŸíùª7Ö$lu%ƒùËÔˆ–5ˆµç/d–ÃIhŽ·lâž}j‘RZ(Çw›Ð†Y+xµÛ„–³UtGéÕi&#Äp]/³]äè¤<£)–|Çÿ#àVÚ×õM^¢Éx\* ³\”n±Pf2Ù_l>l*îfÙ›TÓз_³8ØÌ÷ÈðÀ‰ÿ‹C±V°RvÓR„‹iýi<Œèz^ijJ*¥™PY£¿±¡E hò=¸Üf´^ö ÄíGO‡ãN=)'¡‹Š$+Í'M'JëKêÞ*³R!Ê¡E¸ÖfNüz©£-2T<¾‡œ\š)ý¢:¹µiž'‘o!œàñºú:éüKÕ‰J+é÷#ûør¡%Ïl4d {’’w–Û\¤¬¾ Ù¦¯L·+hÀ¶Š-è.ïX-%©ÿ%™!tï‘Oåoå³_cñ•o¾üQ$`™$ÛPTâ$˜± ·c!êðÅ7êpWæ˜CííOpî“ÌÛN<ÇHMÒUE|]€:P¯x¦"0(g+V¾6?<7°)TÜBÕG]\º›ã¿×E§,Û¹âyŸK q)μsöÆ×Ë«£òÿŠ%0¢`¤šÔY‰ ”á³MyOï86^;÷—OZ#ësÅêŠýEæôTÚ|&pÚCqGŽ*)È–±ª à=Uà³™©põí·áêÝ»à½A¤"¤×=îNïO½é=ŽýØF¨K,ÛQJ;õ…ô l åøÖ3·e®?äß?$’:i¢j¥q*yE }°û)qZÆ šzÙôÞ¾@ÝúŽp ºB¸ÇN|%Ö9Z—IãXþ]òš-ži®BÝæEzyçµÒOª“¡µ[ö o8Yg9!ÐxSû;ÛŠ~èÝ(ûð>úÜoº/—.àzüç²ûDVI†Ö:.Kÿ q­– ííw×§R!C Æ’^³Ž>Ýn]ŸnLJÔë¢JמKÉcøìÉD¶°~ý¡½â¿£)w>ŠÉ7”i&Tk` §Ö¾Jì§±GîŒÅûÔ±ûô8v“)'WÈËË9XYùÞ†Û ¶.Ðóò“'6Ó>0ØÆl_Óúú+õ¯ãlþ5NZªŠ¥}Ë/£”±$‰’rʲ¿ÄÀÝêúšŒS+1ÂŒ…•Œ“¾¾ÉÒ/²§å;î©ùlÅÁV\dkÔ6Õwâó¤Ï(?ï†XЙöf¤eè‘W0Ü~ÈÏÍ˹j³%; ± ;À·§ŸÏ¯Hß—–’F­ YLF*$5Ë N~޹œ¦Å•/­‚«½}ž-Ì/8XVŒˆ§3?'k¤Ãó¼.)–°î'*.۞еÂ!h²!¶ ”Úm¢ k=Ž'hqtˆ,m W ŸRTÁ§½`¯é†Q•eÛ3g;›z~ø+=Eö è ±¹~AØna÷— –À8ð[¦õçº{šÿÞ+(»uæ£ãe1³þ æzŠòÐCVõ™kØßÃzÓÖ cÝh™M4½¥‰Ôv¥*ø¥idÄ#–ú¸¾¹yõ[#„'%DÃŽ\}Là¯XŽ–7œÛøÞH¢$ãCÉqä?¨ý™°Ðõtâ|¶2Ó"’¿š-Þäu-®Æ²;è)G}…êbÄù•›¶o ÚZ¹µ¥º¸`ÿ~Á¨I>c¾>…ö©\r~RæÁ‡wðya Ôç=åc›/á<ÕÒ6‰íÍa÷ûFÈ1î3ÕÉmµAAÛÂ-á'NXj»›ô»Óœa½+ý¨K±´¹Jå´ÚaÂëKˆÜvâ§.Q¾m™¹®2"ªY\mVô>}ñ"º´ZeçÑ}pˆ\2cu5éZ½Ïž¤}úY°‡Jè$%%½~(ÿâJ+|ç‚}Ý>%ÎD1vÉøÕÖ=åµõ¥o7…—†ïßnÛ_ ܃æ9^³V{ªEAb“’©úǻ쒦³=s&6ž@ÞºƒCšê¨ø;´;€î'ÐŽ~¢œJtR.PÁ;Qß’IU_W}ð!|ÎÝðúˆˆÄ~†Ï̵'v©~«äíò¤c별¦“W ¸{à‘¶!,PܺðÅhŒ5¦RÒAiÜ®LjµN+цûowÂheó­9µPÃŒ¬xýœ€ÈÈ€IVá œñù<Ÿ†—Jºí|ÕÖøäØw•£u,*Û­c¥×ÙJãþ¨xìIH{×› 5§8’Ù˜ý!åõcðÐfiû¾^E@‰€Ÿ*ž†àS|ni#ÎjÜfù*†YÇ: ó6jl' :šƒ *8ý.ºÙ_˜ZÀ1,oÏì;V®¼œ©€wá㓵%gNÑÖëä'R>HMøËm»7¬Óùº®ÿ¼õEzsº9¸DHÚ%’fÊ™ºÃ¹fSn¶¨¾ùKš&˜ðª 'ƒ‚—z7Täݘ¶ƒe"߯Ôï¨ ŽØ¿~êçÓ°ŸÀ»ÍÁ‰í÷p°øtñH,g±ïQ[òxÂ#]*ª6#ïÄwÒĪÐmìuÒ/v ¼¼Y¨b჌ž-kj=q‰º„úôЍ-i»5°ÛZµ³îˆ¥¨ùýÍ #Ï‘Y³È¡…@ nä=tþþ¯è&Þ¤ ¯ _u6;MØk›Ãá ¶3Â+£„_‹=-‰û}¥6û?¨ž^¦ë´n~çö+‰tóH…®Óå"yS÷?2 ¯ë¥ÝS.yeiBø*1 y9P;Ldì¿ – ÿ+átmípUE$ïÑÒžV›W¢ã&‘ÐGì½ÇnÕâ«„‰ù’On:œ›¯´öEY?¡¯ýJMÿ>Õ¦Œ “Ù”•w£†ùoìÛ¯Iendstream endobj 418 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8678 >> stream xœµyXT×Ööæ»2Ž jÎ`ïÆK4Š»¢ v‘"Ez/"0”a†Y3Cïu`(ˆ`ï½ÄD1öŒ¹¹–ÄÄ샛ï~ß>ïɽÿ÷=ÿÏé{½{­w½ï:ʬ%,–-·ó÷uö›0~¬›G¨st×_À èÄ}$tź7ŠÖxsè&„nfõƲàì{£êžhU/J(¬õ œç´ÍÃ3Äzâøñ“ÆŽ%§[»DZÏg½ÄÙÕÛ?<Ø{›µ³ßVë%ã–³^áNn³áïgíâæéìãníïn½ÚmµƒýçvöÖ ílVÚ÷‡u½;@Q”ƒßº¹þëçl˜øyЂà…!‹B‡- w^á²,Òuùö­+ÜlÝWz¬ò´ÛfïµÚÛÁgïÚ‘m£Œùh¬dÜß>?¡ïÄI“§ôþdê´éƒg|:tØð^#ú³5ˆ²¥¦Sƒ©•Ô jµŠú”JÙQÃ({j8µšA9P#©5Ô(j-5šZGÍ¥ÆPë©yÔXj5ŸGm¤>§>¦Pã©…Ôj5‘ZLM¢–P“©¥Ôjõ µœšJ­ ¦Q]¨‡T7Ê—êNùQ=(ª'õÕ‹êMYPÉ”˜êCI¨¾T8eII)+ªeFõ§P"ЦjÕYÐEЕZCvœˆ¤^ ê:ÍìT,",4fgöÊÜÙüŽh‰èÉô`\; :oí¼¯Ë¨.¥]Wvý®[j÷µÝö°éñmÏi=¯öÝë@ïi½Ë{# g‹ÛâK}Ò$½$WúŽíûƒåJËsR/i‹•µUz?›þÂþNýß X: å£A5~tñ£,Åf°WdKd™²Ö­›vxkÐÚA/|uˆÏÐyCw ývXýpÍð#ÖŒh0jªíÑF´ÞÈm´:÷5FÒ¶.¯Å>­æÒ¤Üäô(ˆ•")»¶ý(\çºÃAÍøÐ?ë­27Òëƒ :M–F+;€,͈Žã±¥VJ+_{`}èzÝUØ îƒ2%8T„ÌÐ-óÿÝi´Ž#gn”ë-P§+È튥¸š«ék¤×B¨w2Èž†G`ô©.ô*Ysa““ÿræWZ|”›ûÐW37Èp)í(‡Eä-È\‡Ìø-’Ã~ZF‹«¹vêÒÅl;G¿w•¹)àVQPÞj'lõêkŒ ¯ K 3bôµ}„6ëkvÕ´h¬Œ4ª\a#¸ê¬|è=j}(„@\rr¢‹ð,)– ‡d]R¤XA޾p¯†1Òžª¹à¸¯NêSLŸ„âÄb´ ¥xNŠ÷Ý< È“P×'¡^EÞ°Y³½Š S—’ž!w)šˆ´JTVºÝ‰ÇºNwG€vÚ€†.ëQ£ÑÉî£3Ïæ¾´ïo•¡¥x<ýæ<+¾r ¾a|÷eÛ:ù”‹njå²¶rÚ#Yþìà ‰CÕ“–¿Ép/ô@²tÃT,dñP¤ÕjÓ²¨—H|óYÝ'kdåø¾dþÚéCXÜ[´)9½V†*ÐJZlö¢yÜ"YN%7pãõ‚ªûhç}!ç¼$¨Ïð׸;î= po,ùe4ꌺÿô‰Ùið‡Ð-¡Ž[üÖƒl) 8´ÎC=4‰ò}•–î}°7´Â©Â Vón£ÐƒGÂÖ°Vk‰‘öIvU¦ ÀtSAD¸\£TÈðt\Š£C‰Y …T«RCÊ~ÖH{ÍØÚ¾EôW!/DîøG)^û Q½îy}#\#»ÁCèÏTY2ä@#ôeÃù³)5`EP¿6 5¶Ž5 N½âv [Ç¢hI¤ÇÈA§fð`ëéXÌ ¼n:ŠŽ¡µ»Î#AËx<¬D¦U0 +•¡8ºÒåJ%Ä&°ëmÜë× VØOÁ“°vEŸà hšúÉ#k/¼ÆˆÆè9+c´ÁâõTpßRÜ‹+B>$õ›ÍrÞÎ^¦ÅÏð¾(®¥+¶ÈÚ<ߥ»™™ÿ^3éL:5ªÙá[`P×_ž#‰lZ_Üýó©6®n%Mlt)h „AÁ´¸ÏÑêÃÕGû_?? ›ó+q@Á.îN#äN£I(Ë"Æâ夲§‰8)÷&=›ÜžnU €p¶mµHŽCÍ ¢td¾ó.šF^8AÔfՆ堆«í©PÊrÎ"òhüÕ±Ëì£Ã/QÌKaëZÔ"Av¸?š€g8…;‰ÐLÄ¢h¥lx_ÀÂ[ áv«†3¬=U¹Ý´)›_Š.À•Уó÷®Ìœ³øêyî-ª£ ‚]÷QÁ!WŽ×H:PâN‡Ònãcª\.~J6‡4 ÷ŽŸ CÌÕ¦½Õz^ø¸æ>莼#ýCƒc¢½63wE ¢Q׫÷¿¹ÓßdJã;†}}ùõ#K±5Gq½%5>ÕNs=9E³¨Ϧ²±©H·ÂBQa´Mrv½ £Å#^4·|›®µ–U©Ãc!ñ/Ý¡/2äÔ°$PÍ9>ЃFt€pÓ€×–Û-A4Ø`)nà~ã6JL‹=ðÇÅŠÄ]Ý-hìßß›ÊЋÛÜ:R?¢ÿžõˆ©q^£Ù)(M$ÙE7ûÌ’m¨)¹^[Ì ,¶¨=„\…²OCm¨ŽûîŒÍñªÙšáœaŸ½(Î0uMP§Ô >ZVŸ L.¤Ë~2hR2ÄÆ°*e\¼RåVå;ÈÖôp[dïYà_*« ¬R|͈¯ë•÷¢æõ[çé:kªÇ釬*WL $Fʰ”Þ‰Ù©Mq1«Õ‚¶¨xŸó~u)©úÀ—_“¼ö:HHE¹¡&^ù¤EØŒ’Hâ¤é|¤éÔÐOtrwÙR›aq¼ÿ¼¡ÎD0ëkÏýöý<¼„ý ~ñ®q81‚¤ð ü žˆ±3šŒ'!»ëw*Îî’å†îqÍ&2òeh.ݘ’úÙCAâw”Ü€> G F´,Üâ—+dû‘|ƒ¢^’ÓA«i_7÷Eð}!‹Œh°æ;íä ‘zº¯õH%J‹qµ÷ü!¶þZÕµKl»¼¸`D»Ú“ÿ‰Ó©¯1˜þŒÏ*®œ®×fßdË"O• in0½u¢Ì^§ú\µÌwζ µ°…Ëg< ºxùÀžƒÅ¬x®kJ¥óÁþ¥çóîÊð§G%b͘yÛ7¸Ô9Ù|MO# ;Ÿ{/ýZCHZ;@XŠï>…~¢EÈ&#ãøÑ»¼Þ TyCÑiv°d!‘¼i!Qqq ‰ø2>&E×þ¥8F ê„ãÒ´øÌˆµòÝJÔ¯p¯v(ÜžübM Œ9œÆR¬ârÉ’Å+ RRû!éÎÝ»—Wë›òòª;0ÙW¾°F£!Ë[—&gÄDõ# IR,Ÿ%õSVʸz ÿÕ)5&•ä¯U6è2R²‘ºµ»TÓvMô¶Ðt_™,Ì—ÐÀw>r0p}ˆ/ã: ¹¡È–ìt<î¶3DÇt!#×-3ÛDz¹ ÉâëDªO!R=íçâÔ‰(‘×´u—C2$YE§“íA÷E¿wÊSFt’d5ß, ´Å—-Ån\ùÛ^ÉýB‹ ÞKhìCûÕ;U8ð¯4K°øù$º´WA¶˜’˜A$$Ë·3âÆ¾Ž¡NýIrWïlR†&hО«Þ_jÜ]{ê y‡Ñ1{;YUä{Öp@7½ŠHŠöþÓY…;óüý 6ÈÚfÓø5WŸ£ÖD¼?ó©åC‰:_]¦Ò¨!‚i+þÜ éÔ$:EÁi{&͌ըÓɃôbw˜®„ƒ¯Øw æ[ŠæšpüåŽ KÐ&Å'+’YÏ! ÖƒëÎßCpêT#Òë ô…Ã3RwÌÇCÈß~¿Ž"~¡Ç~$,–-FV'JC#vó* ÷ß*kçïЊÖi^&ny%luCO%È &~q ^ˆÇâÉØ…¨»qx¦$ öÞ”âï ÌdxYV©©É7ÈÄ—ä9eU{ú?†á!2Ô©­«Äaþú‘Ã=~`wÃ>{Vô™Á”Ž<Ák^]14ê/è¹jƒÅ©—Ää¢}/£ô–b¹¼Õ;N’ÙòxuBœšU88û:Á&Ú|‰_¦P—ãQ4ºßË&¶a‰±.-³šÍ“÷ñ$”Ïä?#«£²èg ÌŠÅÎ =å}d%0ë|œ\r#4É2‡lvÐvå"ë»OYq0õ ˜‚3dx¾,Ùá­ %×'ȯ.­m<¡w^•-{7´ê`˜·rüú_Œ§ÂÛ(F~½ƒ´7ÓÂ?þÙhð¿;=À«\#:®GÇÚH¶·|'Iƒì9Ä'ôæ{FÁH8ýCÌiä¥ µ«‹Ÿ•ß:·˜¿cÑ<œÅ_¾—Ób¿œÞfu¢é¢ë¶íöXKÀµÉõh:©ØÙÿVá½*å&IÏÀ#XÒ=sDP9z]–¶J€y‚Ì”x(O 9×^Ø>ÍHðÚâáo3?ð+SeœŸÆÖ ÓzÿE@Ì_þ¯kÝÐŽ¶7ÒôˆTU.‚655s¥y •Õ_ñ>[hãð/FLx¸õÄ_àv·èÇ6ÙŽï}'¹û~'9üa2ü ÓLxŽR‡qÏAÆz£EÑ›`Kñº7 R¾É>j_ {KBÿR]â P%¤Fµ¹Hñd.F’œF|úÎ3PaBj!Tþrñ´ÓP 9úÏ¥XÖfƒ§prµŽÈ0Ý/>~R’rÜѦ¶V©.^— y MOÉEÓ¹T)šÑ–Ö~Ъý(#ž†ì¹E§÷f5š¼BâwŽ {³#\€¢ÎQ3ÒIà–u_ÌmQÏ)_Ä£P**H.Ž”=qOLÞ=Û4î^Ø"&–HR£HQ¦e=ù ‰Ï²GQ§$„/!úG~SÝžÝ}æO6uÑœž25Îù³1SŠŸ35R1h›ËñX®MRVàTRi,2”±hAß?k— ËÃÐå=èr¸€3ßÃëJ¤$¢Y\ƒjEyPä¿Z\KGG@x8É^"ÿ‰¢!¢¤ŠóXT‹jè¼b(‘½÷E‰[êù‘3zHµ4¹ƒöjÒØ">J¬&’¬N†hÞ s‘¸íÅ£=vÖÇ…”°.É ˆb¼*bŠËÊ vž]Ýl3w]‡,ý³$êð÷$½‰&ÒÒc\d¸ìŸjØTÿxNrx-@‹õB´E#¹ÜäêXPŸŸ—–•Íjgú¯Ø²I¡P«AÉ$¦*SsnßF4û~XJc¨),Ô³÷‚úí¡P‚Z£ÔZyç¹&gaý`Ù¿[®Ç?3÷âæH°F¯¾=ð +Þš •P¯ŒŠƒ@ˆÌØQ¨à Þr Ùžd£"!ª&öî .ZE½‹ˆNÉ÷â ‰¾MJwPßkÁ£×B´ú¸¤:¸ÜÏ/8ØÏ¯<¸ºº¼¼ú_|Ìý0´2ÜÂdf,Åßÿÿ±3b©Š')Š,ŠÜ!—+”,î†ÇF¢1¨GfzF6äXñ½½Oq–BζÕO’Ÿ)VÆÅ©Xü·ÌMŠ$’=òÌøì¼”¬,‹þöfn*Ñä ¹9Tß*Õ ûBÎ ]—À¤;žßlþûôg°…¹.ã¼$Í‚OaNÊ„¦Ù{g\? 'àÛÒ}?Ö\I½·™i9ÒcÊ—îcçë[a¥!òïòsðÎÂ%¸œq¢u½‘i€Z¸Y<"ËfÃ2~òG’¤Áx‰HÀ7Bnj_£7=A•Ý ãÎÐå  a—/ÞüP©„<çXÓ–OH,vëÍ[ǰ‡ü<6 wßì0íä›(á›(~'ÿÊo/Ü|v-øõ'£Å‘_Ÿÿ ß[Šßph.q÷I¾‰[âv$&,&}žÁ‹D¯_¡ñˆ=w^Z!Ñ„;¸6·ùx¢ýÐÖå4UDVx&$ƒZÅ–}q¢á 0ßï1]&þ>]?sõr¼{Iå¼õf8ZÄZu 1hHêòÓƒ{J€x*ä6£Ù¸·ìÖàÒ{•g®ØîM:5zØlÛÙ^úˆjc‰¾úÈ&ØÁ_έ¦édè„ØäU[d¾·©‚Ô êàäDHP'ª!Ž‘§C!»Ot¯aáH<`ß§9…g=euIF=ìfêJü‚½£·Œÿa1 ßÿ3k‚õ3r¡ëã×ø/ÏÓ%ÆáÜF‚lZT¼Šÿúϵm3÷AÅ“y;iÆñ‚êØÍpÜ$¨:,ìcz¾Q‚U"¤â:››bEž¾Öë‘åýÏŸûW…éuáG^„µ|òIZ,Å}zÌ7KP×é/1µÑ)ÊÓƒEki1Sª(©M¬éz^ý>7M•š(w¦€èÓ$Uxü†ðEÄ1u¢\asú¦Ò’ÿÜ$Þ="¢dø0 yéZ]Z ›]Ðpâ.ÃæŒÈwíVRnž`ì¼Õ=p3éìvÇ·ŸeÄsæ¨u:uvÿÚBCyùvƒW´gâf™¸T:åÊ(d†˜ŸÿŽÄ#î!¡»ez4‡0ž ÷Hr.x¿Ó[Ê+ÉËJ#’\«Õ¥€6Zé8oÙrYl{'ãÙ/ûþ·¨ ‹ÖôýßÜfB’Tvÿû=‹æ'Èæ‰ÿKqÉ' Oü;.t_·1œ-§‰óéU´¼Y±MÏîpGŸòú‚™ç¶š†ûàþX‚q bæÿ ŸDÂÿ†¤²  l„õÛ=|m7‘¾ |Ï)ò#Â(bnÕ¼|Rp–Ù"wXøº$êäÑÍ’+óIÚF¶J%X)Â= 9WỶ¼° ‘㺂̋¹9éi· —˜W6Ã'àþ^XC­âÀñÀØŸÅ¥á¤îdƉ”²¼Gû. þÈNšÉ>(eL·ö4š”Aª#|}Ì”@½|¿[sDiTÖÒ=_7>—™§O>Ãf\¤Ö±y›ÛdؾÊoŠ=Œ`þ¼èWdþãýߨù¼«¶ÛºÑÖ÷º#ݼS¹ ™ó_4_»~ií<¶´M"±™³vú”y¹ôð ‹zΪŠ8è +LXUÿôAÙEeŽWþù©Q‡\É—!‘+gŽg‹v¼S0“E³p³:Y JS)ÐåfëØ»è”9Zùç§BD&ƒÕ„sM\iZîÛ‹ü;Ú,×ã}ß2ûPï}§Kþòf][WIuò7o«0U§6]“­ÍH'¶mÖR›Ä„ßëïë;ˆaÛ¡¶×#¬=Òéë-N]8oøÅ€f\@vKñ±ã­‹;k\Rb¢‚]¿pQÀ\ø–V‹( Ë'jöü©¸3îþõŒ×O· ³<8vLö…û‘¤zøŽÓR4ji›ÃMˆ'œïÇYñYYÚ”ì –Óµ*Ò2µ:H³ºßFò^ùxþ¿<ŒmóäFH0µvÞÚðŹhúô‹ÜÒãGm±œmÛð÷N°„í~?Ù1 5¢fã5¢ÅPÞ¢ùþî‹©†_ è" ëÅñVoÓ—‡Q*9Lmÿ¶sÀDbT«d«G9.tZ“O¼âG[}âÜWß’‚<uþr›ÕÓæÕMdÇrÜV“ï-{ñðìÞÚöŠíÙ¨C$ä‹§µ_¨f.õrX{Ô{÷ã{¾:p»ñri]‹†ië„VJÄä°xÆäàÀ€;ª3`dì©©;-oË‘,µ[žèÌ´g'îîª?qL¦ß”ï»wy±ýÚw¦=¸Éí:uÙÿµyòg_#‡pÁ×íô¿š³—Tl¯ôŽS(Xu2/¿HÎK©IÿúâYÏa:&=)%I>m6îb[®¨²‚§ÿÿÍmÿd©^Gõ'J@Úí…¸7²ðF«4w7š‹z¢Þ¹ÏQêqbñJvî‹…ÄÖÎÊÆÝObós¸ç£%YÀ¤¥èÒy£±°Ã!£T½éˆÉ€ËÂV¦µ§¤Þs—ýÊ-nÊ$Ö¯Á>5˜1˜Y‹©«ÄÝÿÍœ›6—ÂÐ-‡îÿðœÇVK¢TáüE¡ ªŒWÅ@<Ä2˜ÆÛ9ýì^ó‡«"€}ÏÝ#ñÓZ½Àä&ȯ°uÿ{i«jPB»;²2¹£¿ôF“ì\wD²!uÎ%ë‹;£ôÿè<þ…÷·ö—lMކp͉*Jbp_Þ«Ð/7ž-¯Kò¯d{„ê¹y…È/;M/2v¹Ò•íb¶Ú¿[g½FËglºV«;ß­EýŠ¡endstream endobj 419 0 obj << /Filter /FlateDecode /Length 390 >> stream xœ]’±nÛ@D{~ÿ@”î¸Â6Nã"F`ç¨ãÑ`aŠ ¥ÂŸ™‘œ"ÅðHö ¸»§çŸÏË|mw¿·Ky«×vš—q«Ÿ—ÛVj{®ïóÒìí8—ëƒt–amvO¿†õÏ×Z[|P§;¿ u÷šG=Úß/•ËX?סÔmXÞksêº8MS4uÿ{•ü~ã<=>=ü¥ëp¡Ä1àLûPº'ð ð@L¡1‡ÌÄ>`O´P€FôP€N„Q’U¢U‚Q’U¢UBÀ £,«L«Œ!Yƒ2ås(À3m²e6Ê5`öPè¥ÑS£‡B/ž†!¦AÆA†ê¦úÆú†ê¦úÆú†ê¦úÆú#“•ÑÊPÝTßXßPÎTÐXÐJ(ÀB„¯ÉÙèlð59m ˆ_~rü{¦ëp!è’tJ:]’NI‡ KÒ)éèêêëìë0rYáä2}o ÷Šú½m¹m[]®Zc­)·s^ê¿M_/+oµHónÇ^endstream endobj 420 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4076 >> stream xœ}W XTÕÚÞÃ0³· ˆ³®ºMAL/¥–EËðÞPGÅP;ˆÊˆ ÎÌ7 ¹ (7AA®êÆ{š™þ,~³SÙCZ™i™'Ï·iqþΰNýçÿ{æa?{íg­o½ëýÞ÷]2ÆÖ†‘ÉdÃÇn‹™êë»-ÂúÊKr—I£l¤Ñr 9£lÍ}™ °“ƒíÉQªK*>ô9Û#<Í#`²Ç¢°Mѱ) Ñ[=Âb"<M^<ÙcIl }¹ÕcBlŒGxdTضͱ›=VD†x¬\¼ÜcaðÒ•Ë–{OþcU¿ýÇ0Ìø¹1!±;ãÃ^O OÛ´8bIäæ­Û¶¯öö™:múŒ^œ9köKf,³”™Í,cÞ`<™åÌ f%ÀLbÖ0ó˜µÌ|f2ÈLa0 ™EÌbf 3‹Ê80*†gF2jƉqf\WÆqg†0ž(Æ–Id>’UÉ$‹ÍSù yŸí«¶=ŠdÅSeœò!»Ž³ãöñÒ5Ôièæ¡eÃÆ {Ûn¼Ý+vz{[ûfûÿq¨>mxãDÇFǯG,Äã¿È#w0 ¢§(mH‘õý—“8‘%…} Ý‘ Ø ®±°_V1÷ï¢ßeØç\²V‰C,mðœ4¸Š,LƒRMnÉ9´W`•òñTLÒ*[-  Úá.48r³Ô$U‰JlT8üb³ç®u½Ç¢ö² ­/CQéÌ7HÄI\€%ìO+Û¼ž_' Ãò·‰ÿ>…–½^r}–E•Uý4’EYïÙwOT%û ¤fpHñëv6ŠÒúPèë¤s÷}ì$z³$ŸàŒ+.3››-®¼£¥6Žº7ˆJÞöBÝyÇø l±pZ¶Ú Yg2fëâBæ¹çpâÎÀ·á“`ƒ;¿lÌ€(úí#ãÉ5²TffÑWÞ`LI6¥¸Çh•¼¿¥ó,t¹óº6¸ -NdÓ ¢ŠÍ9yù9œ±.@ôŠYßv<€Ó¾´ç }¤o—øYŽÄ)—Ú0FnS“™d–ïxâJïzáË8çËÇ8\ #‹Õ3€0„'< óåi8_qB8t²³ê,tBgzuTÕVXë¸Á3 «DÓ‚½â.1º]õ•€#‰‚žÇpéÌsŒôÔèêû-ç¿j[Z¢p–å øì<"5ýæ?œÇ–ÐEuÚÛáŽü 52Ò‰Œ \½h·.mt¥`†CF±ü2›ËÊÚ;.äW÷þ[KˆJC«ú»ÙÊŒf‹DzáX|AD/ZŸ3ÿs߬Wk•IDˆFG&aóeåwE¡s5"žÐ*çf†NV`NRòø ('öœ¨Ü†zÅ?eZdúïFÛ§R:ü"û¤â7>EÐ!œù ÒÉV}qeÃêÀMk‚T°|yé?è× 7èAºŠ3p{³~€Ô1áM) MUíþj9£oŠn‘Ü›T­bƇÎ|ª4=ÔЕÒu4¢!:ÿ•ÒÍ‹ŠAä®ß‡C·ZcVä æ]æì*àj!¯Fó){ Óö!5Bˆ+ÊßÜv2ˆó¦Ã;ïÔ´GµêoïnÑßÚË8ÿ)4&®§+CÈ.ˆÝÀ%€>QCdl*dVäÀÁ*7©8}ƒk#Nô¤PË.Ìbôíø‹ˆËSTOP©q(…ù¡¤BGõEm»0:!ö ¸Q#`•â‰Ëµ¬Ékí„ n ÅåsR¯ôø2éÃO_餷ô-ÛE\z }ZTõ8#¬-­•ÎÕªköÀa‰J¡†ÃhöÞü÷ˆw0qØ?}csj}cSUç±Ô CŽp4¿É\Ü­æ0?ÍVv¾dÏñºçÑ1íƒOÅŽÎj÷ßëÿ.t+—@­†¬GVÍ~ÊžøMͧÁieç,¹>œ¯tO”Y)$ï»ï$ư«À›QNjð.˜…ÚêÊN8®¢r“!²!æ ¶})E©.»|†¹ÐЯ$×]°‘4xC(ýyC$ýŠ’é%ÛjyDU® A+mlÂàfö‡;Njóô`´è]Óö¥@ÐY;,_Ái*‡PÉ´v߆ÇV>eÕÒ5¹ô¹“8Ÿ%spΩ´,¿àP]bg¡Ô+ƒcIÖ~:áþý3}\¼‘U´‹Jbo 6tøC}Iq&^;S·À:pÕ²ßXžÐvdÓRóòr h¢ mˆ“"‚ê¶å™ë[¤‘-øÆåg}ŽÖžßñ¬å}¾%ãÖĤ$x†ý­á#4ýE¶üPEeù!Žoß³+ï¹£÷“gZX¾^ qiïAsÙúæî†ËÀ¡û@ÍàÖ‰¶EºJ÷Ž,j‘•K·¥1j‘M0n7ѝÅEË‚šì Âá±Fq‰nØÑ@”tÃ7X\Ú?&q]Òºè…óÁu7Íû,…¹5eÐÌO¨Ý“"†_»}õú•z£¥õe–‚àJ)ÿË(Jyix»ªGŽ(ÃSq„3_ŠÇ!ê²Ý°7ÍdÜ“-Ä­K ¡£ô:󠪛+ †R ¿"-ݘœéö+s{ —ÿ†ÀW‘…si©qývNÆ!W@wj;¯qЇz©–M¸xì¢Ôh]­ãç'J饉c“@ºx’ÕÄ…dIGtu:HWoåØ5êd2ÅhŒë?à­W ºD'\€J¼x–Iƒæ´œ‹É Õœ$šY¬ë¤àëR K²‹Ýù…Ø$óu­³´Ü‡êKð­Õ—~¥ÅvQ’SbXµ‘„yÖF^$=rÙÅYЦ‘~bù®ßQ‚¬f×´­Î“âå9v:C\¾™„Þé®­kÔ¬ey”Ùòõi{ÂWø¹@û›ÝpéH›¦¡S,j„+Ð]Ã9üìòoÃF/ öÒ‡3ïØ÷¸§Ô – î¼* VC8íÀ:–®*L•ƃÙI\¿7Û?VŠRð!%:“9Ù¤ "ø'øeý¿ ?âw˜•²ûï(øêŒ"³©Ü½ k4Ò-ªÍæ£Îrhp  W[U4è8¾4`ÒµÐî\ʤ|ªL…ìÆìt½¼.8zÅgŒ ]Ïk𲲺êõ=kÎi6·¬ª\@‡fÌGF·&â 8­ëi…fº©É>eN›¹³êø‘öö’À!CœÍQô¤d7 êîh‘QÑ`îáp¹ôšÔ§îÜrúo„…à鯽EžüoËz‚¬Hì³hóqa]^ „]º}©Ê…6§9ÖTÕau0¿¸_ òoè«úœjŒ2Î|¶9‰‹%/–¿B¬xûß¾è`Qð.HÕ]QÍ¡¡QQ¡¡ÍQ]]ÍÍ]¿ÍGÙšø8ëL'ñ M{}î,ÿÁïõåœu¦á)îüÊ?†Ä°Á?gþìÏ/Å'!ã|W¯Y'¤ÜŸb‰¤a,xCtgMŸýyjüòìõÕ)ù-5þÉ-Ŷî.SšÜç.ÊjGÙ&Ê­·+)w˜¢Œ¨q,4Ž:è†ñï_îB¥ ŠïDe¤Á‡ZFÌH‰½lÇ2ŠüôÿbÖ?eùé¹{ëÀµr‹òË1@ZE³aÿª?¾M—¾uɯ0ç4ZçTA9pƒfNR“NO‘¡þ¡¿F‹š Ü›h£½ó²¾ï§·o¯A— ÆŠt ªÈÈ$ÈT kBÈTbCä»v™LÍéŠ *:OVT è‹Sj0žZ§ÏXÉ`ÀCY)^•㇠~H®Ndi8¥gªoÐE3pe=Õ5©‡­†¢8²2…¿ƒdàR´‡•åpÙüö!®¿Œh´ì)ËS8KOáÔ@È¥µâÓ*ª® ‚Çy àÌWHeOCŸ!%óõÝY:½?¤ÓfñRŠmºNçøŸQùÅ ñ²Ïý7•{ŸÅS—uïªmj¯>w!¬|W®ÐPÛZÜ\ï™…þ "Χ¡„íÉ#¤¸¦±|–4WI—×u5¡_NlûG·¶©>Ej6âhÀÑμà/Õà«j¸ÓKÆ7~PÕsz¹Û~×é‚Ã^yýåÐÆ­§ëšN^]Y¼ß,4=u ¸;–×ßÜc"ÎÏé5áF£)Û´×dÜ zªº´"¨øVæ”eࢅñÏÅ­Î=¶Ns¼°®:8þs:ºqcXÔŽ©—¢Zà=\ØóÃךÀQ&Jk(â_ ’Þè] eʼnÒl¶Þ˜›l2íÊÈý¯)´ØAdÄÖšQ¾¸‰ \(Èܨ& DÀw;GḖ¯Ð±)…‚ïn÷p¬3ßM‘_¯FvÎ}2!f•!Z+  {4»Øx‚z¹ç7¨¨+0gL°_§ NZ¥?Xu(®0“ ¨¸Ý K×Óôª³§º4'÷@ÐvæRQp÷`úËàEì‚ò®„iø«-9 µnC&ìZ¹äÅO^¤IdÆ£¯ÐA(ßEÇ™-Ýèx¤MÕ.±Z¨=05zxö{5 –C˜wˆTVu¬/µ¼¾Nj·d§í€íÜ֚ض¶Ú#­×ÃÞµ¶áìHޜ—;¢ßÇ 7é®4ß}Žn2*Gí s=Wïh+ß'¤7ATr8â’xùø{Y‹*J–êqD=ƒ•8B.]îsQ“Pe"¯¼Ý¹É¹¦Bc§UF‘…¨,ú¸´47§8ÿ3¨ +¼¢LKJMNKzžØÎ#î@&poA~¹˜÷Wá Ý–î±ðýª·›;p ¾êRT 94Ô Â0¥Mrk“u÷¾×‹SzåtÿKiƒ33ŵGo¶4ž‚«Ü¾§‰’hç<¿±2è“ÂÌ̓a.Gì‘ A5Îøì.ÚØ£†µq[7Ɖ_¸¤ÆVÀ îæWí_œ _(TõSÏôIö>ÿÉ'»š 8ÚïTüÉdXç:PEŽ8Û‚OÛd·i¿.ÅÑÖ:>W¿XBö’±^"nDøÞ‡7‹7[…$2—íÚº3"tÃHƒ-9Û—XN–ÁiîDâшˆ„¸È…çƒQNóÕÔ/°P £¿WÅŸ9 nýð>ýÇÛ5«öæ %o°•{æ!T•\ÐWöúÊq¯dóŸ^C:lÿ/ÿù>2å’Šd¨ó y ÄÔ/z' GÆý-㸠¸æ> stream xœÍ]KÉq†íO’- Øææ{»¶ò¥ÅX ’ C š€p}¨%‡ÃÞ™æv7—¤»Žˆ|TFVVO‡ ØÝ••Ïx|ñÊùábèÅÅ€ÿâÿ/nŸ ×O~x"è׋øß‹Û‹ÿxöä‹§ÚÃ/ý8ŒââÙ«'áqáÅ…3®•¹xvû¤“—Ͼƒ¶N²¶ÐÀ(hþìå“çÝíöýqw¹‘¾„»ÝÍár£”ìÇQw¯.‡~0ʉìãïÞu¿‡wÞÒ33jï»ý>Óð½û=öå /­º——ÕJ%»+h=ÂëÒu0À?ûÏÅ 6qZezom˜ÜöŽFÑ^Ž#t7Þþ¸-¿¾-&:á ´Q0SÝmé3ÌLt»Wø`ö‹“ÔÆuÇ+œå`¼ð6¬¿ ~éÇþr㯻î×—w%ìõ‰»rWŒ|ÆÅ7¯‹ß·e£ëÏ¡Ì쟊ßÊçÛãUìÞX:œrmûôL›îwÚÂ*UÜ™<‰y9a+tw½ý<Žð[êÂÉõ÷/ئlß [¶è¼Ù.î0|–Uw°Û@^VáËûò ‚P½Ñ£¼xö»'Ïþõywx[œë·Åçëý®|TNé{ª„ cÚOlïÙy" ãi2PèkºÃº |>¶×aB;XÉm½‡K±Ýñ_mÑgåøi—;œi6|-ˆh6u†ìHŸ½åt´;\Å‘ö)<ù¶$°´Oáë~Vj°°Mªû¦êº|åúuÚÕÕ›IÃÛîf:VŒ“æì»Û‰Ž[Œ²û@¬ŽÇú-‰…Ñ{‘Àënö‹òxÑínË™ßlå±S}‰ýYÚûr&<®ã ƒ¦ºø¹ e”ô¶tzÂí½ rlôÀ…'Øë›KZŒ°\ÙývyòáxÙKìKÙõç8¢ ÁËÚDÖVQbX¶]œ-Ôé%êèÏ%¹µpŽð«!Š,׸;ÆÖ ÏîÖ6)œª•Ö‚ðçRæ0í·7Òˆ*‰È«°ÈZL\ 1mƒ@ѰS™ ¹^‹ï/#Á®;ì8#·ü;.|tŽKÑ•&G Ój‹fzLs®h¦öƒ¯DÌž·û&V‰¼ý.0™v]+™Ö¨[ Ü…šaªxèß-ô=ýŽâi¹Šxž?0Í{dÏÒ̠ܳ5MI¦\oÆuìš.“Þ0Ik¼)¥ùþ¸er¥œãÍ„ëªtßöpL#/ñDÖwár©GD ¸ªzA\ª¬î^G>6”IüìÍ’Kž’X›H©$ЉÐk£Ò¤rÂ05Åj¦€Fa>¤§ÂgÀSœ¸›í*'Ç­C0ÅG¼®&p˜gZà”ÁŸà†Üó»†öf|¨+#ï $x (™ãÍ–«~‚µŠÎmšñªâLÅ—Á:(0LèÅÓqËŸ^£OdžGURÃ=xâ¼c¥Ýô*EËîz7Ýà7|]€…o»úÆyŠ«ÖÝô¶0'vÿ.NCUÚ‰«iJ(Ê >– ÊÈvÀuXŠ„&¶Åi¸³µ/BiTÇm6 ì30%0âë´qÅ.Y’¦æÜâ÷Y¦íöÒ¡‰…jb©>ŸYIŠSADgæãiUA/e%Õ2© ì5´¬F‡ÆýÀ5 ¾ˆÏÍb>Ô!l/àÝrÇnPZ¢¨ve:¦®ÉØ™AÔUxÍ‹…¨´T—Ø7Ê=@JVø*ÌRg¬’cÍ=ë¾R;a>cÀå¸4‰ò’~žM~Úo.‚)«£pþ¥Ö u¤Qèå]M·ì(aÉ/°©BPôªèb·¿M]Øî³ôqäJþexuT†«ì`m†N‘3²•~ û0ú‘X_Öº²kq4©:3 1i92³y¼$t)Arî·S˜¼n£±_¿Í6,ÓèG|Až´üuÇQ)Lkºé³EÂöö¦ÜìèŸ`^8náGßr›Ü&LÔþ ­{;‚ºˆï—…Ý(ä’{­#«¶ý Åú)‹JÊuK—uTŸS|˜í¸'£=SðÛ(¦¢ ¶Ò¢;|`´Èpƒ/á[æã1òO˜ÓõÜŠŒd뱜ô~Ð\ÑÃÑÐ °So£=[2XOÓì嘉„Æq¾æ”üqãlïý .6™©éø)j˹™H­xÍyC:mAŠáBÇAÀBX¢ßÃvßà µ\'Š’ª[î™ šžˆhÀuMž–ææØÜäC¶Gw•ˆ¡•[J‰0¨Zts`'Í6„)à4Š©¨aº¹KÜh4dd÷õ~{Xˆq«éY¡´•n³<àý1‰ÍÔ÷¬€hú)WžlŽ0ˆqú ß-\;ødp6>Ý—8ì²4µ@'ß¾é}jf‚ÀŒ¯¬Ø¡ÛR|HÍ—°‡~–º"КtW ¹‚ÈÚÒšrK¢&‚1Hu·Zy°ÀZò™¯‘ÎFÌÒùqÛp-"‘¼¶c¶grc5ìÊ©âf’&¸ Ž1ýhÕ½^“nL«/xžz]Ê~ðÛiaŒïº¶0¦gV ש=¶Ó͇ɘ ºæÐ&¥Y•Áø°R“¢y›ÀnTþ6é,¹Ä~3; “=Oš¿á¨V ¬ŽÑ^Do\¢èÙ¯ýºâûCC>S'r¡12;0¢¿Ýv"»‘l¥Jгewû¹ÏMbœ_={òÇ'Co(s`¿žh`\+Ñ@ª±÷ðÈ ¢wN`¶Áóîõñøæ_|ñ˧_ÿ¡ºÁ`0…-ö»ï®^ûÝþú‹bäç6(?öÒj>$ºãÇ‘îaéùCø:Æ1¹ã[L®U¯JÓž ÊSd¢¹™ÇªÛÍ|ôM‡gŒ¹æÔV·×­è­õ|Ý1Yaâ#E]ÄÂÄ [5Ôí&"g\úÓéUª/êžÑ’î‘&s”B£Z/€êã’¾¹Ä é™i™øQH®Ê33ôÚ8ŽïŸKaðDfû˜Æ|ÂS’ž/éwl@!UJV¯ãZ m¦~ÌfbàĪràîËO°‡\Å—ó›ýÿ2Ж ÅÂ×~W­õ#Šw¢Z¿œ\€>A-UĨŪNÿ1‹wÁE†4l5sH﹓¡$¡q¢^/3A< ]“ÜäØ ëzð€¹†¦¾Éˆ)ø„¼ÏNå» ½»WïvÁû1˜U*¸þk g0³u‘äSœÏÇÔ {˜ˆ3ÄD2ä§õª Ô‡³è`ÊŸŸ”y\€½š-À6d, - õ‹²a0œêC ,‘ï}•¶Uí¢íí¼‹ÀVå.ò ™>x{Q4 V£t¸‘ÝW—î%`L’Á2Äß±÷ÛØ»½ÑÅiIœ¨e æ!–ü9RŽª5sx(Œ” mö.ìòw ¥¦À4TÉÃÐ}ÕTg8A< ø_81RËŸ5¨Î‚P~äûõ][A*§[îW÷óf¦ÙßýVoõóÇão®¼˜A°†ëI Ó;óIæÈF¶½T}Ù0VáŒC… Ô óžâ@â çã; ®L§Þ :PÙ¾½lcˆ™‹†_6 f³XÝ"lãFSqÃÅ‘§².LíÝj&‹~Åi³MPîÇ,C›b>cVr_Å«Á#mµº@ÿZF­–ÄUÒV WŸ¾¯HÔƒ~ˆEP™)$ïÅ9áó‘wЦfÂ,%åÓäYVxGÃaúj’¶âb=Ø3anâ»Ä¹¹ÁÏZR ½…3äS¹molŽkSùyÚ‹r¥BÀ‹ç?ÕB¾²P\ÑZg}ô€ô¤/g’ g$ô8ù™|Ï3»ãÂOC³^&`Pê­s ³!0è²ßjøäZÉ9W ¹W)%ƒÚÈpB^¨£!ß®„Fèji …eê¢G;z»æË~3Ò[pä_õ1ÝQ*rA²$ýÛø;Í ‹C†8û2”šì‡ÑÚãä‘ñ¬ÁKüŠÁ¸—äPYäʤGf\æÏÒTüØ:‘uK ÄJ/M-¹šê<á¾ïZ§1bÚŸ“ÛT.«÷S.7ywgnDîÄw…Õ6aSk6ÝbÉOäN¾2 (ËÛ_ç `˶ ›RÖÍÈŸ™]Àhè]Ý¢ò¾\Óz<x̹ýR2ÏÏåÄ…¾íœÓÁ£¤|+»À™PêRZ¨‡óì4R\H$®Ý^䨖8NL^ãI(»*Ä¥\È·}·ÅÌnŠÝZÙ…Q7TÈä™Ä줞ÉÔ+2ZÓXBƒ£MÍ/xŒN@ˆÆ‘®+äוNj¶ÏRÙ:ö¬Á­¤àè !y¡`ðþç51·±ni¬âÆY9e¥#ÑæÝäÔ„C¥rÝZÌÑZR)BÄóP FŒµ Œ p=Ôâþi¡<ìž(û @Ó«)°@ÉÝË¢@tÍ`¼=_®Œž”Þ§© Ë ºBóöUì¶.6 —yȘ/½ã‹Âå8Í ö°˳ðo&ÖCåK ï£÷kasÉ&îµ>S´yòDg· z mH <]Eów˜A¼ ™tN®ûIë IÚå9¨ò~”…[š½úÓKÖ˱b½+“#4¦Ž`Ñ$£‰2G‘÷YT-ÍçHª³]ufÕtfÔÚÏ &ÁÜð9Ë´˜qÖXÍÕtÏš”:ÅùßÞmx{Õ Ndf>Î{%HU|Æb˜•ä¡u̸¥L­Fþ® ïѲ6}¯ƒú4Bµ§„G k·Ðf|¤ÐAYëYö…Ž骋ÂÚ WD„2ŹºÎ‚Úz·X"DŠƒR¦XLªv 2ˆÃ:íÓÌD3?m#GEëáNÉŸ`šSé ÍEãÍæš7z–yÊ/Ïlû)(&TõgøÑ”Øö¬·µ© 5МÄxÕ_Ó"yž²~(T‚ÊYOm›@õBäÌfçl÷‡vhÀöÖ¦,´ÙuÂÿ³fg/ÚcÂLë6¯sÍÞk¯ÚÂè=ǧõq‘®j#©ÇØÈuwä'ñ°î[ÞƒU›½ê}Åfw½#GfÜÈÏ"u hÊyÑnÊ÷¬Šy²Ù$¤”Ð9ïN‰[}‡Ú®¦£Q„S³w[Š$¿íZ»fE2ܬjþ-ª,œQjñG³ÔËj½øûc|Ùëjm\–­¬/ãø!zB ûÄ;\ ÷#b„áZiÜìf1r O8 K³CÅr¬”SçÅLÌ/ƒqÌC9å¡RM˜+åPkž£& ˆî%(•z*Èo¯ 7ƒ„¦÷9n‘=Ö0#¤UTN˜Q÷6QeVl9 ia+s×ñÔzÂrÔ˜yónwW„eHqEÀ“§Vä(/?»äÀBg7íÔV¦‰!¾zZ$·kŠ3.ÊNðkÀftwŽ]аߗ›^RáöŸðÒ2±YÁDÓæíùä7¬4jê-¹sBá»^–ñmÊëuGÍF Tyê(5hY¯øk´ôùPæ:±Ç”`„j8QTÆÙeÕ‚(§Cál&èÑ«µÓä6eé¨ %wÉÒ:ÆN†÷½Táìm%¢ÚA°TŠ"<$rW[”Þc7ÝÞÅ1úìú--B%ï'±机ÊõÐcÍ\‹‹®è/™ ¡Pg¥šõ†‰ƒk”,êyÖ(v?¸BåÌÅ TA©Úà#F8«*Á³Ö¤«¶W2lLÈÚšò%çÖÅÿ=ÂÒ …™l–•¡M-ð½+@îõÑŽb̪%\ÅGÙ”zDï‹m„Kh Znäà~ÿ¼íNb5êӥŠBjLN¦ÊW­È.,Çùì~xÕB¸¦×Æ 5Ãò‚¢ÞT€ÛŸÜó]ör°>G¥Cïþ¡¬ásÔfÝœP*eâ­IµÕ85A'S4¢è–½±žº%Àia×ÝäË Q€@jn“7Æc¤ºhyÝ~x&jŽÐÑí‹#©ÆE} ÿž}{ Wa¦9΄·Üm”ñü+µ'h3ž¥d|Pf°º‚¬ûž “U`äK”æ'K@ S8v”üF*]žÄb›)}åüÐíû¦÷Q>¤Ë¸8ÞöûÖ€¦’N]”-ª“^5U¹Õ >/娦€Ø"5Y ü’séÿ•åüÇiÚó,’y™µ´°s]l£ãš°Œ=UL$Ik%)®»>ë‚üØÜÇ;dm¨]¾±äØU5уçYWí+Ì5«ÅÝO€¤Ï¸û tAJü àv£žQå¾á©^˜m:¢õuUçH"õ`÷˜Ž=Úðw„lÿ¨4R,"ÀGsù‚KiE_ß…{9ðTZy¿¬i¦Ý±á®IzÇ†Ü üy@k$¢)©î¿xrÞÒpùLC,9¬ü²‚bì—ðMCË9ìœâAñŽKvjæpSÃÐ{Ÿƒù÷„,0u* ζNÇ„úÔbU¥£?æ‘*=ÎÒé¹xþÞj?¬Q[T{*Ò?š:=Ô`ÄÍô8fZ]ô•Öêɱ¢Õ¥ÌîÏu­0µºˆI©«ZýœÌ¶,…×”zMsìºRÇtYVÑ»ªÔgØvžN×â|å¶®ÓÑ&¼O§XSºô¦åXO:,\m¿lÒ¸GA‚….©½k@’{×X¹çúªÎuˆÉx9ýa0­¤C„Û $Z!¦Ê{˜wÕnÔ’ÂJjµÅÊ¢Ù$ãµ(åFð–Uéƒàž§­èï‘x[„©ÖrîÒ§ÃTa©•ø>Æ1ĺ‹R ’üüY›üJVª¢­†µÅU”¦*P#: W€¤›ŠgùÇÎVþ2@ áå"›ü)í\ü|ŽS-+˲í•÷ì¢Õåäy®´Øð£+;³ÄaEþcoðšN6•U÷°V9•ÉÂTO'+¼íÒµIcXÉ׿ ¤N!(Jqj»¼Å„?uÆ¡vÖÆ¿¨'0à˜;æžæéÈY–r‘L¸>‰ò¢L¨¦nÞ¦îa£æ¦}Ã3½îÎ½á¹Ø‡t»… ®–ø+ËÁ ‹x³±nê«ßçGÆØ îmåìÇ®öiJ'®kËHúOþ ÀSendstream endobj 422 0 obj << /Filter /FlateDecode /Length 338 >> stream xœ]’Anƒ@ E÷œ‚0¡;‘"oÒM­ª¶€aˆX!‹Þ¾ß?I]|Kì«ãéõ4kY},SúÊkÙc·äët[R.Û|ÆbS—ÝÖ1¦K3Õñ­™¿æ\"!÷w~o.¹úŒAøis/JS—¯s“òÒŒç\B°Cß[‘Çî߯zw¯hûGjŒ ˜fà¶6*Dà‹QÀÇ­QÀ­ãÎ(àα3 Ø#މ<*úQu‘µÑkãÞ(à(£B@"Q˜,ž,Ñ(`t£€â¨FÕ »ïJp‰ð"áE­QÀÖ“NC|‚ö…Ä-#Žøp¤7 ˆYæ”Õ *検•ú¬í+-¨[P´¯´ nAѾ҂ºE¿ÊžýŸÏåê«ñÜ„2Ý–%+÷‡ûák1ŒùoÅæiöª*~Õã«Qendstream endobj 423 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3554 >> stream xœW Xgš®¦é²4ŠJM‡ªÅÉ51ºãèx‹Ž¢‚H4Š —hsÓ tsôùuWws#ØtsÛœâ}F£&ã˜ÄÕhŒ ™MfÝ蘸‘Ÿ=þÎì$»3ÏÓO=ýT]ÿWïÿ¾ï÷þÊÓƒ’H$>«V&Ä…Ç)ÂãSgLŸ£T„'»š úJÄ1⯥€·ý¨ì–Áp) ÷l3:ÅrF¢°Q”T" ‰Û½8!1#96f{ªß›Ó§Ïœ:•\çømËð[4ÍoexÄ΄ô”±~áñ‘~+§­žæNnÆúMJˆ÷Ûµ=\í—í·>ê]¿à ¥A~Ëׯ š<í¯7÷çw)Š¿(aãâ%É)©þÊ´ð]«#£¢c¶Ʈߩˆ{cE­¡ÆQk©¹Ôxê5*ˆZOS“© TµˆÚHM£–R˨å”?µ‚šI­¤fQ«¨ÕT5‚Iýš DyR&ÉÛ»Ç|³Ò%Ò󞙞½²Ú‡.2‡a˜£CC†^÷RÉð±Ã3âO^•^_ެùí(oÔâõßS \¢Ì¥vz£‘WÈLJuˆÍ/[]! –}|3 ª¸ks%·óªªøêu°‚Ã"Wïýc¯àqj­â÷PX·‰ßŠù¡jð^«@´€¤z«ËÔPt”߇VÉØ¦ï÷Þ<{É÷#0çFâln°Z«àHµŒôq.˜ôzœ¨ÓåÚï£1÷–Ý÷a=úç£ßÉ+î-»†%eì_\*ÿœa›îUÌû¿ì;àAk²Zú:€Z3s –ÓÄèÔóIqßÇÐl*âᇾÊo™eè+¹úw«fc)0ø5ú 2ÚZ„ÂãÀ£Q4ûþ}püsÞFoËUKVÌOjFÓ›ÁXhk9Šê9´–f=¿ƒ†ijÆKÔ«ëÄéN‰hA;äô«9ñÀ£Á’4ã:Òvì”ãN¥=Ì–»NÅxõç«_B°xå.~wÃ]v{o¿ŸÜêR¶Ç´ U„ò]ºtÞ ÎÏÑjpvp˜C'4%&³ÉÊ ŽzËQ°º¸hý"ˆ,8‚Ê^ú°©Ë’ÐTüG޵îÀ!ƒ˜ñnÌ:„«Ð |'\…6²ƒ\*=Œ%¶N†õoAÁÈ€.¿xÁÒ <Ù±«oSJWÿT—ÉIû×£l¹¹ÄT˜C6ݨÑçîÄãðð9X€ƒZO¡®S¨mn½HŸO×á L¶Q_QiÂ+P®¹Ê\¨^:ÈU­ZÈ)ÚÃOM¼ðZ<3‡Åâä‹g @³y¡´#†!Mà^ê NÑûZñ@ÚoA}òfˆ%hþ-0ÿC°µµ¼ ÈrgèL^)@¹Éj^©z(T™ÜàkÁY*N§ÕïhÜY€½`“nf{YB²1©As%Û©ûb·jqþ»áó€™ ‰çtwŒåFK.䀱@Ÿ¡Ä§Ï4”‚L¦»™ôí°w„5: s—Ë>u÷\ÐK©ëÐoÒQ¾ ­J÷F¿½RZ×]·»Î‡]ˆ£Qòâs²dšíÊ[¯Z ¼?TþÁ\u¹84Ž&áq4ù#©Éšóžß$^ÉÝ¡·à¦4<òªvà¯Â«¥—E„>t¡V¢£É}Æ>C.>lA18Y !·f†ÝÑ+ÖÚÚ-¥×¯%Ñ/„(à£`Ä‘qÏè‰s8ÜMw¢œÿG1Ã~Fèö‚¶Ú…Ïa?ðûá´ºµõlù#h‡ºé­xÏÏ3ƒ>­vª]'\è°KqÈ›õbÒK¡ °ø$!Û'?çW<^–õÖÚå‹€Ÿ –ãEÝ ËœEwžÝ£>ëM>¿ž3/k:zø³p²±óìYjäª$Mü'—÷]1{`—˜íî?ÇëI5ÄSŸEÞ³ÃX˜ªßÅòô:­¿†‹¸•¨YWÞZßIøI^{è!ÒgæÙ;ZÅG hŠüWY²MÚràËÁVl-AèWVSw¸ÇôÄ\™.Tùõ §7›(jûäÅgÉ6çå®KÒŽîËQ“µmæ Ù:ã;vtn®|æÀüÍêÚ¸ªÌzhGµµÞ\-[L-m]¥Ípº"³Þd4Ñ!ú¥úåqüÜØØ‚­ «ž›ýMòG¾=pú@Ãq†]¡¯?îë€**n1xf—œU¿‘5/6Ôwlo+:UüþÙÛh®D\„ZÈÅ»L4 èD¡•X62Í»šÆ¢…\Çþc'ë;Úì9n"x$Æ$ˆƒsމP…õ«6Ør »õ»U9Í‚y\ÀÃ|·uÛxóžªâjÃ[]X¢Oƒ-¦D3ïÞ\“±c Ë×€!0\·Æ «×*êÍͦzà¿Õ»[X&hËÍ{,ζ–Ï>=?‘³©Kv5ÆQß<: À˜›{.px”xNëÔ!ùá·}{@Ïió72æ‡ ˆ!½‡¢ãÖ¾Ol—™hôÊz9B^ ð¥`)²•¢úGp&zÊÀÕ´°_ødp(]†öµpÖ…Þw¢h·~-»ýÉm6R-Ö>×ÅCñ{[©Æž #+RÛ£êƒI³Ãˆ¿MNÃò4ÌÞš„h¸]­ûšÕ+8våDr¹>ÃhÈÉdØÔ{Q›”a¾¡°³>súÁÂs…meÚ6¸·œ68UZ” }†ÛÜN&¹Í-ΑàÛ#—£—ÈlÌ7k!ô}þ†ñ3 6Âö}»;”'J{ˆ¡fÚ Žªï¢î»ÃX2žÄ‰Tü}¯çD^p I;³ñrœKìoro]+<ö-ˆt/;ãi’Co}Uäôní è©îQõ¬¸‡<îù°ë)1¢¤ÜÖ¡hÙKaꆌWwá!Ü;4»‚"[öÍj©`|ýi†cÔÿJ ŸzåBê º&Cô" ¥Ùé§É(ÞÓ{öÄàØ9ºô]².µ<½š`oµ¥Ö­k¼­~p´¦²AªÆ{O÷¡k¡×Þíí¹†d×»¡Û‡õôOŠ“äB•¦9Ò!T³iÃ¥Z¢· Jßi0wYÎ|†«.ØZåHËÊJ١ٮUF5¦¯ÊŒÓDM/Z¬úz=òòEÃyv•ß°µi»672l*×øÞ:ðM&ù«À¤°ìvY›MKMuukÂA½¾›WʯÛ:ò:”5‡Z;¬{ÈÔŒŒJW 6¨ô™¥ªJ(G¡PÃà ˜’ë5;Ó“sU‰ D€ê-¨|`©aX£ÞÚ`k¶×•”56€{9Q—ÊœxIžü›“a¬é*>MÜfAá±£GòmüyšÌeOÈžÅüÈù§Ä~–ɯüR&Ÿ Ák”1Œ‘þ=”±÷_¤û¬ª_Èå{¿'¡øŸOåwÆPJ'1ºÓNÔMfè”»Wï£où°ýª^¹Éf.uç=Cž¡ cITF2lS—éææ‚Ka-!ö‡µ½ËoTþÛįðD©/ÿec1"sß¿=Ÿ™Ï!dãкÁ¾X"ÆæBí¯^©‰hj‹9£Ù7Àõ¥µ‘ÁÓÅ™rÕ²è¹xYKJFe–s™SàKÍMP _’êRðkn­È/ jEqI{ï'JÑý‡[‡€€¼ôÖÂNþ¢(•±ã±Ë¡H“¿‰ÅÎçXJ…6h5´yÖû˜øPniȨƒXHNÐ%kíIû ê-uÌ`P&‹¤¡ Bi &!¤¶ù“´“ÚoߕۑR6€è@¬”Õ‘“É,G šBh=:ƒšð‡5¸´±úì±ÀG° ‚cÀ#ú?à+‚ B…µ•acˆY ÕBÅ^ _fn;GïÈÁ³~š[n‹Hz­±=¨µÇ‡½%‘׎%ÄŸæ_GËfÍ$ð`¹u¡¬èj×a³Ã=»âô91`ÎvÏ.»±Hm Jß­Ê+À³°wSL%ǼŸåž‡€$ϹWõè³÷ϿڤÏàõ»2t»žPN"4A£±É=’7ˆŒ$w›£HÈÝãÓ?ÿKFŽŸ?·”§›ºÒ…Áq°­zzºí?óËJJ‰2Ý[\ú÷žtÛ~é¤û7êÏ ^†‚KÐ §m5ÉK/eŒ€íš¨KÒ%•%¶ËÝc+/Q½²¹@c4‚ÎP`ÕY¡ þõ ;òŒî%|,E[NË­Méµñ )Úxm|uJ1éÆZkã¥tŠ‹«P|©ÍI»†õ½ôÊ0Ïõ Ç:L$’˜Í¦b³pqøpŠúmrdendstream endobj 424 0 obj << /Filter /FlateDecode /Length 225 >> stream xœ]½n!„{ž‚78Î?âDã4.Yv^€ã‹ÂÂç"oïÙ=;EŠéƒ±lw8~K^twjs¼Ð¢S.S£ûüh‘ôH×\T¿ÑSŽË‹Äã-TÕ¾Býù­¤ ´òw¸QwÞ÷;9ê×Rœ'º×©…r%5㇔¼¢2ý»êÍÚÓ+ºÛz‘1p5ì?¼È80x0-‚V–ÃÖyÐ1¢g¥k¹kG/Ž@‡™XÆÀ: ;;<âä!8Ïý¿ÀËxÿ]ÇGkTÙ˜l„‘ ý-µÎ•[ROÃîpÜendstream endobj 425 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1539 >> stream xœeSmPSg~CȽWQs%ƽ¹N]ZaéÚÝ®ÓÚZ”J- øQ¨0%6. hP…4ˆÞËI‚ ̪ˆXª¨V´«w¬ÅíÚe·Ì¸»ÓÙÖV™N?°3.ÓιìËŽ{±;ÎtöÏyç=çÌ9Ïyæyt$1ètº¹yùëÝ¿uÔ<š•‘íÞQ9“Z¬ZuêÂõgz ¥SMåÀ¨câ› — wÌÇâ¹øü<¢×銫jV¹=ÞºíÕÎ]â/³²–edhq¹Xá³3ŵŽm.wÃN×vÑQS)®ÍÌÏ Ü Zr»øswXQåtìxIt¿$n¬*7mÈY¿A\³~ݦ é™?uÿG™]²Ê³¹q[SµÓEÈr’FŠÈäE²šl!¹ä9’GÐÎ"‰äº®X÷]Âó £úåúŽDoâ§/žMº«¯òPÊõ†LƒSRøSS™•t–†qŸÄÚh, Yøy¡a8i=¥0¼(96ÃV+?¯ž‚êggÂ9òµËûÚd‰¦ÒU©ô!|Ñpã^oÅR(³ò…Ûà1pj½ß±XG¯Ñ2zÔß"Ë.ÉÂKrC}{ƒµÆÎð+C.ÃÛVÞw>†¸Ä)¬*Á „ƒ!\ŽîȚm†ßÜë=ÿ-\´òÒ0Ü‚!‰ÓŽy*D|ŠúoE÷ÌP¥Ëú©6$ÛhjöCS»°—>Hç,†ðø‰â÷ílù¾„«!$£üõƒ[Ñw |ûôqʇrpý`¿ ]ltyý²¼·Ux®0ÿÜ£kÀBƒ4ƒ¦Su öbסç"kKº›ÐÛç|û÷¯·âÃÿúm6ºÀLå¯Ýc‡?” ¾C€,¿È=@,6|þÝðqàÆ®PÓ ª+︢~¡èþ©¨.E?eÁ7“íL+Õï¡IÔõ!õFg·6)jyÝõÂt”iÑÈV˜N´Œ½"phf¦Ó¦?om |–Úƒp\PO2Úô²;šŒpRÑW¯éÕÏÌÊj–>‰[pšÅ‘`QØ_Hi!í¾tËÝ{÷·¼ÿã©éȆ†Î‘h‚Vþ‹Y4¦Ð%MÕ°,vö«Ð¤Fëm<F:m·Q‡ Ôl¨´3h ’îêî.$mÃêÜaÓ[¸p~ ç?ŠóSø¯Õ:œ•Û¯yÛåæ}BmÞ–ÆíTà’KW͘Ó{á&åÂEßK×c¥iWäT«8³Ëæv¶½ õ°»có°«YÊ®‡<®dd%Ú1ç“?]hÍøBÏÉ ëàk-”¾@yÄ÷…ƒ¿ wr¼Ñ³óÒùu+¦|r]©;»û°màpo0÷É~hãøÙžº#Þþþ#='êZš\¹Ëþ=Ï2»xÆÆÇ!·Ì††é9ÉÕ•›¨™7_ºtmbÎbN£òÿçPT}‹ûˆI³ƒ[‘Iáÿ¡R³¦önöûMç–> stream xœ]‘=n„0F{ŸÂ7ÀüM‚„¦Ù4[d%¹€±‡ÅËË{ûÌ !EŠgñÀóŸ«Óù휖ÍVe _´ÙyI±Ð}}”@v¢ë’LÝØ¸„í×t 7ŸMuz÷ùû™Éòšw¿øUŸÝË ·ê}(¬‘îÙ*>]ÉŒÎá8Ïh(ÅjØ'¦ùØúŠ;­4cׂs¼²¨°¢*¬k˯œã•µF…µmPamD[TX[ÑÖN´G…µõ¨°zш kdí ×ùfàÐ((àÐ((TXA9~]Ê‘šVmx”BiӳЮ¥â%Ñßqå5Ë”eÌÄQƒ»endstream endobj 427 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1897 >> stream xœeU Pgîafº[•™q¤DÓ=^ñ(jbŒf•5*^¸F9”ˆ‘k‡ÈÀ€0ÜÂÀÃ9D@…„h ®"h U)ݘUÙ$$âÜ7¾&¿[n³Æª­Ýþ«ºê½Wõ¿~ßû¾¯e”Â…’Édê5~ëq¡;æ{­LŒ Ý9”|S'Ç»ˆoÈØK³• ’ƒJq|<Ó¯ÁÝjÜ> ×»Q ™,(Ò¸óc|ÊÎèÈ(“~Ž·÷\//éýž~[Š~ÉLýªÐ°£9!&Zºc»~ÕL¿™úµF³”ŒÖO3îÐo Ð#ôþáõ–­ß ÷]ÿ§€u¦Ïüßïz¯‹Š¦(Êm{xÄô·¼gÏ™ûö; ¶üaKQ˨å”/åJ©(5¥¡´ÔhJG¡ÆQéG “Rji^JAí¡~“Å˾tá]ºôËãnŠpåeˆ2[ùz }…‘/]Ö®¤²œ)‚èæÄpÁpZÓÒ‹¡Ý¶nwíJñÂñÍ)9Ç‹íi2=Si`®—æó$’‰:±¹&X¢&òDGF=œ‚š®sÎ_Ãh}ÐC)Ÿffµ aÆ„ÍãB ¬.¡5þdÞ98 Ÿ—µ9ZêZÏ8/@t$4±#_Ên/¤²š0¬ç;e½Xr].ú¡J·×ZžžY»»€‹œñŽ5¶@Hm\{\;\…FÏÒö}àè  ˆÛŒÉÄ蚊Ôžîà}ÑCGöÑe¨ï©k{É„"ÓP³¥G)D™€¹‚Ñ©A×n¸·ïž»ö¶8bP¥ûsèÑ@Ÿ9zŽ(Þ3|Oº™-°š30'm—¡º`\³²‚™YR°ÿ87P%Q¨d´£>wæ4§X eù{ S²óvA:ûÉáäú†C‡ë9©ë¡¹IIú-Í,Cë59~6ÜOEÚ]ƒû¼ÿ–l–57/ *2xÔ“±Íd5™@>%ÃÉø!éé……ÇæÙrË«Ï_(+åÐõN\¨’f’/ˆ æ'áíø£Y&z´ËK¤û‰`áÈYì +Án2A¢uÆ’&“*y”"Ú‰Ø+9ìÀ³L¥¼D ­•ätuÊÚzÑÑ+-xSÏ3¯®n½»ÀîD!^cä’‚i+mov,lÿã×ÉÒRª:ÿ õ¦­®±s*t°fglHš¸Üb€hX^ô,ó ôÃEø þºÿríãoËÀ1øjWw…?ø€/ûª¹´¡fáªVƹ¸aŒÅxZ+Zyñ"ÓPPÏm LðÖÀ4À%ø¼}QÎDX3<¹(Ýfû ÎHçgh³¾¾ì{|øìWAÓùÌïþÖg8æ¾»¶Aü}u±´Õœ³)#ywÎbH•½œÆq8²ºê”P]9ö‹+]—áï,Ÿz›¨9í:¢zß{NðÉÜÊÚ¦ª¼ÖpqdpG»¿u׺Qâ.\¬ƒVÞšb¿ãìºß±ZÏÌïf_™¤_ðáâˆ#©õM5ö£­1•‰Eܩ˷m‡€Õj:ëoåL^¶#Ô’ÊÇÅš Öæ'æJœ³”ÁAî<}çü‡yí%Ѝ—FúûÔtFqÇ8^{Ù§Ù䈉7î ó|ì‡4Žý¥ï!÷stÄè7¿‘‹Vœ¯&ˆL ”&Iì³dqäæ‹0¥[æK`g.âL'Ûp²U)˜˜EÖý­üŒ #%4–ˆJå빟=˜ÞƒÊÆ'êzšÍšçBE_cßá>wíÅi ›uȾû„¸nÚœÎas ÿÓ¬SÀ¢úÖݪý¹¶<ȇ¼l~{ZHF€Ä¥àªØŠ¬b+°é™Â“v&2ªKm{K‹¹Šªzà3h)K>¹'¶CDa€qkr\Xl ¬‚Õm¦k¬¶3ÓVXàá´jjÝqÀœ“õñìo½‘áµz=ªþ‰n’dS'S m,å²>”Ëq«8\w,ÞnŒNŒ7F7$:ÙœéVü_îÕÜ¢„K%1ÎëuÄçO2ï€y¤'”ò•fqD;.h—u  )VÔ9 û×0:-ARh TñƒjºªFR$‰R8ÌC55f–juCµatUÝÔú_æòDò–’­ƒ½…EéȨ‹Æµ€³Ûp8Ž»Ð^y ¨ŠÙâü’¬ÔM³s8âAôF²ˆ ˆ©Ÿ¬Àño±¥P1ä/?–Hñ¨ š ²®G¸¬×<’a¿d^“î“•Õì%¦*û¹fÞbõ¤³¶ØXC3Ó–(ÞŸ! Óˆ|Ì€)ÈÎÅyi¬?/.Æ@Ÿ±}3ô€[pF2ÕÆ *[øK ®=øàW¸Ç¾ ÉRÝÛå³ÛÕ€Š,Ú¥ѳ¶ÍÊaq€¹›û0 :vdR­øAËKkiÁõÖpÎUáoT s =ÅÅE{J¯¨Tõo¼ endstream endobj 428 0 obj << /Filter /FlateDecode /Length 449 >> stream xœ]“±nÜ0D{}…þਹ<‡mœÆEŒ ÉHe¨°NÏ…ÿ>3£\гÀˆäîÛ¥xz~ùö².÷öôc¿•_õÞÎË:íõãö¹—ÚŽõmY›îÜNK¹ÿuŠå}ØšÓó÷aûýµÕê|ø×὞~ÆËñ©;•ÛT?¶¡Ô}Xßjs Á¯óìM]§ÿ–b:NŒócëè‡ú±sØÉõcO;û¡~N°ÝÙ%¬^h“K°#­¹¨ÍÈÚ)saª®ºú‰«ýàRçJ‹l¡-.¦…Õ™i(¬òl"lï,ëFEQ!Â^\‚e ñÉ%Ø'Z DaDv…‰‘0V*DØÎ%XŽ.¡fRÝĺ E’ %J(’T(±PBëIí#6WCVêÜu> stream xœµXw|Teº>ÃñÐÑupôœ`— ÈÕ]QA¤II¨!…ô:)“6}æÌ¼3gzKŸôB1t¥ª‚€]×®¨[lûMürwïw°ìUïÞßýÝ?2œœò}Ïû>åýDÔÈ”H$ºmùбФ¥ŠØ´ä¸Ù³¢Ö$ìÌK‹ÍþuoxŠ(|ûˆðâTÌ?n@cÅ0vd×íwüá–0s3:>y&RcD¢ éÅjðî@mó¢Ì,eNòÎ$E䃳f͉Š"¿s#w(#ÎŒ|&6.5³ 75926#>ò™™+fF>›Y@.&GNËܑ̈›–™™ù\ÂÆÈukŸZ³6rñš•ëV­>ó—ùó«±iYI±;cÓÓcÓbÓwÄÇf%%ç&ïL'w$(b²r“Ó23f§åÆå$g)(ŠŠÊØ¸0zQVLÎÓŠ%yKc—îX®Œ‹O\µsuRòÚ”Ôôy<:iþ‚1ã¤Ì”[&l§¨•Ô\ê.êênj55ZKÝG­£¦Së©û©…Ô *šZDEQ1Ô“ÔSÔbj6µ„zZJ=CýµŒZN=K£&P©uÅŠ,"YE6/²‹"'5“‚I‘!þ£øÅ‘úˆ›"ü’tÉ7]¢5ôw££ƒcÖŒylḨqÞñKÇÿm‚ebÔÄ/nÝòð-û]þ­ë¥«¥åÒƒÒo'5Lúö¶E·½.‹–‘gÊ_ŸüÔä¶)+Юñÿ±q>¥…£B"ô}ù9qøet—Ô«N\‰‘)Xœ²6è"½·®ÁSï ±ÕGúÐ8A¿´½wÑì˜eŠ"Æx|GÛØ…ñeqré*0Ñ?€×j 9™ÊWjv]ã+KÉçÔeØÕ¸˜+1(À(Wµåþ*w‹±Úüœ ¡eÎ3ä¨ ¼ +o;òÉç@ïó$¦¬ˆÁ·ogµ ‹ ÔôæÎ¤׺ѽnfü?Åó•´ ˆÚDÕR¿tÌ«™/êÅRtFöò¥oјöæ–úžú~>`õTÓ¾²ôÒ˜DHàwm(ƒ½ƒsYX¥Í ™Pª.ÓiñÃx¡ìh“1ÎÊê>»ÜkõZ¡’ö«€Û±ƒX&Vð9äq¨½èwjò<,ÛñN\`0Z,£Éß(?0Gê6ÚuÙd1)ħÕ¢Píµ8\-æü"E¶ÉÈâ\ƒG  Aò>×oÐ 5>Rß A.Ôp¨vm)ÂüŽ•ãÕÀɋÕeÏY¸yºPGn °Ft+A0¬ñi¡òÁVÄæÛ 6ðƒËÓé¨íDSeŽj+ïö +ꑃ­­»:^vÈ}BUÑd'g÷QymQd'S^êUŒf™Ñf(ž|zõÓk—mzöÔÃhÖ‰Zôð_Ñ(öô+×^øè¯N-Àtg «!% €­ÊÁœEîÞìÒr‹ZÍ<µ@Üò*ƒçâ<œM@˜K:K„¢>x­wÿö³w*?ž¬B„")¼¾ ÍboøáËâpê”^[sá±èM;ãSÍÑíµ‰CÄÔ*•Ée+ûïĬ êœÚTÄ⑃«uÉfý6«ÔP¨s˜ÜM-<4³» ƒkÚ xi 4š€äïCp5°Œæ¤F4ºÝ‹îcñ<_šüÔ¦”D —–½ë°ó~öÚèjjj®*—w¶µ¸*î­OZµ*ߤLº¢­ž‚Žð?–#‘Gê09µZ‹)_Ïl÷oZ„“„DXí68å#0ƒHr¬ð9¼Df6 æ÷Ø\¼éA£_@³ÈÂþ <þŸ`*á´.ÒÙáÅ’z°ZÕ¯ l™ÕλÀ.y|åÍGï| "øÅgâð’ð8igjëÆg¶Åd2º};Û7ÿ0þº¾Ùìèv{U;š$³šԇܮ–Æ=@7V¨€M7æåB6]ì+$ Õu]¡/Ðú@Úß!H +¤5è ¾É¤ÙË$×ÙÜÝ J˜JˇI,/"¥Sùg‘ŒGÓ¹Q ·–³šAy@ÞbËà9;Àm/?ƒl²/%¯º‹3ô Ò§³MASç49½À“î<†ÒyØ€—ƒÙ§ÑXŒÅ&&ÿQ…òa gIÎ!«}/‘™M¨KY —Śˈp´‘×{|nÙ•(ùvÁhämhC½$¸ŒLZ §62ÛïZŸ› t¾&°«Þæ²W²WÑÁˆk’ïPË)Ù9’.t§£œt¥Ê[ÄeZ’´L<ž%€Q¨rC û¡dî6’^דpô«×-â±Ç(Ï´¡Ò`;j¤ã3¡ÊisX šîötÙ¼W@ÞH^â#ªÁâ[9,å#tê_ÔL3W¶s2|Rr ©<]¼÷ò¿ýè¿È­R{C~ÇŸ³„ d®¹ûº(ý°DöeÔNJžÆ-šÔBË —üÚs™æçÝ0sꜯ_î½aæS)Ç”®-\; sÈÀÝÉ6#Š/÷öØËåŽ:o·ªÔSb̶$ë˜ÇñQ‹)nÞBoÐìë>ÞüfãEÖßêÝ—Ú=#ߣ¦­ÂÁ4|ÐÓÝ´§Â’š«Î0”°‰ÓòW@ =ãbÎÑ ]ûB•ŒoGgö脺ºŠöÊ®ÀYÒc¤'öz¯[ú€8¸ò”F°0ù6“|à¶¹m.49Ü*~èz7TûÕ`"Ïa9¡/Fº¯ `6kY3¿©Š6C’|Æ‘WI›@à»›r×”%[vÆœÒtµª+β¡O!°y|òCç÷•7ÝÕ”¾ìGsmù!r݆@Jzƒ˜«±XÏ$?° Kð@GýBlTQ`œïЭÌ#YlÚ0ãTÿ«(Ž —¤è7QšÌîÚV ýçK(êû°ï¡* ß,µ Ï\C¤)6”h³Q—fRÌ“mÅKL%ÛŸZ òê½Ýû+Ït|ÈVRZZ\b.=[¥®niªï=´¹ûI<Ëñ]xêì“ó¿Awýé;¿àþtÉ-ô›5l•èîð«CU2Ck."e0BÙÅp+±fX°äÿo‚%ºæ Zýa8« ÝóQUHtäSô2á졉Òý[êv$/WNKg ùœ&ßB?-)TéK5{Aòø «¼¿hÖ›HÀ)¬ÚÏ{º œ®Sú ³3ò¶îÍ}þX艹*¦ýlguõ£K²÷oDƒ"ößI‹ÙwÒ^|Åé÷TW–ׂ¡Z¹Í¤I‚ZQ¥ªnl õ0ã&‘(ÐÓˆÎ:Ã-Ò×—^Å·1øõ«ù¿ªÝ°aŸA|Z Aw"ö4’Y/…ø‚‡âwFo]©ÛFà*y5\Ÿ£¾¼{$ëiÀ·Ã€þ÷Þ…ï ‰®\£Á%R$¯²’·‚kÈ|4Yú&b>Iqä=RËH|÷´Ó«.Ÿ:pÀçe­–,3i“§My!¤X3=­_#[+ÔÕYy©Ê¸Ý_ ›/¿Ñ_δ„'I7ᵆlEN^¡<_™¦$Š]r¸÷` Ýô"ÛthOoЂ¤Æ&Á”&ñdÜøòÕ4!ni!SHet*<ú.s-ó1|8I ÷mÄex~”±Sse!Ðëc¢78IR~´-ù ø.6¢;_CÔ•¯®í¿ô_¯<Š'³Ø2ø˜J,)[®' [š {z{zûúªsŸ”ðñi?² ½?tÒ±çg'%ëSŸ|î§'{ö¡1p’>×÷øòMi[™7Ð+¿®Ý„iøžÁ+¦!=•+jŒžŠ ÐÁT¿úxø\CnsºwY¼§íxGS¨¢­šŒ{|É;×%`Y¤Na$âú³ÑFÝõUOúHôVÿž~1êˆÖ”V(²²²³ ƒEõu­u­Œg0ÿ';Q.Oyvãõ8ƒu§ÙÝßú[Àæm’»k~pQ ¿¦™ùú|“†ÕeoÅtñvMvY äÓ›;’’EÝã*a¶0ýÎj¡Å—PÉ%qø¤’ÂÅ䎒 ¢®Äþ`Ý’*Y–'¹ŽÐo¿õÞçïžÞŽG¦š”``4~¯•¯´3GQæÐÌk´XJU̦5Ù64;ò—†!/Œ¤ÿcÿp3îyéägÂèþS•/X¨ØHÄ¢°Ì×Ui¯³W°öJ¢j^8¿¼åa_[U{{]ýÁ#û÷'qW›Åo&æm°YÀb3oâ´ñ Ê=Döv·*vmÍÜ¢›·ˆINˆK(ù&üˆìÑÃrßÉ8<ûÐ gC÷N1,=ñ4f•Y8[Õw¸µ©¢;Ä4ìõÜýûÃéz`‚@²~›dÕ‡ûN ‘ìñÛÖ'2–בYŸS›êÈÙ³¬Ha<ÛºõÆžT¶ê—ðŠòßÀó€1GŸ©Kg31­I´´)rS6Œ´ðt›³¡ÝÍô#8‚Æ"Ⱦ®‰Å’‚õ¬6פþW¾Jû)üx>Z÷- ‰Ñ6«ôBÎîø”‚œÌ¬šì]þ€Ýãex›Í*œWØ,¥O$­LIaI†e½Ãäð½õ:uýEðèýïÄè¹#Ò–ÜúŒŒÜÜŒŒúÜ––úúf|˜ÃÊüïK DáUd¨õ¨õzÎÀ1ø¯ÿXa,#C>ÈÕ­/À»*É”ûù÷ H°v‹¤ûb¬ÞbCáEäñ‹¿:ÿüOâf¼2û‹qÓ¬G@»ëh‹«ÙÕÌö¡ùŽZr§Cþ㤎ï|S‰|¿Ä§ª¬õWñ6Æî îA3Û³ö™jàìÞWßìÙÚ¹÷_GDñ¨ÓÔ»a$x¦@ >½Cå !«,L~üN—|ra÷œôeÌà‹8¨6ꌠ’ƒÊmôÃä‚, ·‘ÜIû<ûÓ÷!^ ~Cí|ee.R ÕZ­Zë0õl8„­ƒä¯To4€vNžÄÓ&·ûnø8U½×§I!¾ß/uxƒžãôdJŒI²…4x£¾–¨¯Ÿ½†F×¢QBé-^5áƒrHªÛ¼Š>sš=óÐø,âàÌþǾ:{¹îôkL`ý®´}@i;VÁâÅ»¥s,Pó_™¾ïÜ¡FDµ¿È¸r´º迾íÑDXm+Ì.â ±êüð;—Eè âpoxîÐ!%g²® 3âî‹»×Òfy-þËÜÓq‡ž&aâæ§ðŒ4¼¬Ý±Ý„DVQÎßûð¢ùÏ‹ôlÞÂtLC6­vèÝw¨ÇÇÔýÉ{ÂÞf Øö@û_Ρé½oºüþÐЉڈÅë(wþÀ†Ñ‘°VÞg‘o¶qvÏP®¯ÁÛÃdù'×6MšU­ó˜ÝE²tÃâ/qƒ ·à&•Ê`€2yQPUQáñyÝ 2 îçï<ˆ£*òŠj,:f΋×P¹Þ\ÿ)f½ÇQŒûöª4®ÈÄÀsŒ$Ëß.‡—æ£ñzE”LµY“ (ŒËâpج<ÏØlÎz>؃¦ËÐCtšh2hŽôîÁVò‹:á¯r@cßG‘hz€Fs0#<ú!RÈûU_‡½f:±æ«œ—,ÿ?NŠzΠf@Î…/­Ï%ƒ %ø÷XŒçâ1sN=õÉaC3+á`Ú^º ƒÅÏáÛ¤°¹`nòÆøUë²É×u¹ÕÿNç)¶ïbØ÷ŸÜKÓŸ»š-|èJ;ºõ]@ÄáMaNzA‰Ø{0‹gâN¬ŒjÁâOÐT4õ"3ß!Å ’Ês5oõ¾Òt¨û8éºCÎekbts§±ÚT©zKþà ‹’'Äl:%¿å³>çÉÆ? ó~*|,µ ÝÕ&:ðª}ß+å-$›À eÒ ‹^Ý÷a§»‡÷³h®¤¢ *ƒ*’ÝñÃ’ú÷ŽŸüè6Ie¹XF.&Ið$<ù>…G¼:ÿ»óç{ÖŠjÛ(Uhà¡è³ó(­^¦Þ“òœG82×i™eËKH~ÝZ|ø §m?ï`mdŽ­©yûmÂô] §Wýñ > stream xœ]’Anƒ@ E÷œbnÀ q"!oÒM­ª¶€ÁD,2 B½}¿MÓEßâ1¶x`Êóåå’§Í•ïëœ>es㔇UîócMâz¹N¹•¦´ý’Õtë–¢<¿vË×÷" 2îüÖݤühŽd·Â>”æAîK—díòUŠÖ{nÇ‘ Éÿ£ªÙ'úñÙÚóžº xOÝ×ÀÙâ}PDc°æ¤§5.5ÞWIs žÝ6[¼G-ÚCÍï:¡¨©B0 lñ>ªFÄ\´Ù¨³±a °Q<²xT<±xRìØì!MÁh’¨@a P€#÷¨@(ijôÉ^Ô™`DfEjE0"³"µ"(i ê&žŸ\—¢ë}nӥǺJÞì°ëj§,¿É2/:åâ–ŸÐendstream endobj 431 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3323 >> stream xœµW pgšm!0 B2#eB·¹6q2!d&YH »á$€1¾0`ï[²$Ëò%YÖíO÷mÙ’-_ò!a›Ø ˜#ÜaHB–Je©° ÉLfvæ—ÓÔÎþïd²5ÙÍTíV«ºT}Ôÿþ÷½÷¾¯YÄôi‹ÅZ°-.Ž'ÎGÌ+.ÈZýbbN^y1O8yç"?gEž™YÄ1¦oé‰ú͆èéýÏÌÏx ~YŸ@ó‰™,Vjq¥L©3oà *…yùâ˜_®\ù«_Äç×b2+cÖ¯ˆÙÂË*âWˆŠ bx¥Ù1[VÄ­ˆÙίÀ bžã—ÆdæäóŠscø¹1É9»bR’ÞJLŠÙœŸ²#)vÅßÄ÷½‹¼bA>/WRÂä•ðŠEY˜ ˆ…¥ëB‘˜'ͬÊÎ/H*,*YóÆ‚9s¾Ÿ ≥D‘D$)Äzb7±H#Þ"Þ!¶¯[‰mÄvb.1Ÿð°XÀ2°Œ“EL'ΰò§ýbÚQö:öèôôOÏè*œ¹lægdù¬·f]žÝ6g`οEÇFß™+™ûÇy)ó&PhÞŸ§©ú E0BY‘Ÿ\³Ü`G"h)Ç©4©äz•BG‰^ãeçY­t¶µÙÎÚ;xÍ„÷È[©ý^OÝ“SJ©NïëÛy W‹Ò©d½Mk÷Ì6Ê}ÌwnÈN«°¼R#UÒ’×s™çµ5j!h¹b¿ÒãóºÝ6Êdµ‡-­mÿºÐäuš¼§ÀÐ =tÈþVIz2‰’î¡e… ™8ÊùjÅx¨yf/Î% „.Q8Äšà>`OT¡BÜÜvîY"¿ý |FÞZ…yŠb¾‰ª”´Ö Í¡n¨Ö64èd4óôÃp}Ž^¹¸R9¾éf:23 ½†ž@³Йè.çW®d~J1/G]@:GØ`.ZõU`k&Äü†ûÂJ&šbÖEÕu6°íFë8êYˆöEÝïÝ–DcŽÜ&˜!ôÂcž·ÈŽ4£Î×[¯¬‰OË,)¥$×ßÅ…â½u»@÷WzÆ|g†€ì°‰E ­H¯¤™é”Ezepk1æz‡Æâ4›àú´êl@š½ào¬yX6ßõ4‹öˆ{óN‰7õS´-§ßæ@nyLÉŽ²”´}é@n®þÐFÁDE –f0z}ÜÁÃ#mý@÷ïÙ‹÷Àº+!\týsÞAf$ŠÓ_| qsÆ^„ª¸±ù‡Ñÿ¯8` †íTàÓ>´À`´u,\“£c¨³£¯;lñ | òýõê\¨'Ë›k]=wqÙY_&aÙú-»=d¡g.°#«ÐK¸ëϵ¥9²m0Lúšß0x°®ÌK‰µ’J’•nYÀÛë:|qKGó4ï»0ê>ÕVÙ¬;¡8 :£€T(“ò¥¹¢= Õ ‚Ífá»cFÛ¸ÉM^)OÞq1ç>Z?€žžD!džù!´³‚…îcç¸êêºmŠªHÛ½q;ycÈor™<ôM42ã«(¿GUôʨ~´—Ê Àm­vV¨{ë¨bfÞŒ¢¤²))Þ‹ŠgTja}>ÔrãœüÓ´ØžöJú”kG°˜zðÂV­M.׫…jª6Yšš ¤¸Þlv„­tÇï«#ĵ´»†ÁB¶Ií²¡¢XCÕ7—Ž`ŒÌæg Í<·ôjüí˧ÇZ|´oÓ¯õn8mƒöæ–þƳ`&™œ|ÎîM©’" 3ÄÃ'F»þ8Dw_86|È+þõr­0V]FËÒA¯ØOb„;b„Þ{(îž7Èêû}ü;ø^¶T¼˜’d¡(0Übmk|£E'Œ®:¡µv_>´Ê7œÙÖ”›žS˜-¦ÊO¦ú31nÖvæIþ¤ÖÜF‹ÛD·Ý<ôýü¼ y†²ˆ.`Õ¦äñöW e i<â‚Om•å‚RqNƱ²±“ïöù¨Àž#â£Ø¬óèÉà¤ÚÏ©ó‹r³Žýé1ËÛ¦,›´?OZN]C½£©Ï¢uȵÅ:½˜JÒ–ë PÉ­m÷QP׫Yj1õ ó;eÔ@wÙ¥·ÿ˃Ô÷`^^ðf—¹Ã}”|Š•ot{¹ááýÃßYðëÕØ‚׃¨ç+’…–s*³²N¯Vh)éîdÁnB¹¥ÄÎs)ðb œ”J}ÿ€ËõÙM—cülW祋Oƒ‹t`þ úUœQ®¬Ä/Éí-e>\Ù5»_È›œF³ËL{ºGœ=ÐíêvÕpÿ“”óùÿ´—Ï+”­[_´Øê:»Óh²Y¨–žÞÞAü³Þ/í+öÉ»üÃ%4¿w2— }Ççÿ(ÙÇ^Atää WY¨© ö0©uÌýÑqö¦ï£?çsÖg×Bãl461¨n—•ŠJÊ›ªÛ:»Û{(ÿÃò¿Ú’xMffr¹¥«ÝæóôÒ½wzï8ÚܽÐÌ=žu`×ó<&Fö8ã­NüâHWN _ÑP«(¡›ï€^ðWS£‘C¹g0ïäƒ)DÓ4+ IhâùÚr¹®³#¡*©éKB…öt÷ÊÀÂ[R Œ“Þ½ûͽ‹é !ÒJ@KÉz›Û`n2Sc(Ã`6ZÁµ©-*•^/¯£êdeEuòì3Ûwáh ±f1Q ½ÊïVÞ¨:Po„nU·êr5¬&_yuÅ’-Ìœ4ß­ÖvÊàœá®3he Z±†ÊdVဎ«´jl6ƒÁã¢lö>ÚVr&ëw8(–£9èg(zÒ•á‚ÙŒ|úˆâš/+äe̱¿Æ/*)ã—I½ÒöžÎ`'Åc®pLn£¼äé}ÇM‘è2˜¼6ªçÚØØq [ݵ…µ:|Ð/>œ]³}Ϭëj¨1ë ½^s8ÈöJ¤T ,Ìž¹€¦ ¢èžIVcßÄuF#8l'…ñýE¢êJ-%K/{'L™:Ðå1¸-m´Áln½õ“e¾]¶@8ìöœ>uxà(xÀ­³+RT†crªÝ…Eý»R÷%&R ‰ÂºjÕב¥ Ë™ü{å¶÷5š©Q”xZ}U ‰\ЀF¯ÐÉôµ !wÚv¸³×ï¡ÚšÎƒ»ÝwcªÏM¼>i½oéï[o5/ç­·)1/n/¥üx«/2`{uòÕù´`:äƒPRU€'Õ]ÿ“ªÉim7:–ЕC¡pgÈr ¥ÈFE&ÎeÑ¡}ù|ßÏh÷zaKmb\¥Õéõ˜M¥]msÿËGhÖ¤:~²ž`*%ßÖT°ÎEV²#EEÂ)«ÖÊqó`˜ÿX«®=–»Ì©ð4™ÝN3…˜o×ZÁ&.~_þ`%ˆŒ¬©`Eþýç ׈­›îüÆÛp+·£Â*ÏW ñ`#Y]Ì<©ÈÒ«9b)·JV*Í2½¨ãb§½ÇÚN£µ¿=„ ýhRÖb\ôÃÚêGÚ¶¨±l ÊdïFsZ>n–…«Çà8uÕdþ!!÷N)çÐté{böyŽ[º:½N¥£ªyz ÔB5hѼû߄а“µ¹û_¢¦øËãßÐ úŽ&Z62Qý›q¤,Æ¡²ˆYüܵuÿ ãÜGt`íYÈ3¡1?ͤŽr6n]%ÄMêÞž4ý~ô*ýî{§Ú‡à4ôf{¶{7+×X&‘-}s’ÌÈ­Y‘k‘UwVÛ ÓáÊ­ežÝÍPºÀB9zb×'åáÜ¡wðÒ Ö1Ëóëí:›Ód²›èž{_{pà¢WÝÌúUɺz•˜.ßX°¡”Cy“Ëáí°SÝ÷ï[›ZßCkî£ îÀd-'—ß÷ÒdRüö}ÖÐ8;òUäYNPUÓŬ`f3¿dæÆŽo½žB‹Ð\{JÚWç§Ñô(þ´qÛ]s#ØH&‹ár–mdb™Ù»÷…nw 4ôêX'™éA’'ž ²¾ü€áÞåX5.…F§S)©ÌÜ´œ Sã—là3¶Ð&‹ÓáÄ?îøøèåŽã? ähe3YÈÜ`vÔÞPOmÚZUÕЀ}¨¶)ì&#x¼ÔéãÎøà¯îwý]>¯ëønÔ‘ÈaõZ&zçëÿü¦Zí<FËúî¸{#rÈv§´ž'ilpº\HМ}c5{z2?zV§Ñh0º -«ÇMÿ •† 6endstream endobj 432 0 obj << /Filter /FlateDecode /Length 362 >> stream xœ]’Mnƒ0…÷œ‚Û4R4›t“E«ªíc"DÈ¢·ï›GSU]<‹æç™Ýñô|‡µÜ½-SúÈkÙc·äÛt_R.Ïù2ŒEÝ”ÝÖâ™®q.vÇ—8~͹D@î7~×¼{w{á«zKJS—osLy‰ã%‡ªÒCßk‘Çîß'‘-ãÜÿ ¥d/ ºI"ñI7I À¦ªÂ Ü+Üž•ž‚ªÂê8µRÀÚ°Q ØŠR@ë+N) 3ôJ½! š€æJàHèJÌ•À‘Е˜+‰J£a§°:Tu¬ì¬²Cžc®³\‡@Ç`gÁ=Mz3é1«ç¼Þæõô ö ÎJUM2“£ŽlüÐ*l Ñ3°o°¾!)L†¨X9X倪&`6ì•â—Z\jË‹míb[¶´Ñ%.ÄãÏÛnØ–=–ªL÷eÉãÊUäªÙ† cþÝÖyš-«„Šo†´¼òendstream endobj 433 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3558 >> stream xœ— P×ÖÇ{ènQ[ ˜’XÆQpߢânD0.ì›lþ9¬£ 2p`ØdD@``XlP .7LÐôKÞs‰$úÜân¢¹—ϼ4ÖË—÷ª¾ºUSÕwzæžó¿çþþçŠCB$™­stŽó ·›>Õ9 0Næ­ŸÀ[‰øqü‡bÀê×â]F`"Öq£F›¡žÑH9ùŒ"H‘hsPT¬ŽÁ.²°InS<¦ÛÙϘ9köÜyó=¥N¤ ’ œˆ ÄÂ…˜L8¶Äjb-1“p$ÖÈ…„ ñ1š0#$Ä‚!Ææ„%ñaE¤,‘F‹²E Ê!># q[ä.ê5` ‰×.0,1r1Ê#?#ËÈNjeK5P¿Ð!ôã/†}<ìàðYÃûLŒM¦˜Ä›ÁŒ8o:ÁTƒšL7˜¢&€ã8…Ö ô¡€>sIß8–£6C4d ‘ ·€“µ¤”‡Tnp÷Žp¤_R’>ü‘ÂHF].Rn“â*ÊS«Y…ŒÔÈPeÄQ«pTŠÖQ’†_¯œéýF³É™Å)ÿö–‘)¯RèøéZQ}?:Ð/æCQƒÆ|ú À£'c™_§ c4âù$aç1›â¼â<½Â·‚7xUE‹> CwÍ‘ºcÇ«Úà|Wë]ë !€²kÐg‡z¸[šÃ‰Ð¸;h›MÑ©uâk¤a¢Éhl뀗-I÷¬Â&)ª¼K=քΖêÐþhr–B6™µCJ²)·ð8‹M…:×2,¥udŠ3ì‘ÕWsÒÁ**0Kñ#ã¿'Merïu}uéÕ-s‰5Oð£™FYƒ·Càjïè5”þ' Iu‡6•%O-ÍÒ´H‘-%™ø´ãÎ? s!;—Ue'¤AQ•¬Ý¯ÛÛÈ Ë– å(F·ÆrQÔB•ðK¾†jQk®³µ¤Zà !HMËj©ëj}Ø5T J±’‘ÍêëpHó:4«hýîh9Tv÷+­YãUä×÷Î\’Ê'ÜaÎD»P£3!™GóYäNAlõ?¼µÌ èy+ÝׄU&ÖÖﯬݻ»É#GZ×Ü©iºó¬¿½t;µEµBµ.lIpôfð¢%Šù£¿¹t¬íx+qðË«ó9nUuaßR¼à#ɱYì¹Í·¹ëtG?šW d)ÞÃý‘¥u=*­G;¿åb¨Ï²Þåš«¹ÊÖpx­”ãˆÁ ÆŸÝ¥UA,XâEï÷KEE‚ûx½ÜÆjd¬/Ùñp¼NÊ·äP(ã òSówƒ¥ÔEy”=0Â"gð ùn‹ÉVõ·‚R‡áoÐ:¤ö­FÎçŽV—U#¨N«6C3þÂ0—P ^ÎOdÊÓý¼2|}X V4ùø¨ã¬lW®üÌK ‹—¦&ËC d%\‚Sb¨7øÑËžº"S4ì×ךSNl©g¿¨ßë…é ʜмx!ªË+G´«*€~Ð×wµ5©5ºZÚr°%?Ðs@!¨³™»F'–¤•WV³x9&ˆÌMŽNO‹ðz&<«®Ëi,ÕI%½Š½EÕõmV·áÓX)2ÎlZ¾uÒ„•'N;ÔzDÍž'o!C˜%êéy[Þ²$zeöÓoó/™Ktn¬ÉÌ?,åÅ”ä,¶Ö÷Å=Bqkß·ºš³f[J,\ùçL]lmXpBDtduÔƒ•õ:ö-“â8´‚C‹¹ š_/:Óû·^´®WÌg¢õ <[ssN%ÃY8–úwÃ9úr÷…khÏõ,`s2 Ct äWH‘U… evvš’ rkðm·J@)žÈØQY ûXÔ„©}P)ýóŠÃ…g+¾NÆú=~c3ÙÎxœvÀB+:ÜŠ·òFß1pc÷ ï=Í+ó'pˆòµ ]¹{,€%yví‹¿œÿ]B'tÃ?ªŽ©ºYwî² ÐÍg¦LXì´8D»£«Ô6t¹C2Ëu^*iºýtœ]ZÖÆ(/i˜[°*:;=;&K éÙÊlØI+ ¡œ=BÞl]5 [î彤ü|´y7§…CtKdexLhŠ×ôk™Þ»÷‚R}Àñq‚¬§®èÛy ÷)ï&ˆX´Kié,î 6’¡Š™zg_ÊÆËÈvõIÁí:à´«è?Ìù6µœc°ŠD*ÞØh(WdðdJ?ÚªEæý+žDÔÇkÕ f]OãïÌ~Š˜;æ’1£Í=4|Þ3L¸y'²h3%¡«2*›”Vhäå{%ª|¥TbL€@ŸÝª„]ÛV T7 üÀ£Ð½*] <š¸Ò“¤¸“’Cú¾Â\uA«)kíþN‚ΣH^¶=×¶ Þâãã¿=ÊC „ó©Äó´dÉ’lµ:[cÕT®«©IÔ…¤)=¤’*‹Y}“‘!¢_<z®¡\ø«ûïµéÌ:w#îšK…]ófÄþ¯Ú¾Å-­¡PÕr¢¦##XË&û§¬&Y[v`Ïᯯæâ1Ø 38 W"zù©ä4?üYHírpƒ­‰aN»ca„õd”Êà ØO_k|v·ì8rìþí°¶ÑC¡ ŒÔ‰:ºªºªK_: hQ èØQ•TüyÛÿ´vž„Kô}û³Ó?¿ÔVžëÙáÎjÒZ£u‰Ãg¹ÀDú£«_"£‡ý¿±ËÑ œýÝœ‚ð¨2B9}ábÇ•ïz7/c«fé’Íóf-ûºÿ\cïOBß7rQýŽãa°Þr(Ž–û?V£ƒûÈNwH/LÕ]4JæÙ)!¨› Òbê[{×mrOoÖ×3Ö–Ðxô?'!à íçªÙP §~â±1qSîÁHöHQC9S—¶Ëu·ïOˆ\ •N»ÏÌ ž<ƒ|< <@ö¼º@“ãU­u]‡Jšá4—{Қؚ·Îãƒwæó E¼Ýz%F®¼)ÓS^ÓÐPSÓÀâk†™râÆ£åG'ðu ¶A³± ž]’‚¤ˆ@RL½Å-²lC¶m¢3Sõ°}ö¶ƒÈwp-•ò?“¥z˜â/ …ï’ÙÁŸÉä?ÀË?"ß‚VXìôQõQ?k`“Tjn^±Ñ¥Å‰ld™¼0QèPwÄmq)K¶€C_©Ö%ï,gë’ö+Ë…Ö´B{â ý'ãy*øÎXÉ€rËñhdŠ6‚У#‡CÈD£KöB.¨éÂLuÆN»UX²Ý‚ Ò°X°ÎE<â46êÁ#o­-º O](ø€Á•¹ú+ƒ$ŸÌ8Ñ™ghf?šÿL<0ýÌÀ¯˜¼‡möÒg¨ƒ°ï!ÛÄ‘ªià+ [Úê&ê!¤I](<5ÙzL„ñHl&%Ó.T0¤Ø°!2²E}Ú…ñZˆ„P6PÒ,=C¡i‚ù=€ç4~?gðÇòð5œ,ŽãäJå “à”l§ÈiÞˆBlRý4XL› îð†3ú~¿;è`¹ä'þ:ïÆ ÝNöÿõvBJòÕÍ×à°U;Ü{€Äz(¾Ž’lºçüB¢O jC¶¢ß Ò!ãøß8³I­¹$RPB!8†/X‰í·h QjÝS –Ÿ™¯ÊÃ>¨Ó%‘htVaû?îK'ɘ,šË\üïÂ5;õ&¡²”ä+Š¡”åO’¦qZ~Y9 ×hInXßpv˜¡k„‰±6'7'77§07W}ÁÄ„ þ,­Vendstream endobj 434 0 obj << /Filter /FlateDecode /Length 194 >> stream xœ]=ƒ0 F÷œ"7 €@ È ]ZUm/e D†Þ¾‰):¼H/Že)†ñ2z·ñâýÄ[çMÄuÙ£F®prž•7No_£SÏ2°b¸ÊðzäéÚÃorÆâÑAWåѤƒk£ô²^è­†Þü•Ú£AÙ󥆃ZUÀú²"i—µ"©ÊÚ!„j²v@¤*fE Dm}É[ä<çú\ï1¢ß(4…ÊYœÇß¿„%ä.ž`yud¬endstream endobj 435 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1386 >> stream xœmR{LSg¿]•È„ukÞÞ¸ÌÇ0œºÍÍÅMçFTDŸX¤ØB±ŒGKË£/Jçö]ò¦¼Q(ÈCœt>æŒnf2Í3›sÙ²%ºŒ¯ìsÙ.ÙþY²œ|'çû}¿äüÎï;$F$ùÂŽ”Q‰$¹D$“[›¿E.Ë™ÇW†^&Cqa¡åá€ÏmK[Qáˆ[ЃÌKQy4*~ž H2#¯¬Bo´²[å…ª"éqI ózbâºøx.od²UÌ–f»èX¾\Yœ/eD'r˜í ) ÌN¹’¥Ìjù &[,Éry.³WœÉ¤§mÛ“Æ$íÙ•¾;mMÂÿÈû/”-æ QAvލP"-‘p·2)A‘/Fñè>AÔ“VH–´‘vâ9nd"‚˜ o„m 'Ã5 èô’¿Â.}Cà= ”mR’so Õ<_èµ&¨©¡-°‹”ï”(‹€Òj§›'G„]OÚ¹ü'GÀ-h+÷Ë”M¶–þ÷™TjµªB_X /*É8Õ×íêp4 GP¢««vü_zFÕ~™Æ‚g=¦r0‚Iߥiké®íñÑ®ºÓh¹»´üÔÃL¸> v¾T9CÐÛÖè©‚“âD{Îø}Ú@3Ž*Ä„lOS¿ú íãq]ýà‡1í™â¾j¯Ácpõ÷ž«;OÅþáh`|Ë`@ׯðç føö^ x!^’‡8ñÏ|«ÖeôÕé§Ã溎ÜüÞƒÁ‚/à&Üò] †?ñ]¦p˜›§=\q(G"É?Tu¨Í™Ó·ëm>»Oø‚^D=Fa¿ƒ zuõE.­­ ª@QSb,5HuÇ‹ä…^™C™jÕµšÀf*7hštÖÐ63&*v½[mW•-ƒ|ƒD/¥ÄèO©+­QÂG ›×ÑÀ™ÍÐdn0Î[Ò2Cxsû¸?ä»xà4;,vƒGßR݈½¡¯øšžª T‰Ê*, l´ÔZ‹ëÊ~ÃzÕ|^©†BJîWvö´¶÷õÐ6ûÔÇÇÐð÷¿ ýŒe|»Á[ÆU‹n¨ ‘Íuàr¯i œ¬@©Ã!zé”䥧¡wŸ†ÏmE~Ìn˜Á«œQ.ß^vÊW z¥Õ¢¨¡÷ã¦*«@`±Z­j+ÎÖàh¼p,0· U5Gñ6~¥¼N¶ÉA"ÆÝk³qtkƒFeÕ¡ÄâQx­á­~Fopî‚{è©}|ñæàÙ+÷ÝÚ…£y ×¾–‘,ÉJ•n¬þ5DóÖLçÂÛó¦­½AhrMȉY42:ªâ¡^ ìÜ´*ǽGgÆËpÇÆ¯ÞM~ôùwgžÜ¢ èn´îP˜Á‹yXé»ÒõCßEÿèèô$PcÍY»w”®×Š„šƒ¼Üöf¡*Aá¨ì×tÃ\nÿ±vœëN>K'ð‘@hÃü oåÒ·J²ãJ †‡ÒßâÁxA‡ÒƒùüävI]j+L ®Þù²l`qÒSêSÐ Tÿ}Ž¥@^™ ª fn`ºïnp¸½ :€ê¾ÁÑtV¤+“\Èö»:l`ÁNµ*XȃݪjгÕ4^š›²6á.qwÙŠŠ@ gŽ]U\PÛàzi§a¼Âmò˜œz0PfKá ã¶ã]í°°& *cñƒâ _Ý>/¬™[Éㆴ˜M:­tPÎ…¾¡ÕÛ >軵ÑH%ážÙ¨Óæ‚åP *_ÏÉvNú©Þ—¨›B™,* ØÙÈÀ¢ÙÅô¢0¥&jaÀƲv‡Çð¹Ù¨(‚øoyÇendstream endobj 436 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1867 >> stream xœuU{PTç¿ß¾îŠÄFt#&—ÝÕØjF`TDÅDm±âÖWˆÂ(Œ¡YdYVy¹,yˆ »‡]‡†‡(6ÕÄH%ƒ–XŒ:¶u,Æv¢Fœ&¦”Z™&Ôó-ßEû-KÈøÏýó;¯ß={.T òòºõëÍŽ”UyKz–-#}þ¼kvªÙîóΦ¯*)h¤þ’zG»ü•à¯:-M0Я'ÓO~D¿(L㹄ÍB¦P"x„&á„Ð!\n ÷„^ÁKDòù #+È:G’‰ƒì%Õ+32wÙmÖ‡qÁ¼ya!!üaLÜeŒ 5®1oÛ‘‘›µÃf4§'ׄ®5nÈÈåF›qNFº1Ñ’bNM6f$c,[Œ±›VmÜd\½ñÍØèM¯…>w˜82ÍvKúP‘6ëHµ$;mVëÿ=ÏÏù=—ee§¥™<›Ã’çÈ´g$eosŒù™dËÊL5ï²q·ÕnN‰v>ˆÅ1’q¦|–q„œcñ5œ””‘˜jÛɘ,‰Ž1À’782ǦÆBψCÈ‘)ÂÔÉSŒ3¢ßŠ‹O±myáÅ…‹„/ˆ‹©$nâ!U¤š 5¤–Ô‘zr"ï’ÒHšH39,è|+  …~’JŠÿ*W+£zC•¤ªT¨7«¿P?Õ¼¢Y¦1kŠ4GñÃIO±KÉ»(GÅ\‚ß|®¤ ût€í&¼Ââ0»¨)ùLÖ‘²NØ Ú’½PR^UîvN¥tÅü)P`1í €•ÅüÙafbkNgThKê þ]7ÔÖé{{£¡­g1¨†kyÝ¿ Òãû9Ò„_òºI÷•Þhéñ-T9ÝNOr›é†‰çǃ‘x(ï§å4öa^¸‹3{zΞõxÀ m}9¡°Pϰ+3å#@ú»lÄvñ=Ço?¶*vChj Þ0®.¾¯¤Ç$–§4ŸY ^Ì=jù8ñtñ!'¶øÙÀYo˜n0ÃÙÁ¿°; 뀵XY‹`Þ`3—,1›£cjpCc£à•~š4‚Ï«œvRú÷çHÏòy÷}OÖ{ojøèmv^¬} ¸`ØCºò¡r`â“B]»8 Ο0x=â 8ÿ­¾}ðÖ6ñ[ˆO3 zÄ4ˆŸ¥ß†ŸŽrzèÊÁž«ÈÛ¼&H]’Ú¿‹`&†Ð÷1D)©®p£®KdÓS÷'ÃÀeñúç0Pß%±¬X§Ÿ|{­áÉeqÍŽ¨¥Ù£DIõ+ú¾ÄG=¼€b®GpcËñ^I¬î=ÞB>}èýï{e¨®+öLÌŠMŒ°wbô{˜Ä‡V ÎÜÉBÒÙëÛ™aWäÛ,z)h­ö£`øÀÝÜ­ÚíMŽ,{aÊ–ß›¯aðeÜŸéoc÷u¼Õ…mC[n=…ºCçùã œ„Ö¼ªòíÎül°k··=ÖÚø‘~ÒSr;‚ß’æD'ÁœN%ãP×ÉLÜ‚¦N–+Q¯8žß©D§ÇÏ ËÝŠ&É»™™¶ržºu§Oį$Õ>!ü÷ä:_ƒ¤Wg¬fbZÎþ×v²¾}z€þ³¦–ïAõt¨.«—“½“é9 ¾ ÿ(ªsv•~•7®µàÏ §–ò`/à)5Sã—«bŸ«ò`=>˜(7Êß•Ã>€áÝà²k†•Æwàê%FË÷tôºØGr²!7_/_ çH ¼×¬GûKÏs?©&~R/KÞ¹#§Íz:öÒzTðK³ ° h4`®ÄUü¨UøþàÅ»PºWad†(f}‡:X8°¥ÀJ:ØœÏ Ôf¨/n(¨-;c t»êKxh‹ÆS[Yç;s'}²wKšK¼‡»ÝJïlŸìݬ™[¢†_#ßΡ†Ô ÿ[GEÉÄÑøðÎî‰OãÑ_òH_Nq|…cÝJüfäÅFIÞå¬9j\…!Æs+ŒÄ‡ãË(læ9ÄI%õtV55Ô{*5í~Ýõ~ª˜ ÿ -MîšÊ•Užš†6Aø"ßT®endstream endobj 437 0 obj << /Filter /FlateDecode /Length 269 >> stream xœ]‘Ánƒ0 †ï> stream xœ…T TSç¾×@r‹j»f'lö&þ´¶=õµ:9LÖÖŠZ«¥þ!4` I 7ÿÉ››ÿ„„°µ¨±j7uhYm§®öGöTÛµµÎMwVÝø˜îFìܺ³³óÝóÝ{¾÷½ßûó<ÏKi£’$EK—-+VmY¥©,QT(s¦M^)-«­(®IÙžNþœLŽ•|’'Ç®¡ÒÁÖtÈäAfÚÞ±sG·CgE‡Ç™$¹Z®3ÚýÑݽGúO/TTijde[T’éӦ͘<™ÛçHJ4’S$KŠ7•+ÔÊr™¤X¾Y²dʲ)’å 5w(“<£KJ¤[Š+J%ŠRÉëÒ5’‚U‹V®’¼¼òÕ‚«žò?ÒüÑqIqÍæ’ŠÊâ*¥JQ\S£PßO¤¬FZ¬’ÖH«k‹+¸MVÇ½ä›¤Ò i¥T®’ÉKer™JS!U*ï»(e•²Tâ' Ê_Z>»€ K·–'|lzÎ"‚˜@:ˆIÄTˆYÄN¢†($6EDœt’,é"ݤ‡ô’>â ®½D1@Ž!oŽêu™çç½Ëû"M•Ö™þ‹ô8ÿq¾Žÿ• _ð-µ’êAogÝå9GÔö'ïö“ÉÞ«¼A>2 á»—Oæl¿²¥Ÿ‡ï¨u} ÖâGÕøILÒ~‰ØHºÏî24bÑkUf¸ÃAO[Ýô¬?¡ya3^¬Y³q†aX(gn?ØÙ¢Ž^܇ÄqÄëAig®÷ $œê½ÃÒµ3ž/—”‰ËõÔPGYX»ß½Ã íôß./›‚Ó§­÷ËÒCá&±Õã`M@)×Vh¬– C›n¢Y⬤ kꆴj‰hj‚‡æc¹p(O65w£–¾;S …ºhÚ"4ZíÍ´@gÓèè»yh8[G Íõâì ¢±}ÓºúÉÁsƒYÂÐᕞÕ@aÌWòËlÕÖjF¥ÍÖ›ôFƒÁd´í‡ÙmóBZ½- 7àõú8EˆÏ¯Ï©Ÿ¯šW5/{ë´M9EÓm&«Éb^¥Ý}ÖÊZ€­¹Á¨nÒji]w¤òxÀãô:©=žÝ­Ý±X[[G¸«÷³ž‹».Rèu¾Ñe÷[½º=‰°~6(rz­¬™Ëå¿õIìÓ¶Oš‰P.ÿ ¼ †­”é¡(fýTÖ=ÞL=±öÚ ðÉiÊ!Ün-WùâF -éU\_÷B®­¹PñyíWÊ¿¨ú²Y¶âÀÝew1° ” «NçpØ:ü¨)ÂÏ-ÃUÀõ¶„¶µZ<§(]ma•ì̶ÎþwnÇ›Åÿr­hˆ£I¢X~Ó®½ÿ€‹N㙟~ÞŽúº÷ §ö¢‰ 4aJyÚZŽüû{.°1Øå ¿a*ëjÊM \5y2Á»ñg!Êø: ­“˜ûŽ@;e½ŽÆ”õ”í‘”ÕŸ¦h}­ŸÜvõòUTt•—üã^¡ÇÂZô£IOëXS"p¹=9ºeжâíGwœöÅÁCy-N‹fƒª†¡í6¦J»ñU<»pgµB}ê7çß¾hñ¡[§ —J¨üUóž[^›’B(ê·ÑÑðNàÈßlR¾Y:K6W¼?_µò©Ë/ÞD9Er4•v:T³·à107Û•}½E¹¼y¼O m rp r £õ £‡ûøºzP«Û!"Nöñ#ígÝ#…¿#ÐÚ;ä—wxèuÎ5®ì’Ë•J¹¼KwuÅé]$º’:NgyÉy˜“vÐ Œ3ÏSzذÏöRè9ì‚cö`ã™ü·6‡PFœ‡n -ÀÇëÚÑÖÖÙõ‘Ûãt»ÁK…ŒÐ4iúš…vç `24T+tºªª¥VÊdr0 §‡øíjL¢ð:¼²ã¥‡*oÜ T³BÿA°£9µÎÀ•¡܇0ÞÍý7GjðÕ%ý?ÔÀ•:RÛ®Yp‹B\”÷ gõþ7ãùr ô#i\²ì/ ”¹ô`‡-抬„5,~åÃêzœ!ƒAAa®È…P«¬ÑhTÊEV‹Ãj3¥BðÖ×Ç>fiÄyZßêŽDvîüÀMù|Πx¤ÁŒ¸üvVÂëQ¡q[(IJàÏz£Õj0и[P¡>dgÍ0½Ñm Äh=gX×3ŒÍ æl}Ðô³l(D£ÂÔÂ…AÆË•ìf€ëÙ6X‡Ì dV“ê†2Õ¼¡…©6x¬n«SÒ›w­¥9<·( ßl±Å­SÏù¬€ú‡¯31 ãc"âA;~Áê9 S)£Çâ¥ÛøÜ´q;=í(íÒµ¿÷ºSèz¨‘Êð“÷éwSaƒ›ñ CQ£Ï6 ôƒ¾Ék ›ÅÉvwbÖ`5X¡1[0„Ü,xCtò8j ¸ƒhÎÞ”Æ1XK'ø:õ18j_MI=ä 4¹âÝoü@÷qò:¿%å<,zpÑu¾ö_R¸1rz#íGÿ=´qc e7±)Á *¥©/ò’—Õ#að >–ÜhB?£’sïû§ âá¹üf4e\GcB3ðl>ž‰'â,œ‡sÑx<Í£Y iõ{’Ù{È“±Á+±>BÄ[„x4ž8?SÛH/þÜá¬m/ß¹¢/›ÙÔ›ëtÄê÷T _âBS‰2ĵ?´(oö†’Î_ÑŠÝE(zzÏ]¸ÒºóÛ 9âáÂZ¡ôåyã1w0®àûon}téÊ‘ƒªu‡Å݇—vËþÓ‹Bh6¹š¼Ã1ä%;tûݾÏX›Ìzzøna,÷!…¦ %`MÇ-¢™7P¡ÇFüÆÿeŸDY'É“ÝÉ;ݼA)úJØa [ã -®_K¡d߯ÎäŸÚØ^Ô„eãžWúŒ¾+ê{u¹÷|Ë>}åÕïÔêûÓwþ$Îb‚ ÏàãÝbüDFb4Á[=5ó‘˜Ëp±A§×ÅîÈÌ$ˆJKüzendstream endobj 439 0 obj << /Filter /FlateDecode /Length 196 >> stream xœ]1Â0 E÷œ"7hêT-C•¥,@¸@H”¡i”¶·'q)B ÏÒÏ·eÿ]ì½[xq‰“¹á­óCÄyZ£AþÀ§ó¬>8³|U3êÀŠî¤Ãý§´›>ë‹kÕ4ôTnCfpÚ`Ôþ‰¬BµÖ*†~ø³êmàa:3%¨$¥"’l’”ÉÉ€ÙM…‡,kE)I¢"tE«÷%ùŠœg?Ÿ›5Fô …¦P9‹óøý—0…<Åì ªycendstream endobj 440 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 700 >> stream xœm’ÍOAÆg(´›ŠFª¸Ýš H-`Œ ‚ P5E³àBk?–´‹Pé‡%­†~åÛТ ÄpÐSÃŃ7Žü Æ›g7SÄE4ÄÄdòÎäyÞd~ï“‚Â!<×i21¼¥Ëãèãìî›5fvpØÎ¸Ž,½p ÂE"6qF|Z„T2¤*Ü_–â÷gñòÝj Û™~7â¶YiÆùŒn7˜ ônD­tç¤ûX c ¹ú1ÛKwwÝ5wÑ÷Ì»u]6üð_ÕÉ2¼•sºíŒÛ¸yÖeuÛRkg¬“rY¬áyk?ËsCù «3Þp l@§aÆ€BŠ‚ëà øMp~ÁÕbƒx_“Ÿ÷ù#!ˆÊsB(€"hBûj6°¸O-¤(…Ô<Š£˜V}(kx$EÇ4Ùaä£ò{rß0âù ZÔ {òÅ ÊêÔ‡e­@`p­­’Á8Ñï–ãÊݹøB½Ñ&'ßZ(¢¯ZÂÕÑ•‰,‡´äóÆ|Ê b‰\%šoþÙ°¡õƼ£ ṈWv’ÊŽ`ÄF£ÚpÔµMaý/1½VDB³ü:Ú@ñÌäŠW—cÅ­wž(šAÚÕùå¥#”¯½ #‡'~öc“&9¹„ˆz߇õJÁü›ûÈÐå¥7Öcõ>¾„”¸éÄ ÍrÒB® ÒFÚ°tãnþ;0¤kÞ¢šܺ£?ø<0A‘²|ÛÔdċֿ5žJÆãé…;„Æh"‘Fé?i®½+$®ó9™´†õÇp%'™â¼ ÷¡ále)AÀ;Šã/ƒsŸbéæ§Œ> stream xœ½ZKsÜ6¾ëä=è¶µ¥Ó¦J¢‰7ª=Øò»lÇ+É>²F’¥‰g4 g[ÿ}ÛÝH€CZÚ8µ¥ƒ8$žî¯¿îƯuÅjü‹ÿOW{õÁÅÞ¯{œÞħ«ƒÇ'{çÊÁ›Êמœ|Ø ]øãVÛÊK}p²ÚcÂÍN~ÆV¨¼SÐáälï_lµø¼]ÏŽ„«jn<[/7³#)¡‰Wìì®j--¯áCß;ËÞ@Ÿ›ÙŒ©­Sе3^Õµ­;ÇFªªáå›lÔ³l sìXkÇq fû÷É« ¥EI]9cÂRÃ(Ê O£Hãa"Á~˜9l,DÚKž57YóÏ¡¹÷ŽÍŸà³ƒgÃ~bÜ;ÿÓ¬ši {àŠ=›Ã®Ú+çX[,¥cág­ÙúCȰ׋«©6mê!Ù¼ør#ÖM];ãÖ¸cË6‹u>ئšq‰«•ìOQVZç²VU–ûtžÇù™­®o¶Íl–° OÆÞã«Ívqº‰ï`“ÍÕþ@hö¤Ù64Õ‘0²r >G\VZy¦x4CYÕB1·òm¾ìÅøÉJ_.xX-; ªyÞÄTÆtbQ‡ËQL%,w6íùµN2!ì¾Pº k‡¥K¬pE¡å“tVÉV×ùŠ·…úÀ±©·©Ø£w3'áƒá8“ª¼åìu³hÏð',KööÍaèáaói~-ØM6ÃÏÙ3(Lè â~œ::RHkI!20„…l>/V3aaVr>à*ŽáA?b +) lq™+˜$¶‚å'ëK»>Z|èÚ®Wqa°È—¹NžÒ F#,*YöiYÌŽ"%)fJÇè”ñQ§œ óâI¸£Ùör`é)F°§Ùë7©9g–ëv±Í7ºJVã&¬†‹ºR½Zß´ÁF>µ ¶­Yíöò<|ÀÓ˜Ï4 ”g}›D×WŠÞ¾ÀLúJ³÷ë`8’.η·ñhÕãQSM¨`w™Š©El"ý˜­pbÖÝVAÃ~š&,çŒïƒœ‚ÅHeÑô¢Ép:äBê¡„«h¦Â(±LJñ”jËN¹¢oò³\´ÍUþ“ìä ÐHýIÿ½Dý=4X Ô=J⼊‡ÅÙK€JjvµmÃYqÇ‚à9Otsº]Ì"ÔÒð àÑ Ò3¬+ž8™{;ƒ§Yo7qPg%k®ÇMƒÝ*ž –¬”dǹv6¹Å¬š« ¯ ûk’ˆ`/šåò0ý´ìuð aog™™â&ÐP½tµ€LçhwÏq¹Z£[SÊ‘«ž¾Á‰³“Ãø–³n·«âè6×J¤·¥Ûm/ hÓx‚UàaºY;)ðiÕl𓈭à„b˜pÑ: ò—ìÁÓÌþÀÜV`u9H]„ÞLjQàÌÀ ÑoïúêeW„²û¢^xv\.îÙ¢æo—0óoá‹-½ÿ.Þ%ú¢- %]6=´¿öŒÎûóÃ8-N*ñ‡xP8Ž'?¶Hcjö¬ÕqšZYÎÆøOø&ïËé|=™õeQ²·0NYV7WÁ䈽à´DŽö ™lAd´÷émõ$Œ™pP½½gs”VR:£À†þAçÛËÎÆi©+¡„¸«šK9 Õ²‡jŸA5ð›Úê}Q;͸›;Pœ;—‘à ì\º@÷~Ä·Þƒþ~ú!ñ|ÖÍ!C”1S7`Ì/Ï2u)T!”6¨Ñΰ BËÅ6XàmœÊu« Îâj1{2ü*MPZ쨒ãžÎ”<|ì¤d2%'j4¸t ýTpi›“G$Ë„Váçzµ ª€h_@¬¸†zÕü¥°õEñíŠX§’€]Ô0IxÒŽœÌ,Ÿ„ÉȧªŸ^vvhTÁczt~ÝÓ¡vÛÛL-j5îk_i«Ìý鉚QH OhÜùµÄ4$]Ì`²¡3E™YÁ¾¿Ê49žaé6AÙ`S¨lá-J€Ã0Ê,ªÃß¶YGe…9è1íÄP`8o>d'»-çïúxà/ðhI`dV¾ç=J”Rƒfº§««ÓBsEÞlGÏ[òJûp¿÷fá)({"IgçËl £ÇÍæ¼‡= ukŠmr´^f¿ª]\]„–¨ÄF é{»nWA‰Àh´ Ø&d>ãƒ$ãŠx©´¢°O{L¥ÄàN&ì­"öÊ"Ÿ”µâB8z<†ÁueœH’ʉZsJ(¥àñcs‘Ô}ÿ€m;~‘hÅ; ·ìûùkÚÉÓ“½ïöêJSú¦Îö{ÉöP7ý¢/Ÿ¬`Á—Ûíõ7Ͻ­æGpΨjìº]ÿr~º­ÖíÅÃëæ—ÿ·Õéò&jKXÇÿœnRÆT``ù‚øJ5} vá> óyûŸÌ.®‚·ö@Ž)z <·äb„..cŒ(´÷‘ºàê`ž•QègÐ5ì ‰ü@îÎi¿ ënIŽ ´ð´èwÇüò €Å»“E´-|Dá}7œNt~µØ6É5ìe;‹íÞ´‹Âƒ. » ³“ *<U¿ÀAm7 „߄{¸¨ÕC\üïáPál1_ˆèéKéT1¼ED ³wä‰è‡ñ%(üÛ Š1hæ„b '{&Ñ|¼¥dLl|jž¦´ÉÉd"ËÒHç´$ JÀŽÂˇjB¥ˆ±o c¾Î³B;ªÞ‚&†…˜.§>}˜bší€QO¤áÒÊu`À$“(g„ S5:G"i¶9n|·Žåþ(îŒö*¹Mòx±^ƒ>6c–æhëÄKï“óòbÒà ï N”1vߨ”öâàG­’¾¤Ÿ–…´B×a$lœ³æi­õM ^kö÷¡jW,)’‚ ÚrÔqÜ‚_¶`ÖY@«¤+HéõdÔƒ³š˜¯ÄgåS¶#R•‘lGœEHÞÆÎNæ%¨Ð ²ÜB$›©ŸJg(_ÑÄG?Ô¿£]Ϥƒ´I3Ñ{;ÑifÊú~YýR £&´Ïcpà:U8ÉŽ-åu±sŸKL5~‹1¨ 9á¢~2ê3¸ª\ª¯Ý+mËï¥Â| àûB¨· –ͨpQìøŠ ž $T]O4…ðÖŽeðÂ'ÊàÑ# ÙBM¶ ±¸ç{ð (h7þ’æ¶±ƒ¤ÔѪ¦²÷GR·åHÌÚ~3ó‚pEAÑ/+%±9Ãî˜å.Û˜E‡½›z›WÂ2>t·Ïʲæ;¿‰ ¼¾ª¾xˆÏG<îQ&‘Æ>ÏB‘„6äàŸB!E€›i?bCe[ƒ4ÐxÉÙ‘[ÿ2r&ÔÓS°ûÔ#¸Gebé£äd(9™$œ;΀Ž@/OèØ¥ çèžã˜J©ºÒ&ÝO¹åÓ¡_N1]¡S|\(¯"Â÷à(Œ|$¼#[ÈùÃEí¾&[¨‹µõÅ|±t€UlÌ›¤_ÇRŒëσψ±! xþ ŸSyîEÈ u†ßvméŽOˆ‹|¼äS@gþé­½Ï>4—4]yÄ)ðÆË¼pºßh0º‹ÅªøÝe8&¡ü?wnZé6}älµˆ°Z‡+$]Ž~uÞÆtàUìâÆò„4Vßk³Y÷—›Ó ¾öw¦FOMŒ½_ JGY`À$Y›} zööÝÞS«+endstream endobj 442 0 obj << /Filter /FlateDecode /Length 172 >> stream xœ]1ƒ E{NÁ @ã$i,’É$¹ÂâP¸0ˆEn@M‘âÿ™eÿgÞ²~¸h#eàÔ "5u€Å­Aa²Hªšj«â>W³ô„õ7éß4Àló]ÎÀžMÛ”§j+)§añRA8é81‚ê¿U½F³'Ï'QÄyrÒ]ZQÄyò\?‚ù§Ìt Pµ† xË<áw›w>·hù‰¬V_endstream endobj 443 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 492 >> stream xœcd`ab`ddäóñ ÊÏM̳ÐuÊÏI‰¨üfü!ÃôC–¹»åÇÿѬÝ<ÌÝ<,~$ }÷üîÅÿÝM€™‘1<%Ç9¿ ²(3=£DÁÈÀÀXWHZ*$U*8é)x%&gç—gg*$æ¥(xéùê)øå—34òó’R3sÒòÓBR#Bƒ]ƒ‚܃üC‚5õP\ã0000U$30D2¸00]ÎÀÂ0ƒ‘ãû¾ÿLm Ýû¿¿ØÏøã¿Ø~Wöß®ßC¾ Ÿ=ge÷þnÉýì¹qÝåÝMÝÝ}áìSçt´v´´tË›k|c]¹Ÿ-°£®;ª»²;,‘ý»ùo×ßò¿U[|»%«ÂÙVõíìžÛ=±ûd÷ºŽýìÝmÚú¿3|g•øÎò›57œíhߌî=ݳ *€nR(bhÙõýü®‰»·|—þîó]šùÇÄïì¢s«»ë+:º+[äò==š²»9~kvWÞv¼ï;ßw©I‡;Û»»:::ä›ëÛkºk9’W¬ß¸réÖw¿U»“~‡ØÿæùÍú[à©Òw§{'/Ù"w`ͬ½Ý9øjgþ˜ö=~îÔ™lû¹¾óqËq±„äópnêëéïí›<¹gÆÉÙ<< *UË%endstream endobj 444 0 obj << /Filter /FlateDecode /Length 171 >> stream xœ]Aƒ E÷œ‚0]41nìÆE›¦íp .zûj]üŸ ó?y#†ñ:Z¹x‡/Š\«­n H|¢ÙXVÕ\ŒÇTé™nÒ¿?žx Þç»\H<› ”§j/¡S´z‰¤‰u}§uÏȪ¿U½&}$›¶/Hκ6³’çúÌ?e¦ãÙXÀ Xæ1–~·yçs‹'±/~V>endstream endobj 445 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 361 >> stream xœcd`ab`ddôñ NÌ+64Ð JM/ÍI, ªüfü!ÃôC–¹»ûÇ­Ÿ^¬Ý<ÌÝ<,ë¿?ú*ø=€ÿ»3#cxz¾s~AeQfzF‰‚‘±®.´THªTpÒSðJLÎÎ//ÎÎTHÌKQðÒóÕSðË/ f*häç)$¥f$æ¤)ä§)„¤F(„»+¸ù‡kê¡; Æg```r ``Pc0ÙÏâØþ} ߦP †î‹ß§ŸøÞp†ñåæûÄ.ýb¯ï®ïªïæøú}ú÷{'~ßûÞø]Žmz÷ô®éÝß½Ïü úëÎÔ\÷˜aAÙ÷­G¿o?Ìøúá÷Ëw˜ÜúÑ úMãÕo9¹ß½½ž|ßúÝší»À×gßYä­Äl|<³ËýVü¾ý»"Ûw¦ó~fò|¥ Ìù¾pöB¶\7¹å¸XBòy87Ïê‚Þ> šÊÃÃÀµñ”Êendstream endobj 446 0 obj << /Filter /FlateDecode /Length 192 >> stream xœ]Mƒ …÷œ‚ˆÖÖ˜6vã¢MÓöü †…@P½}Ô.ºx“|ð3CÑ×ÁÙ…èÕ j¬Óf¿FTÂh)+ª­ZvÊUM"¢¿‰ðþ h³ñ]LP<ë¶ÉGåR^Ä‚(ܤcŒwÆpNÿ]·€4»ó‚Τª,O±åYŒaE< Q$”< Q"65Ïb kêu¼šÚ¦Žy©Zc·ä-óixëà÷Á‡”¢(òî`´endstream endobj 447 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1033 >> stream xœmÒ_L[uð{i©wØàß*ÍÜí]2Œ3¡Yt1Q%’ÅŒü èÚQ(¥P -ÚÛöž¶·Üµ¥·e„ ¥HQƒ AÀl‹Y0чÑ8³h¢âB|ù]¼$³_L|9ç<ü>ç{~8&ÍÂp¦¤´Tcn?oÖtͯTjÛz ÓÑ$_8Ž Ïe '$ 6 ª³A.¹4ý×Ü“ÈòÒ?†ZǤ8^k°;­&][»™zéÌ™— 2õUªÉJ½¥¦Š5Ízco·^Gi:Z¨bu©šzÇØ›iꨌT“¶]ch¥Œ­Tµ¶Žª©:WYE½]YVS^uZý¿¶ÿ4 ÝÍ&]§ðl³îоÃj°bìV‚3˜,³ &Å8\’å–œD‹¹ñïw±á” û]ìÅ‘ì;‰ F§o¤ßî¥4©+¬ll¢•YŽòàNª¾Fél„Ë<ÌÆì`UåË–ÉÆ€PÎô…mŽ.§~„tÛÂéËb!b2 0ŒÛC»Ýv ƒ!H±/+‡\æQ8”ÚÛ葯Љ 2£Yç4ϦÐiËoOÞÝ÷¿• ý©bÆ7wvtu˜®L§f“³dúЬ†·2tŸ‹´Õ5•ÕaŸIŒÅ¢ ª[èE6šaCÊ@ˆ ñ]¿PŸß æõÐìÏÆBrnïó÷æ€Hpvs¯kÀëTÕŠO;:Àk×)íWi;ôukm[ûë(oúÈöÃÄÆ”°û/n|O"´ddÉî°Mo2t[â}³7’³I²I¼£ð‡!à3®\³Ï‰Çû\ì(ÏûXž#çïlol‘äL&»wñ¨ õ–×U€Òcô±ªçâS¦º¸ÁΫ=­¿t|¼ƒä"y2ÃÈ ÝËD„R¿ò)\ðý!~ÏÜëŸ ¼®~šn3¾™ B «‘8ø‚ §ÆïžyƒSÍĦâ+KëŸn¬nAÆ=¡ávç€,„þ†“ŸNÇ×Wõ©†’òKÍï’µ— ]­ƒ*ÏÇúÇ ñ^ÆÁˆÒ‘¼~ÆÎ@71…ø<çqGIp€×m©Ãí<· œ„)1 _g'£$]A¯q©ú” ´gÈ3.%Îok¿Ø[BÏ_;ÚHæÄ©*…#Å.2¥%Bà n$:L{<.'YßtéJæÊœ$¬º¹yóÖg;? ìÐ=X –7+ħDRÜkmàõ9ÈÂâ>ÀKIs‘ ¢û3(ïÿò¨€ pª.a^bÎ)‘sD,˜ü½¾öglqåþ‹~E•k™ŠÂ‘꜒¥r–%s¤ÕFù±¤ßç÷baß5V.ǰ¿ÒXï¹endstream endobj 448 0 obj << /Filter /FlateDecode /Length 189 >> stream xœ]K‚0†÷=Eo@AM !Ýà†…Æ¨ècJº 4ÞÞé.\üòMçÙ¢ë¯}ð /i2/X¸óÁ&˜§5àXYqëͲ¹UdEwSñý‰À1ÜÆw5Bñ<× …Ê­ÈLæ¨ $`­²uN2öïé²h·gVµ$ ŽØHb“QK¢F> stream xœ]]HSqÆÿgg_®±RX}œ %7Ü” #GHÚ26­îr~ÍïÓfn-ÛŒáÔùns6Bg˜v˜ì.o,#$ÂnlÞXBltÛÿ¬°ÑEñ Ïïâyßç¡X„(Š*¿f2s#ÖÑ Zs¯m|Øêø «„Ó”pF$œ¥„ ù‚OJ”âE¾SŽÛcÓ DSÔ-gäþ{¬¡®®^«-í‹l—›mÒ±-Öî!Î564ÀZG{ØIÇ^ç\%8ÀVs£lWo¿u¸åúØöÞÛl‡åŠÙÂ6›Û:nXjtÿõW#„$5çëôÕ)•£ T†¤¥$HŒÚÐ%¡ÌÔS¼¡*R‡nDÜÎ]ÞLÓø;«qŽLaÃýÉYß´?8·2Á5~%Õ@|@ú/“z"©õxçæÀ/ŸûW°ëqžQéu-" '.n㢋LÛt!_rãàaHg¥1HØíà(©,ÉÈ<°ÛÓà ÉJ=ààyHÄœÅY,¼FUuŸBÎdA”¤vsøU޶pZý0O$„o2‰ãާ™Ú%5´Â¹®Áè+4¯ŽL¼…oð>@6ö:q”YÚ„—°7¾viùf° ån@JXM½/5ÀÒBèdªSV KaKö|F˜«­U`yŒ‡=Ø]—ÿ ÉÁ[ÉtöHwæ÷áMiöagFþo›iZ¨"Ô‘Ù0DôI €½€'¾à,þ,‡p$²0t?Ñ“<Éá)bx¶8]ШœqÁ¸Œ¹'Ѹ4¥88Æ(Ä휲, ÃÁÐã`(º«T"ô zÿ-Rendstream endobj 450 0 obj << /Filter /FlateDecode /Length 163 >> stream xœ]O»ƒ0 Üóþƒðh‡Jˆ…. ­ª¶?eÀ‰Bú÷%:t8K结ϲë¯=Ûò¾(‚±¬Ín H0ÐhY”h‹qgy⤼ÝMù÷Ǭ2¿«‰äót9çU¹…Ðiš½B ŠGMQ´1­ ÖÒÌî¬WgBUÔUöJЦÇMÀ%☛æ&©€eú=ãO)X!¾0S-endstream endobj 451 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 290 >> stream xœcd`ab`dd÷ñõM,É®ÌMÊÏ)6Ó JM/ÍI,I©üfü!ÃôC–¹»ûûõ‡Y»y˜»yXÖ}_!ô=Kð{:ÿ÷FÆðÜêçü‚Ê¢ÌôŒ#c]] i©T©à¤§à•˜œ_^œ©˜—¢à¥ç«§à—_ÌTÐÈÏSHJÍHÌISÈOSIP v Vpò ÖÔÃî6TÑ‚¢ÌÜTFÆ.&FFËïkøþ3æîe:ºKtm΢¼¬ê’²¹ßŠÜÛêº;º»%kW7L™2aʤ>¹ïa?Œ&Íê›Ø=]’¯qêæ ?…–oZȶŸk?·s¸>çê ==3zz&L˜Ð?™‡‡é¡pRendstream endobj 452 0 obj << /Filter /FlateDecode /Length 5505 >> stream xœ¥\K#Gr†á[ øæ!ì¡hk+ßY ¬¯!w±’%¹=ÌÈû1-jÉf/Éyùàßî/23òQ,¶f$è0Q‘‘™ñLFêo‹¡‹þKÿÞÅÃÕß®D€.Ò?·»Å®¯~û½ö€ôã0ŠÅõ›«8E,¼X8ãúQ™Åõzyýl­ìG¯1áúîêU·Û|8í—+éûAرÛoË•R@u÷f9ôƒQN øpHpﺯ1çíršÆy­»ÃRôÃàßÝ’î¿®¨ÞU„îiâ`¼ðÖwXí‡ë?G!TÍ䊹\)Ó{k#¯ÿº\i@RvOÛýéu÷ò›o_Lwìþý?åæa{ÿ›§ýñôê…øáEBd÷a»¾Iˆ£é~ÏtT÷H|‘mw{ÿ¡_Ø™ª®‘E¯y¹QÔD–>‹‚)€i^É„êåâúÏW×ÿüªû—åJGó»ó,É6ëma‰Ä¹?lè"O¾{:ìoÖ7›íæ´¹?~ñz–"úÕm7÷Ç×Ýqˆõz™y·y«¶ëÝÍÝúÕþpw˜`Aô´…qÍÛýö÷r~©õ -öºû‘±U-Ïd­ê\pþ§e…j§y¡©¦+Ñ€¤Ý¼þ1è•öûIg¦I÷Ý=UúEá6!© Ý›wKéh;<+娠˜ÝcÂ1¦Û„¿¡ŠJw_mÞº,øîP+2ñúåõÕwWцÍâð¹¶+%tF˜…Õc¯,p¢ûÙÁ¶–º&øªë—+§m0‰oö§Ímm‹÷i›ŒíN?¶à°ãÿm…sx·4‡(u·>5x¶–Í©öËà´ëÞmîªmmÜÃ]: +»›€¯…í>& t–O§["ÇÓf·>µ &á“‹àÃ~?Mic`¥µÒÑYÊEØÝU0púãË? €÷Ÿ*'ì¼õ$1kíŒ7<’"nV3™ø&°,j¿Úf˜i­™)ÑœÚéÿ`aoïÃîÊtëÃ]BVЃFÉ»ÇêœËÈh$Xj4ãù‰ Fa©Ùšy³H4Ù<Û1ìŽ îbº=Ap#Zí™hÉ¥]8í«óØ1°dÁ´šœÂ¥ n&?æ­;ÍùyDÕæ (Òº‰¤}ÑV#ž6ûÇÊ£y’èvûˆçµy&˜2¾ÿ¦‹~xÍt&P‚sQEØmô£’4WzKÛQëNð§Þd£bÏÔì䨒÷Õ¶ed½-mÚ¤ý†ÿ¬b†¥q¬Çæ ¦Î.,þ§*à”Õ4KDß#†œÛõ!Ë· ¹ÐÕäX¹“’'UâFŒ5íðxdˆÔB2¦[gÀyÉ·k"ÝÇ’º=…S³UvE€Â{˜ìóŠ ‚ 4g;àÆuÇõ®JôæmÄ%É3‰Ð]­¤~4d£Ý?Æ„uÐÎU/å£ëív9GÙ‚×Î%â"q?, vn¶Çy 7Þ[Ðq3Džꕼ]Ôˆ}Ï¿ýÞ B¢¥ /¯zÀ¿™·s®Wn!Ì({)‡ûÅ_ '…–nññÞcñ"üË+éGr— xM× ½ØU£zp„ñØKOcß;Dùq0à(o¯ä($¬½Â®—…ã ?†Þ™E™ŽÌÛ¸j8¾½*,$ŒÂt¤0âöê¿®$ÈöHB{+I° 1–ÖúIë@#ĈôeÀ–‹<ƺðA=J‚Øâ}¡Çq š‘!Š8.”'Ëq|{U¸H…ïHa"ɦ¤Ñ=Ž2È;Œ­@hÏõã±7ñD°¼’EÎã[LpA9 ”F‹ŠãaC:åBEVkÄ1ÍHL0Bæ:h¥’9‚-ŒEnª< –®w`Ó$>K†h0Æ¢°7cQ¶`-ƒ¬AWò8,f$eã¢PÀÙùj‰0$|æ!}OòìF‚ ŠÆFõ´~è5W±´gCÁ±w&;XŒ]44†šÀÛÁ‡T>ØP&ÀðBÀ”~¥L·¾GÒPˆcšÀ,0³ÈZ!‚`ÈØ²Ý=,¶}-Õ¤f»ì<‚"J¤C³ŒÝ­G²Ž@r<=*YY€µ°°À™éD¡"æ ¬ñ•V¨¨8lW¥x0ÛíE”ÎKhAÀ8UÈã¤(5)jVHjX8Hß™AžÝŠüF¹2¯‰Ö!©¨ÒÅz¤•½’µ}Iè‡u†S½+ yÌö•!ÉB2…h?y ¶¯ÌCúÎ,òôVˆ ˜@%¿Q ‘-1ä½2Ûn×7rÁ3‹ZòÁS-råq–‹!ÌSˆ|ó ,Væ }fÓì‰A )¥q•TxÂÐSìÈ:¦´!Z)!r ²ª‚a‚¿(ò˜µ0C’e QÍò¬†™‡ô=qȳ ÂYéÁQ¬Îª@âVkQ[†žbjuVZ¦½b …­­´¸Œù¬2$ív¦#/Á‡Å,¤ÏÌ ÏnEb!¡îmc[¹`‘¾Ò°ÁÁ1©Z®‘ÈT¶5ÀøŠY*$¶òôÈu¦ÏBeÒwæ§·DÃrefcX’ Ë«Ú5¯âoP|[§ P•Te\ +AØ4¶«¡ ÏDŸ9Hß™AžÝŠ!‚Xãß+HâÊ7‰…’ˆ»ÂÔbÉÑ×bQfç*‡SÆ,V†°¿H’›ã²ôuÞQäÙ­1Ñ‘¢ÑŒ*v@Ú ë·ƒ¤àˆqˆ4{ ž<¾¥âÈôÊVrH›™(ð8.A3Ä G÷ˆkL…^oƲFÓŒÄc$&™@+DôƒÂ‡ AÃÑfˆ§ÕPuªäµUOl'ÑæqðS&$ iè yÖ  ˳zQ(èàÈËqL3˜ Æ`.™B+GÍ‹±¯½aÄ<ÁK]G`éáÉlãã½r”À -‰‹B!ÙÇgHòÒ™Bôáy öñ™‡ô=qȳ bbHK7ùSÄÀ3Rµ^ÜÆcT¼,ÖˆMsºÂ0C 4L!Y¬ IŒe ‘í¼‹•yHß™EžÞ ý!ŠÛ¸C$oè†8‡½!\²hêòV¦NDPµ»ÆŸò˜ýF†äL!Q`—–ÈþyH߇<»‘ 5Ä:-W“ ˆ9¸˜j}©æ®®&…äê1a@8«+ <ÎÕd„l®PHÅb^#W“™ Æ`®Fˆx€ÒE7ùSD’nlÒ£pèk-$·\œ£¾…"z ºÁ£rï*<™%û·åºÂs(¨ð8سíkºyQÇ%hB† áæ… ÀÏQ –Wˆcš`ËGÀÈ\'­1"Cs}“gHЧPö¡Ž·°U—]ˆ—º¹ó €:šŠBçˆÌ©L#®¯\#á3é;³ÈÓ[!â‘Q.SëbI.Û +¶%NÂ7©RÒ¾J±è&SW™FgÏvÒ‰@rá¼@vñÌAúÎ òìVë;úíÚj”sôCÀB Tg„,ìð3Wúäy‘¾ñït‰Š}ö² 1dŠU på °F­C.XR°Pä[’¯Z1C*¬ 5_ë¹¶lˆ¡¨é;ßBàuCê;Ãr¥ÃÍ“ï$ÿ=ªNUp=,sEþ¥Üe&KØ,Ò/†4XªÂJË)º(ª" Æ1ƒ ·0‰! –’–R£ +A¬b)ŒUIø‰{Oû¾¢pÊŠœýÐ¡Óæý@?uƒºÕÈ0€BX tú2 l=ði@ÍLs'sñ÷­ŸeÛÁLl£2ˆ ±Dy*VEè}yùÍ·ôëZ–Lg0TÍa¸Ó Yè”ZÄ©åŠì×KÑmö‡EÓ!U¸ÿîÓ¡ÃaMmΰ³€ûvN.¾yU¼K•Õ¦áUT®’dòÁ枤µ”á$•¯V½ ¾Û˳rV‡ÂUÛI?ŒŽÒííU©ïA.’ÉYS&“ï®3$—˜’õ³!ñ'G‡‚Ã\ðu¿éjk{Un½§”Ú“Àá¨à¸‰%”k¦ bûšrs]AÒo`ì ʵNÆÉw’aÊœËÃ|… ö·@” nÿ(é]tùÙ-Å̓kASÕv¦˜òyÍŠtL'êþÃy£• íOBün¹²Ø_jø6tª8iªÎ›Øl{ ©gjE·k¾íbÏfÝäÎæ‡þñéÍxŠ«#MzOnªÑºDÛl;f; ›ÊðøO3?â#ø{çÇø#¾UªþßÙ Q⤡!‘’˜û•)5úEEé¼í@ÓOTð‘MCÉ~Wõ5=“N: e]—º鈦èaêÒˆ5BM·þmÛ"r3íp¤ö—¶N…ãXIè‘„›\å'ÚrÏ+=èÐè¶Þî'ÍNz î:ӽ߀§ˆ›†ªV—ù¶¼!8ñŸíÔÅh&}#Ía[ø&=¤Öƒ²²:tßtD# ¦_‹5âë.‘ô-&’ÃqÚPÒ£ŽÒ ˆòz9§e¥‡Ã‚3m-±qˆÝWgç9P¦â6CÚ*c±ûûæÁÝñF:’¾äVŸHÅuÇývsÇdÔ™bÄ3D’ð\Ó')³°“.'ë¬/tÓÍZ:Õdòi»ÃÁ$¤õ@E†'ÎW;»ëÂNs»Ô©î$æÞ&+g»»bg“ªšº5[_²øõ!NGIÓéNÔáðKçWÒýcèØòÚÁuq—Ì*4ßÔ¹™ó»/«ý:Cçõ H"æô È·^û€õq‚ÔhDXHŽ]íÆ·ëÛÐU¦M÷Wîó³û‘:'_/{níÖ :ä*Á¶ÌÐ î „Sï—+3 ¡YùÛ%òk8BÚÎõîþt g¥B#½¦…1Ž!.ý)t·? \ÈîtX?=mh– ò&öó BˆØLà]3iýxúaã7ÓÝûC…1×¢.)ᑹGý/Áªð,ƒšòÿºäG7Ünj änOþ‹žÜ%*vª›çG²í=¦É£;o¢£„_̶ñQ/bœõÛðßFÏ›ÑѪ´ªÂ5=óîãfP ”eC-(Hè,7ÓÐ']· 7ÎÝ'$x'ê/"Ø®I6NëÌ1HO—ïxe’ÍþÛ.íw¹·÷Ì+ª®íLSúO±ad’Ê"£ÉJEÏ{” ñaó7ùÂÕ³¢è,Cãqžmi{^nv÷“\+mùiÒŒ;¶}¶Ó5V »lâ7;?5ÉÍꃞsÝGÎø\Øxª×ü¹ |#˜Å¸BòHŽ¢±åB^N;2MßýGìÔ«æ¦ê¹žéašŒ“5Q‘3øóži¥c(Þ­#ç°ÑAØ6µÒ»ó¤¶{ÛXשíT^oCû±ŽyßÍ…i‡‹¡ézÞ·¶È†Æï{ŒœR¼YoOMd94üœ6ófÁ=Ùi‡áBRÛ:¨SÛúèsÛ:]9 Ïo[´“[BýIûŒ%ç=L4æCa=ñ1žÄo><îHxçïOÂ:z.‚$—º™Æ¤)°6³a²u§dj IªÔt?Ž­ûŠ{$>Ï©ìÏ,1.„#ZóšmÂ}ÃjýÄ=H*\I¹?­ò+µ#þÆÚ~ýS-!PHÚq!é7Îx]õ*ådñ¼£óƒÃÑÈÝIºxמ³áˆu—àpƒ×Mx;6ÏÚëúuææÿ³Ÿ„ÑcTµã©Ðù•o×JDjÞ¬è xü_ózMCfdøÍSaAÈÃ4~j"ŒpëÍ.!ZŸâzdtf\·æ’êŽOª§ƒù^R½¨péÄóY&£¬]á–Ï?¾Žú”×-»È¯Ž›Ý†£¤'icزöIZvK¬t·¤‡ n)|ú” 'PUp™tï|öpç>ÁéÙκ¹q8‹!„ÓÔ‰Õ_Ìqãòf>ÚoßMýMàDœ¿mIN’˜:UæÜ%,(}Ê]è嚥߂º?ò7œâ:§¦z6ûP(îãj_צ«O|$”߉ÅP²UD¼}ôºFbã›Ýüpz‘J5ÔAk~GóIÚŸžõ<¯üžîŽ©2DöyñÉ㎠Q'C‚’"ÛÇRJ¶IJxsd[K:=S}sÕªæóË&Õ¼úÜo·û|‘ñþø;>:EUÜ*¼8vé&PP&‚(E7Tÿ}¬%V‚Æ5O†¦ˆ/4÷P/¿ž»® 'ºÈùB(Ô4áLlóôk=­ö¥:Ám:ì[ût[^KíÖà6þwò®J&SyÞÞk e¦çD=j€xÅú?éþK77/ˆ àUaë*Ô˜ØÕ ºšIR×äÎ_žéàtYö–N³îx¹)\x58oï"'’o„ï¾Zz2-~p¦â=@mftB%2âxÅCRQ L%«²À&ŠÏÞ¦Y9¸Ù[íó§i|™/­£…S„ˆaD´‰ø¶<Ò³ºÖ É­¿O}{K}äÙšŠCÉxý8~špŸ]ߪúÙßÇ(Õ(›K}§èA¿¡ù1³îïg.ÿ±Ž…±QYY¸y¹´QÔM4:=s¹?w%x¦‚—¯ååûŽÇÊß7§Xp(*8fw¶& ;އ™›P!FCÊï®[{l¶GêQŠ‘ÌQ$©Ù[ 7½TpØqŸõ¯Áý3×à÷SÄiuÞÃL?C×…÷³ÊÞrIÊŽÈ_+û…[ö–ËðVs…£¡*Û•’ ¨Ê«5y_ϱlÜ­w—¢dºŒkó(V§ñ™D*X̬ËÕä”jû=®7Ÿèqµø¹÷´—Tÿ&Ýw ¬™ûôƒ¢çÁÓº]ÅÜ…W})3 ¡Âþ~R5=Ì«>ìôƒÿÿ” òendstream endobj 453 0 obj << /Filter /FlateDecode /Length 163 >> stream xœ]O1Â0 Üó ÿ iˆ¡êR>:N•¡N”¦¿§I[†;ɾ;ù,»ëåÊ.|D/J`›H“Ÿ#ô48U ÆaÚ¦Â8ê dwÓáý ‹ì:ßõHòy8ŸÊªZCè MA#E͉F©¶±¶ÄæOڽݜǺ-Pjáìß•Í%ö›€sŒÄ©4-MrÇô{&øS°@|2¼S5endstream endobj 454 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 352 >> stream xœcd`ab`ddäóñ NÌ+64ÐuÊÏI‰¨üfü!ÃôC–¹»û§âO/Önæn– ß/}÷üîÉÿÝM€™‘1<%Ç9¿ ²(3=£DÁÈÀÀXWHZ*$U*8é)x%&gç—gg*$æ¥(xéùê)øå—34òó’R3sÒòÓBR#Bƒ]ƒ‚܃üC‚5õP\ã0000103012²Ô_Ã÷Ÿiß †eßO_þ^úPèÙw•îï*ßù¿Ë‹ ëüT\)úÛîû¶S³^mìþ. ù=òwnwœÜï6á/éõ iò^±§O«ß ·›mãÔëä¿ÏþÎÌþÝâ÷æ™ÅÓºvKc›?§{¥üoíi¢µ¡¿ùå~‹}/ý.ÆöcA¬§<_éÂqs¾g.ïëa»Ìõ]†[Ž‹%$Ÿ‡óÀ¼‰{zúú{&öõðð00ºÕ‡endstream endobj 455 0 obj << /Filter /FlateDecode /Length 14473 >> stream xœí}Û’%¹uÝ{}Å †>%OeâÉT„DräpX$;Bá˜ÑCÍéË]§‹¬®áÅ_ï½öب®îrhûE3]X 3½€¿;l§ý°áý÷|¹Úï®~wµ3zÐΗÃ?¿ºú»_Õ@È©o}?¼z{%—ì‡=öS.û¡æzê1^]®¾:¾ºnñ´m©oŸînß_o§-§z?Þ^ßÄN½Åã?¿¹¾Á=n¹—Lïîïn¿@N*e¯ÇŸß½æ_cÝ·~¼ÓëÚÞJ;>J¶ÞÃñgߺ\·ß¹Äï¯C£öìñ¸\»ä±ú¶xüù-çßC>þžª– Ê~üÕI[ßÿM.Í=5´ÙSlǧµm\fBIÇŸË/%”*µšždKumÏÿÒªèáüO<ÁÞr?>øF¾Göžc¤Üï®ÿýÕ§÷’š/±…SŠÞÍ«×WÇ~ýê7”eߣÏs“Ò~¸‰ùÔJA¶¯Žÿx}“Cæ†^¾»Jœ<þ×ü›¸A€/wüÅ¿Ô_ÿpûôæ¿|¡×oáx{ùæõ­¥Ëñ§Vt<>¾ù­]Ýèêý‹™J__[b?þݼ$}1á§oß<ÝΊFÁú Š'’«¿ÛPOµµxxõ?®^ýíWÇ÷ß]¾yó8Û÷ðvÞäÝõ؇÷~:ëÙ·üâ“Fa_Þ-ýöþþO× ý#êO/5&m§¼};ç‡Ëoöó/å­…§tª1I¾¯Žg?Rnï—¤ï÷·ÚË–BjÇ×7)¾M…’ï5pºeꀿõ—?<+ðPÝOo§B—.ûáéîb•êh…Çã2l?pßí{ÚÓñéñz‡héx÷Ëôç¡1FcïA‹ ýøvÉåÇÞÄÏ~ˆñåó7»1êáxã‰^nÏÆßïü³¼µú)c Ô]ù}þâÕÕ/¯ÄhæÃã§åú6ÍXæ­ŸB­‡RÊ)õcyÌxýZìŸ]ÞŽn–ò¾¾>¡Ä›D–¿Ýìñ”³ô£/ïÞù[|ôøÇßݾӀ¡VrÀÛçÖÄqw{ˆ§†»›å}u|wGÆœ¦š^FO”q@/8n;:Ø }:nÇò[7Z§þøÍõ %ÿ@Ýž`ôÂ̳çÇxsö]…F®^B}céhK’™!öx|â¢>†ÜäÔ}Mé¯SÓ‡‡{ÿ®Ÿ ‡ L;f»üÑ8ŸCèÃm å—žé~¼}tYèÅzþ £ ÏoÃ$ñø'74Žð.“tG¸Ò!?Ü]îîomª§ ôÁæÀn “·õFóä¾ZÇÇǵèÓŠÑ–\¿˜"ÿ$ÞÙœ^^ºG½ïØ\Á¼×öÅô©Ñ¤†qº/»ÝRûøõ£fju0·(Ã:,?~LÆÔO[O‡BnZ¤y ýÂÙÏûËÃÒp´òâSÐ šCµÙè zXf‡Š&#wC'o"ÿÜ–&¶eÍ·Fwš¿ð ¤½Ñs]Š 4óü»”h¯½¯-«û±«sçÌ7˜Ç2¬Ø3ëüúmT¤¯.—º_ÿ nÖëÛ§Ûáf5öÇâúíÃúéîáñ‹YÄý^ÿ4|1œûÛo~zþúX‡'•ŽÙý]¿¾WEç ñ’þËõMëäþWÿäŸÞ¿»3="?Ã){ýæÝã›7~â|¹?ñ5?£Ö?¼óþiþ@7ƒŒV[µºËíÝûŸþäÕ·TäÍóúñ×dÒ`Ç~¢ž®\Ÿdú Ÿdú«>Éÿðã§öåÃw=4jÖ󧯽ž†8uüÔóxuÖHS÷)•CØËFÄ`üûøæðo‡÷Wd¾÷XÂá4 èõ~Cç_®ö€™²"ìA¯‡ yÛa;•‰Ü_ýú…\‰4ÿÉû†¿]®¸\¹æ3àòÔJM_êˆËÕqƒÙçÈÌöŒÑîïp .W„M¨>×@\® K>×@\®gOÐ?Ó™ësfkßË¡œb­ÏÞ?K§B^b¤iz¯êOÝ´íúfÄZB;ÞKÔz¼I– th™³ÑŸa'†’ëQ`r?)O²¿éâbSvªaô;"SõDV>&ÜÒŽ‡®H"ïëäͼ‰žS¬YrUò|jð¹ñ¹ÒÑH—Ë%WL4>—"K®’ifï>—"K.¹!—iÞá|sxk7x}xCÎ4Hi*&ÏL^M¼4—ÇßNA{¡Dò‰â³5Mb¶§—ÞŒv»½1ó9ì¥^É|¶Ý™ÚÍN‚ïpÔ]JéDSàÊDù̶Ì:ÙìY|9什.Ýì=Ÿ²hG6¥‡»÷5œ¸p<§ÖN)ot\Rê¨qÖó9æý_òÍ|ß=³í£BÓFÖã™íÛa̓殺2[v½”êcIîE{%3["z;•²r)Ò$O¯§°{¤m\Íš|IÛÅÇ"H=å¶ ø‹‡ ¹jrUD‡ „¼Ñ]Š¥þÔÑ`šbgÊCZ¼Ó\M´M®¢§ÑàT¬=%Ÿö}A*™* %X{* Jj:퉖O M¦·&O‚f3âÇ+ÒÑø˜w2CÜœ¾A·"$ñ³B¿•´"^Ù!še—ÓÉæzê…^8WÞáœÓ=Tj_‘,äε ›¡ŠZ/¨ rz&i#§ºFhÂØÛŠô$zèôŒ¥15Â%ÜT„f,Ì)ÓˆMê‡ ÐìI*‰~@O¢ “g°TÐ[º -õYxšÂS¥û‘êA!B/:A U‚®Ÿ!’CvÐ#dh®Oµç/å$ÔäJ/1Fr>…(`߄ЌÁ½‹zãÔdîà•‘šÑ?ˆ’‘5ÊŒ4î ÒñäR˰uŒÐðï@è)±Kv¢œÔ°é§Lí!#È^ÐKSÏÚ-ꥄdéÉ„tt+ФPš ]®JÝ”Â]‡çÿP ¢è±Kݰ@¨ðóÛÉ2Põ½è–0æÐÉ>¯@=5—¦—rÊÝû®Ϧ/’JÅ@ò¼Â² ‘Ÿü‚4Œø1_Ñ5Ô/£Ȳïa†»È"TŸ®Ôô°šZÁPwYƒV ŸJv@Ü Æ¹ˆWßÐHvw @£Ù7ÔÜW¿-ö¨<Æ'@f û†’9Õ¥ 7yi(½¸4´‘)^Šž¼4”,@õ MÙá%ÝÐÛýmdúð@£ ÙdåÓRh l/ÐÙ\L€Fó ……/+ÐÙVL€&Á%4ò¥]4äëtžG&·Èfb4îyÈðú†æÙFL€Ü°€«hò[Ò4Ò[_€*Öa%Á´9€æ½°4” ä¶4”z[J½, í Æz…æ¼àV–ÁWh”WßÌBF0ûf–4@»Ø}3K;â5-YXßL¨ÎqiGUû:š}š†xY€®¶Õ€J³Ü2€+MrÛÐ_ú_gËuÁ•&¸}Ò¶vÀJc¼úçS3ÙVÿ|*ýó4ø1 1Þ—–Ò¯KKá,-¥‰Í_Ñ ¤öhën4ÆËB%¾:ÐËŽ}ކîFæðßÉ~ý’{º‹—ëÜÓVº(Â~y0;¡iüd>-û&F¶/H`×pA ÷Á¡b8De Üž ªcLÀ„ ‡Ô¡s*bRÆDLËpˆŠ15c"&gä"®ÄÔ32‰ìk“4&bšÆDLÔ’^ÕÀͼªÆÀCdÈQ]c"&lLÄ” ‡ˆ´1Ó6&bâÆ@†ºá•7&búÆDLàpˆ*1‰#7µÛCã€#]^䘈©2Ç&¹Ó92„Õ§Ð1: 0¡CÓSèÀ:¶ö4jßGO8hÂ`ò%ØNJK…Iï) ûHB¿¢J '^×PJ¢ÌÊ;<)¡_ÅÄê1-õ‰= “ÒÖÐ|Ñ•»ˆ÷6—˜àB½PV†àBÓµp—!¸8D—‰˜àRƒ)9&¸Tã_&¸L€ùyÕî0‡¨àbÖ\&b‚Këê0Á…lƒcz‹Cn![¡J…Ê-ŒK•[2&Tf*·x@äÐrU3TnÉDE¢ˆ"*·xD䇨ܪ.:N±EÆbYTmqˆª-°­ÚbU[r âFšÚâU[2²Š¼¡jK¦¬ÒLm!m'¶L@µ–Bn–Ü·‰-Ô³œØâ[`[åý›ØªÞ½ØRbÑ.lb‹CTlw–gj ìo-E凨ÞRˆÉÉÒ®é-`‹û¢·zú‹ÜâQ[ Oiª-;~DKQ¹Å#¢·À—O‹Þ„Ÿé-¥êzâÐ[¢zKiJ†Þ‚É@¬é-Q½jƒÐ@Õ[JßUoS½Ó…ô#Ó[¢z s ATo©Ød.ŨÞâÕ[ª8No©`tíà—JM6˜àâ\*õ}CXp©à¢"¨àâ\*=cCDpÁ"=Ý—JIº’ .Á“ˆJ0*¸´­›Â¡‚‹GDpiÄÂe¸ªàŠÄÁé-L©)0¢·8Dõ–†í4R·ê-- ér‹DmiYùæP[&7i‹ª-­˜|fjËDXmaÉAµ±Í­i—5±eªµ4Y)BµìiP¹Cµ–¾o©‡ÖâÕZ:=TvK‡ÖÒ£^ÓZ¢ZK'²ºI9¢µô1šÖÒɤˆí3­Å#¢µtê`ª‘¨ÖÒ«=OÓZ<¢Z zH¦µtÛ £Z ‘”]•h-P­%î*î­…f~Cj™€*-Ø #õ˜ÒB}±ª®¢J‹x÷Ni™€*-˜Åe† -D6LQ¡Å!*´Ð,®¬Ã„–P‚LÅCh!÷Ô” Z¢B &ò&š‰ -¡‹î"*‹¥TbÁÞ‰…ffm½*,8ž¦*,…k0A„#UXºMT •X<" |‘9Tb!&o;ATbÉÛBTcqˆŠ,yÏ2 ‘%£ÿ&²xDD–Låm"ͨȂ)¦-[?@Ê´dY¢"KÎÙ$Y R‰b¡"ËLdÁ¤— ð%„›È’iÀKMdqˆŠ,e·m:&²zpE¶„¨ÈâYŠõó!²»YJ‘ìi“&«ÈâY¢" f̬û>Ddñˆˆ,Eˆ·Y žÒ‡ÊRz‘Å¡²xDT–Ò«Ò&UY v\œÈâÑX”Ec©èþ"ިƂ‰W”ÓX¢KÅ;[4Ìf¢0šÆâÕX°Ã«{[^¥9¦±Té&°XRÕ•‘iûÃØÂ iÅ!*­€Q&[DZÁŒ)€*+˜0w)X•ˆ²‡@¤(UVÀ9»£ÊŠGDY©%«ÚaÊ Taý¦¬`žÝø*SV<"ÊJ¥a%Ïß”•¶©Ó:”ˆ²Òö¦»çTYÁ<še…·Ñ/{D¢Ê DUy¤¦¬˜0„• ¨®ÙU¶ò™®2÷Å™®Òrg0d• ìËÏ*ªL@5• ¨¤ÒŠrš!©4LËN‘FcY^’i*Mú¯£k·5ÇÎnÜ(a¦¹\aÎÅÃ,aãE»Y‡¤ÏW³šc´RKxvgÜ›•’ð8ù°FÙ»ˆ> ]ÆrÐ 3мýžÏ7ÒHA,bà,»œ¬ÅÒÞß`7;õ%òOŽRiÞsýŸ¯Ž øC¶öGxˆT?Í‘4A¿ø’ö”¸{}>S¦L ;ŸÍÙ¿¯:ŒÞó¹L2±`…³‘ŸÊÔ1!q_ó'zà–¸–„‘G&?ÒŒð,ÞÝõ––p…!ô¶"©%vyG’ÄÚûÝZhׯ÷pö“ƒî{¹8¤mpDÑácâL.í ¨¥ÏPt󋑃ÚwW‚¥«Çî—³„ÌÎô¬CÒç«Ù Ëa­´Öû8ûIMw¶\<ÂJNذg\Ÿüü@³ÇFõæ:ÒgjX±Ôr“QÂHïòž'B.ïÆeJ ØþÖú¬CÓ¸B[1rX+­„õ>Î~.Ö½*‡$Þ©°hW™»ðRWf‚!é3¤˜*n¿å¨‘Ý÷Q‚¥¥\aH`¯y–xtÎ:$+¬–ÃZi%¬÷q^\ÙŒrqHd”µ^’F„ò@° Ç[$}†²Re娺OÀJ°´Ô+ Eh– +*³IŸ¯f+,‡µÒJXïã¼z>M¦ì‰džBÌó„I-H÷qx¡ò½A+ Ýå¨QöÏX ––:pÅ@¸ïÍ"Ï`³Iã k…åíÖÖû8¯[—óÆÁöUzBÔ…õp¯à¬é摲„W:ôòÈÂÝ(\’Èmµ[†Ñ^½zmÿyñ/eûÆÅ!ÚJÌ"r© Ê]Ï¢p´ G¾‹ËQƒžÓ,-uà CèéF\a%$^ˆŸuHWX+,Çð‹µ„õ>Øö› šÑÓىσÊ[Yd&ße‹Û)NV!ešOtYáeÒ"+E‰,V² €S§îÖãb±¸¼:XÓXd”u>Þ^ ÏD%øKM–°:e[¢£,Ú_Dg},Y„^X†¡‘µHˆsX#¦y™Ryß{ž­²zûX†HUšCÞ^ÍùªT=Cß!Ûb•ƒž›¬YâÍ@Ôf( ¢ð˜¡à÷`Y£ëÊY^ß›¬¿ÚÙÌÍ…ñÇÊQ]·M&¬üOvU-–cka»ŠÃ©YNçË:FH¼Ò8Ø,µ•ÈN›UE5/½©àÓ.çü =ˆõ>5௲ZÙçgtÇÌ3Œ8íÛX×+lE2]Ç»0¡Ã‹ÔGV¨9à-ŸV›œÛþ‹"uÄH->ªÙqî;>RÇǹ&2cO°Ú|䌉¸\8¼ûÈq¹àí>rÆDf®„ 9»œ1— r[îq .vÏo>ÎÈD\®Êñ´|®¸\Ïž¡ª?*VO%ì%ùD¬Žàbu ‘. î‹xõšs69Ù’°LßË‚ì²à^a)¢ ²àŽEW^¸'Û/ îÊ!÷¢,¸{¤©ª]å8XÂ2}• ¼¦œÀáR_YpG˜ŽMª*²àå&J«,¸#(/*',Ó—¼ ­°o5–#Ƀ“÷”#!ŽæVD5X˜Ž„ezÙݬa:–é£ÊAˆžk˜HŒº»Y½Í¤ñ¶FTŽ„…z>Ö0²!чéH±ìcos .[›ÌbÝ=Ðöek³jòéž—­Í ô­-@Ó9GÀ%hà©,H0–< Ä0,0»ãã õ>C‚ºé#1ð¶™%C ìŽ;`İFï#1ÐøX#1Pk$†„z‰!aÞGbH˜e|$†Äo}Cq,rIÇ5CÂÒ¼ÄÀ›i|$†Êè#1°FbHX—oKCë‰!A¦MKCÛ‰8Àòs_#1$¬ÈûH ©ìa‰v–x¹Ð7‹ò>C¢|]¾Ägá=8>»8û ô%>KÂz¼ZXOK»hú +P—ø, ‹ñ>>Kª²RîºÄg!‹—–ðäSïK|–„uxŸ%a~©$íKt‡„ >>K¼ÏÂÛIêRFiK|–‘=. ma‰Ï’°ú¾¼j,¾ûø, ‹ïyI÷%>Kj4Ùm¾¡ []€¾8Ÿ,¦¥Ph¾¡,nÆ(K| !šKC™°út]Âcðv‹¾4´oKx >çcðˆ¥ö}_b0/ZFpi ’:6Õ´hhi4½mþùtìÏ Ð4Î’8ä¹´´‚>-@×8KÐ_šÑƒÆY@_ÆpÞ¶¢a– ؃ ߦãç‡RðÎ)â`”ƒ×ý¶º EãXlŒ˜ê¾F܈©¶qƒ½>´â‚À#†¨[vQ1"¶åŸŽÏ[¤èLõÔ¯œHT¿Ò!øšÄ‚À´åÉÓÀvÏDH*]ã^°8YP Bö-ï Ò$¨”{¹«¦A &Ò5¨¬æ‚íE}w>C±5?é#va#6žpPƒ‰ jô4Ÿ¯hºI„w–ElÍç¨IÕ nâ©"Q &5ªA”Ö i`IgÀQ¦©Ï`"Mã8DãÄ$^nĦüªQ/#Ø”ŸÃŠÈöz‡ì¼½>Ù†ðˆ=ùMÃ^0ÿŽØ“_Ú‚DÙ_On”rÀ¢GI;Ÿøˆ5kÅ´ ï‰Ø”ÏA'R4È"vÉHÁ0zŒèþÞˆóÕ<¨&Ò”±Á+™¼$lO[ò90JÞõ–Ì^[}—¥gìrŒ‚T Œ’åœ8à¸(ˆa‘îƒÙ!Mâ¢d®µr׃c¼3/bW~ßWD",©“‚aü4è…<_lÑã¸(‘ýõ|L¦› øS"ŒM(ôBòtÙ_?‘¾ÉþzX é6Ø·iЋ&t™ŒBÛ$pŒEØé³XÀâå쨧ß"–dvz¡§ˆ#6èôº 9òéÂ!LD5‚lzˆQ•`"&LÄt‡´¡!*bJÁDL*pˆj¹ª bÁ@L-p€Ê1½`"&8Dƒ‰˜d5lÒÔ ²©°C4pHQ'1Ù`"ª8@…ƒ‰˜r0“RG¼ A†x0S¢òÁDL?˜ˆ ¹É© `þcS>$„‰˜†à6ƒ5s÷ž*Â@†Œ`k-SGˆ JÂDLJPä‡i Ï#a8ƒnAEý4ˆü¡¡¥Â›£nõàP"4`Ö¨ ’‹núº.KTþe²ö~3uÊ›®‹awx‰ b¢y§âkQ£d¥+‘šŒ$â Hð‰(ËEq8È}m¦h`Ψ ’Ÿ˜Ô¡Á4‹)_4Bƒ[§™‰b^€¬ y2–½ä2“\03¼â2qéé%*›1Á…'DnTpñˆøô˜"E.0Á|ã•\ ³Dpqˆ .:ÄÁé-øWŠU¹eª¶L Û"ž†€b ¨–Ö£b‹CTlÁÎ+é|*¶ B•,*¶8DÅÌ©û"¶ o=8­YW­Å!ªµð’¢è(ªµ 6ß‚I-P¥@UG”>C$ˆ*-%$eä&¶xDô–ôhèÐ[P£ô+Ó[<"zK‘c–No)©‹Qz Z¡bŠê-½ú&"ˆê-±‹–¢z‹CToÁ¤/•›ÞD.\Š„ùp‚‹CTp)-XÉ*¸”&+ØCo™@ÓH’µ«¤òìLmÁAÛ$¢ƒª-Qµ±#ùdåP[ª±Ë!·8Dõ–ºó¡§·°k±è-5j¤Ã¡·x„õD÷[äpñ$åªÜâ‘[ªLÁNnÁ¶}Q&MnáüŠˆÜ2“[°ö+Üäx(A4•["r bi¨¸¢r ÎÅÊÛ6¹ÑÃ"·8Då„ ¾fr NVEDnqˆÊ-ˆ¦ÁâÅ[ÀÅŠ""·À‹á&· `È-Á!$Åä,EË nr‹CTnÁ9VYü5¹…cŠ,¢z ž^öXxDls‡)Zô«,-½Å¬·àa¯{,@uú²Ç¾G–M!ª·8Dõl¬-º£BÌs· ”Coqˆé-w¢À˜ÞÒ5^£ê-ø"¸=0½%*³r‹Å¢rËDLnAALn´ÔôîZõ–‰¨ÞR|¶Ë" u2ô– ¨Ü‚ð¦eÙcYC‰É-ˆN¥ªˆÊ-¹¹Ô«Dn‰{±Ý*·xDäD√܇`zKÚ²åQ½Å!ª·ÀbC5ô8!›(ª·xDôDÅ’Îoz |ƒ¾ì±ÀqÚ°ì±pˆê-˜ûwÝR!Î<¼‚mÙdáU\2ÔATqÉrÞç~*.ð ¤*U\& Š „X¹D—‚¿.1Á…•ÙEpO°/‚K‰Yu9\<"‚KIÚÕMo)£›ÞâÑ[Ø+¡DôheBOLo)U×…†ÞâÕ[¢z ÜÑ Moñˆè-Ð’E8Q¹…#]ˆâ¡r‹Å±jËDlAZ[à|;7±Å!*¶@µ–1#­EOáßO­Å!ªµÀ‡‹dZ è¿ØYÓZ»­i6ɋ؂MTÛ"¶T1ã÷Slñˆˆ-Q±¥J¤û)¶xDÄ–šÅ…Z ÏÐ|ߦµ@UÈÒÕZ"Z tPî"&µÔšžI-©…·t-R ‹I•Zj«©Å!*µÀÏ@•–¶i,ñ¡´8D”LübÆLiÁ4/³”)-h€Z& :K ajè,ØÖÙQÅ!ª³ÀYȈÌç­-{2š¢3™Å"³8De‡¨Ìâ‘YZÒ8?CfÁ6kÑMf”"k&³x¤è‘4U–MeÁ9Ž]QY< *‹CTe/³ˆ,È*]ÂD–‰˜ÈâY<""‹CTdqˆŠ,­uíH&²´®üoˆ,1‘eÓUÆ)²ì6+ ‘e"&²X4Ï)²ÐˆÃf"KÒÝuCc™€J,Y5)±@±;|¯Äb7>)¹<‹S=ñªG°uè¹½b"º½ûxÛ+&¢Û+ Û+&bÛ+&bÛ+¢Û+&bÛ+&bÛ+²~nc2~XÓƒ'ü0¾?¥ûp¨¥T£ûtß8„Ñ}Ìß²óÄø>¬mYø¾CŒïCº•Àø~W×oþ‰(ãçÈBð…ñ;@?X¢ÈÆø=¢ '¢Œß!Êø="Œß!Êø'bŒß#Âø"ŒßÊø="Œß!Êø¢Œß!Êø="Œß!Êø¢ŒŸ‘e‹…CF!’Ò Šj ¤ñ­„‡+矀Qþ¸Ù~£ü1Ê?£üQÊoA-åÈ üÊyš;›q~L‘› Êù=¢! ·.sÙàü¼}Y VÎÏæL”Œn! QÎO~®†€3ÎÏȲÅÂ#Abî%Ð8?#žò :P~å'ÖM(Ê¿ Lù="”ß#Bù„)¿G˜òOÀ(ÿ‚0å÷ˆP~å_9è¡ü?pAØ@{D(¿G˜ò/Üjågd9VÁˆgüÂO@>y¾/€?Sááû„tÝà¯|ŸnV¿&5ø>¾Z i¡û#=Ø~Ñ©xÒýò|wÅDŒî£=B!t ^O…Ýß{4éAé¾C”î{Dè>Ùsc|ß!Jø‘ÝJøY?á8Fø="„'™ôp†~„–+á÷ˆ~óêa„”…ð„G\U8D ?®Nˋгm=PÂï!üqÛ)”ðãh«¡ÂD–uð;D ÌúU…AøˆÖf„ß!JøY¶Xè¿÷“ð‘e]cüQÊõ%¹H(„…•Jù'b”žW®”H[(¿C”ò{D(ÿ8ý58’ÇßOÎïáüp¤Ëçј¹q~‰'sï8ÿDŒóOÄ8•…Iù' Œ§¾…ýå¯]ÉÆ üQÎ?%ýPÒï!ýQÒïeýÖïeýQÖïaýQÖï¾fPÖ?cýQÖïaýQÖïeýÖï¥ýQÚï¡ýÚ?ä£ýPÖï!ýo*ûéß$üäüPÊ?cüY¿ÿ=(?‚ô,Ç/& „~°nÛZ±kLì¹µ"•Óº³bÿqã?`ü?€ñ<Ê% …8cÿ,Ê%ôwref”K ü¶÷/áy J¸Ä©ã¸XXQæý”l#qF_ÍþWœ’çÅ3Í¥ãErO’C Ð8œR¼&ÎWVùøUšf×®M?óÝðõˆW‹[ÁÀIº!!éxí¼c ó ÐÌ·ßõkâ‘X{ñë½ýŠð)0ˆßþÙ1±¢ñ÷àö‹ˆ™>“lÿ\dLÖ?¶ï CÉ߬øžx–¼ÌŸƒ™™> É “Ï2|.S— ŸÍÄ_ö“#üi˜—»$â>ˆ7ÉÊÁË™¯r°EŽõy02d_㈌ùq&Åác­Ÿ U™çYøÌooöïÉÃkÈŸ¯m¾]9ôsqHÜäl¢d$9¥Â‡  f¦ÏW¼‡E¾$«9j”ƒ$V‚¥¥ŽóÕDvy‘£ÌÃÑÕ!i\a­°ÖJ+a½³ï”‘ÏŒT;é'UxÇS’è”ð@øˆ¤Ï®ªûa¦ò¼z$wÎjÉEŒãKáIº‚9‰ÌV³þ®Í²Kg›ÏË ‘Í»‡ ¨3ˆû$ç`øû'<ÇÒgÈPEÓh„–r×kR*@~@Z9ö ^7ùÀ¨U i\ -° Ö@+`½…ó2Ìå ÎÅ!*‘AXb]¸ùdGnrFHÒgèJEŽ•YŽäx˜•`i©ã|5‘œõS"ZBb¦6ëôùj¶ÂrX+­„õ>ÎÞ:é)š‹Cj”y×S5¼ðÉûø£µ’>C'²¡¤9*Óz–`i©W7”?bÃUîyÔ!i\a­°ÖJ+a½³7ªzPæâèøH$Ú;¥»@¹ÉöIŸ¡ûdéx–£òRé,ÁÒR®0¤È'6F CV\’ÆÖ Ëa­´Öû8û¹@O¾\<ÂáàDáATK’,¾’¥ÏW‹²$—ƒè[s×[’+8_ ‡<Úa^Žý,ÑU éóÕhe°Zë-œÝì¥çZ.…ä2Çè$ždó‡ìжôBM>%—ͬKK ¸` ;S- uþŒô¨AÓ¸@Û0rX›õúåÎ~¾Õ3*‡ÈºXeã%J‰âˆÈ༎(éó‹$ûîr`¯^u%XZêÀ†À-«‡Y¾Ç\’ÆÖ Ëa­´Öû8/n‚œC¹8$Ùÿ’º(¬ëbóKfÃÉ3”¤ß\•ß«°Ë--àCv¹QÀ¾ëö­AÒç«ÙËaM´Ö›8?wmª„3$óéFJϸ P¤×ø(‡“f$7—ƒ¬½|þSK°´Ô+¢ß¦±ðõ‚ÝÕ!i\a­°£ÝZÂzçÅ#c©ð29±š°SU•ùžJ.ƒÓç+þ(Lè.GÝô˜‚–`i©W D>F4Jˆº…Çê4®°VXkµ°ÜÄyñ"åìÆÅ!…8áû%Hh„@Ê–÷‘±’ïTÍÔèà®Ö¤ü ,x?ÌË<1¹ $ ¸~ûy8½zùÚ|ž Í»D¼ï.>/¢îa×tÒ=Þ»|W‘“ð$Õ‰ÓOóÁ›¬U¾¸ëf^/åúïM}¥ºEóÞj•]ÀÕ"à“üIxCÞ^ G¾Wæ³ ¼»€Wç’F3hiÓõ:Eàzè$O–mâzTYUùÝåÌqâUë‰`Z× ì…£Êє˂yÄN=Õ1äíÕœ ê.‘é/þÖQÚ£~ÉKþ Áœ¤3@„k˜xR‡n SC–—µ‰È‹{ÕWûÊ_f«_9’+ê]÷äñºÿD`QÕ|±XÈõ!Œ=+—8.´®j KM64s„¼„>“XS´ŸˆŒX<c ]åI‹Þ¼5+Û¡Å™NNƒM;7 fËoŸ=á}ÄrFL"Lı8Ù]pq]|—­kƒqÍýF±ú.Ýõ[G™tÅú2{~v@¹Ž[™·,›~†ï[O\fQc0XQJ4üú.³$ó±uEùâ†G«wÎ<{·êly²¤ÿÖùæ¶èxC†ºwÕ¨ êIûÕV˳uyUß:_x–eÃh–ežë²0ªy–²†ã&ë‚7´,öÂpçÒ¡e‘U<-J%]g»ÌÁö¹Î&þ™[‹Ó|wd;õZá„>2ÓŸÂ’˜”_¿¼{÷Ý5v§Ð»ÙúññÍõMàiåÿþúé½Áy ç÷ãå·.q÷xw¾¾AºGê­ÇÛ{-`KÇå‡ï| ×ïÃÑ×}ût÷{üÒ[íGkHMÇ×.Ó݇§Ç»oð*!®låøtwMb«[;>¼—ëi ß.Ùñw¦¿ß;\ÛÚðÕ„#‡å”Ëó~üúø³Ÿùõ5|N-¡i3»Ëí“BRîd%GdßµjÉùðhEPK¿uu¿Ñüe_ñG)µ„RB]k½Ñ¢z>ÞúÛxmÍnkÕË;¾áȧøµªî«¿ýj<€J#êø@ïø†?Yœå|uoü;}Í!|{<>QöNùùÝú÷Ù«}ºó­|¸Üq?Áô0^è'’ïÉZŽwRY ÝWö u××ë7ÿÁªjKWà÷è*ÔU?z0véø®s‹ô”Ÿ–2oî—ôï9ã^žWm-KónŸnÿáú&blµ}íz:º4#G´±¶—†êì|ý¸Û-í÷ 4$öc˜Y\Ápيдÿøé ËŸ6-üI”,¦ÅÛŒûËãï:¨íï~EÓŠ+ëâdÑ7»ýêøæ Áz3ž>ŒÊ¼•ÓµkêŸÛF|?bïÉ7”Æ÷ˆûß;¤–½ß•¨c¹’ÿì"!Ëä¼>Ó¯¯Od”á\ÓÈõ¬ÓF|d„ÆÊñ7÷µsý±õÁ®Ý—ì–~ýZ3Å&]”kNd×>çÌöÒŽgƒÉJKåø Ï ÔKÿ¤…nõ£±)·YޏS—ä°¢OeÜAãöÈßdX^,†L®o÷O¾ Ÿ<êFЧJ£ó¬!g„e†%Hº³7¯Ëœ!fÅsȰx¼ÜýqyŽïðSä7âÛúø €¸Ù2ž³ðëžð?èEd^ŸÛ<®§½ð\o$w²eøð ½Û»eæÐB·½~l´¤3•lÓÅ †ØMÖ¼ž´¡Ø||§@§ÜÏ.•ü)£‹ "Ö^¸àºí…— œ^îj¥ß-&óS}U L€¶ÛìøOhpËÇ?ÜQMôWâ£µŽ™1"1y â”ÄÖBÀ@›™–¨õj†˜ó¨i¬‹MÀ·Ã‰ö°m<¾x¼ÜÞS7ùÅ¿JððÕ€`ylÛ‡!å1À ŽÇ_êÕ|ìþŒŒ?~bˆ;¼²pà—]ã°Œ8˜ðU™YÞWG [žj÷ãÝx²™üEü]ØóãÃò"ù%m0÷ì8vòHßhþJoîA_éžü›»\hdüoÿÈÆË¡+2WìÉä—:Ûç³óMàO Wµ,pÝð~ŸwÂaf^ìHøŽ8±éH—ïîŸ>Ùr>ímô¢·ŸèÄÞ7\ü8ñ¡Å¦Ÿ|w®í4ïÆcÏh ôç;3Qù%K;ŸÇó{ëÚæ@Ð Ã[úÓKw†¯Í Õ;»,a©Þ%ܺ‡}Žûs{úRS2N®¦Ýó§qÄ'%ön-yøF¬(õ¿ão¾g¤ Óxúð÷ZÿŽO@Î’o]-…x¸ÁQLG\Ã?^ßà\ Ý‘=Ÿ¯¹$¢7/ÝG¨Ò]Ô Ú3ÕB"ºè ¶<ö]gRˆžÎ7¿ys~’&¶»Ó:+žyæàìÔKv&5ù uß¶g(\Èd4M¯?$®íÆW—¥²ûÛË7¯o¯ovœ%×(°?µ½¹Ùv½£-6f/±…}¹ác±¥ôJ×r¼ûŽM/ˆ¿F׆—ÈÔÓ·ožnwdÇŠÎŽ¯Mà¿7lV>HANx€ïëÚZ%DZϺ2±þ½¤Qר ü èaÓ«X*H9†æ*À§xJÏü †µÿåÕÿ[-Íendstream endobj 456 0 obj << /Filter /FlateDecode /Length 4385 >> stream xœ­[ÝoÜHrϳžî’§< p „“õ0ìïnï9ÀíÁ{¹`½È$8iÐÒX¦5œÑ’#ËFÿ=UýAv“Í‘µ6ü Ù]Ý]Ÿ¿ªjÿ²ªJ²ªðŸÿ{ÕžU«›³_Έ}»ò®ÚÕ÷çgÿòW®áMi*CVçoÏܲÒd¥„* «óö¬ |}þ+š –´4šÃ„ó볋¢m>ë ÕeE¤)»~½a †^¼]We%˜"|èü{­ŠW0ç~½šBi΋nMʪR•.¶8ˆ—¼|Q½Žmqb%4ÑR°ÚÏçÿ>;Ð&lrÃD©¥t[uT¸¦f¤¢¸dÅ>úÐ7ÇÆ4 x û#¬8¼ºeu²¬¥ ’:Ö?9îé”{U)„ñ#. Ïà„ /)':ð÷pI.Q~ÅjR• ë)ØäjCJ¥¤nÊûõF ãHq빓.`€Ù £IÅw¹ÍòRsCÃyÈåÚ âjÒH=ì÷²‹[v=4Çwø ÆRU\År;´w ]8ˆ¢8ì—Ä»_£0Êc/ÚdHOÚ’y; Òïêx.#>ªRQJòQ2a¸;oŽ%0RRmVÑÀ‹âž9NA¤U–ç°wJ(ñ{Xä¶ÖÌ©rª!J.PrPeVåeFXI+D–°02µ/Qš>ÂJ¢'¬¤‹¬$ä+Ù VšGY vá†ð%VŠJ>ñYê_®7œð~¤8±µ±n„‚å‘TÅ?Ö` ã¸]üO¿aÒ”ÔH`(+ˆÖ­ó`-CQ#eŽ?DÑ8ƒá ¦ þ“ŠÄÞGÎî*vt‰×»F¢²4\oM"‹OV/ÏÏþræbXuO1DÑ’p³oÎãÌEñoõn‡~CÀp°õŸüN@)´N¹Õz]%\Qc}pNá?OQß~Z£g1Àéºk†1tªçî€Â/×ãj»öÐMEàüÔ“"yÅ¢ƒzÿeü³LJÉR}DøÉA" ^Å]ö(`[q|·ìîê£û$©”àì;ÿIË"a§×>ï­“/×nEÂWÖ8°a šïûd³±ZÔ7»¦önGˆS0c޳C°xk‡[L¢-Âz™V¹þÕ!•§¨VÒp6ùjÊCàì<& Êcê/ÐÂtI€¯M§>” ?-"ÌdA t€Vžøžƒw‚n˜m À‘(x7s_î¹ó ‚+YRmêÑWˆtdñÓ•‰!®Lô¹FñQiÁÒTÑí{€'ñêuW·‰w:&«v}8·A_ìÎÊRÊMïIWªhîšñ×Ó4vºpàY³8c°œÍ?Æ»³iÀ•Ú`è„É&Á¦oöó áæÅAã+‡ á_IMJN£èrœ¸ÛʵÜøÛ»XÏîSóku<a2ÞÎ×1CÍKp$¦ vȾÀ )x bdÊ9ëÅC/ÞÇ*xp’²#˜(f¾ùÊÙÜ\,ÁŠ-&wG Ñ=„/âK3€!±Dh˜E†DU >A·Ùü‹–²2­Eh“fI"ز0þrýldÀIûÓhâ”ý5»æ¸Æÿ)ÕE"¨]¼F?²²Ù§ Ø­1Îp}8xA²¹oð.Œ‹¡Î­Ú€ZJà  æà³sXQQßa’íj6¿B·r2!´Ä|^ Vg¿T$§$3™„XÓØdú ¾qªì¼Â²ªHÁÔòÊVwSNþO©mDuÔÄWÂ’(±’ðIf±»þìÎÁÉ™ˆœƒîŽ…¼d —K›„‰šë*Y´9sYW¸4XxG+½IÓÐØð)¹UŒX¤ÝáMlñLäf-C QÔ±§ç¡Ø¢4×xð¥ð¬\ éC:ófѺ¦…{I°m Ï Mv‘q X£­]ÂváC×$ãÚg6O.š2Y»´¯Q”‹dãp•”Yw~ €ŒkÕ0Š›¸_R€Þrßñ8â´øgXØÈ’*é}å]ÖUpm*¹b6è8—rÄqËš¾_ÿÓ\å«’p@t ÓŠ3_-H’%¹åÜú†ƒ„I>ßWïjŒ ha«¨+ë`?üáÇ×/ó¾¬beÚ†h‚¶Ke÷_kÍÐnüƒtn—¢?:Tf?ÏyŽ”d®£/)£E_ß„*tÍÏ |äO?ø ðjf@½˜ùÙSp5¯°ÚS(•éµÙ=J–´'û»I^È4užGH X1»Â€s„Yê§®ÃSyã+ËdV¼¶ˆrL¶{&é­’¡ý''EÿG:gH‹ñ´ÕëSeᤨê˜Ì“íj@ÌóËB¶":ûÊæò€¡’(à÷âùΞ»HÆ­ _± @ðip=¡ÎÇ«V9’ÃÄU‘P¬¨øâm÷.¹ÆxÎÂSää-é¤ÙßPà€‡S8° S׹׫íþ¸E84NO|é9qÉt!œ|–Kž˜ot?¿~9®‘;ĸS…–„…ë¦ÝlìÃoc×ôÇËâ‡öî°®…A&Cž¤ +¾ß®noAá†÷Ÿw—ë|ÄÛ¿;èò"É£¯T¼?$êf/Vجàµï§$8ß¶C8]«c®£®Ã¢g•dG†‡J²ëeéPMøß´Cc)SSë¸Ï<Ú¬iUº¶Ì‰Zo¶m ØSqpjÒ~ó‘;ÑÕÐ O=`÷Ãì^žï‘Éž³m2…Á}ìI5}`æE³Ú#xUêОªúõ]t %vÝ!ùÕØ j½š_w.yžNº-HÊûF¼T·à…\ªµñ—~ݯæmô#Üã%Ÿ™õ-ø³)HÜË~»½¾D<]ž" ©ßºÑW\íÕø«Ù¶Fž¿Æ u@ðÿ;ë·ë ÊÚþÇ|zеö‡®mÑñì#têÀ|ô¢½\£Åº‘SˆÖ©óë`Ãê²øôýÙèÂ>lJÎûv^ãäá1cˆø*W£-‚œ‡}]õ7î¬äç@QÅ2¾ÓŸ“Ýš'œ™ü6ò¼9™G»›Èüý¸×Täí¢È*î„Òí¥îQJ³.ÞG¸ý9Ÿ¤-#1 B˜Eë÷Q|»c*è³x[0£#غœ7nñ¶÷Ñh²Í¸‘¿¿»ÛvãŒH—NÐú6Oënw8öZ$¨pN-íiÚm½…pê@±^KGû¶Öyñ>²¬[PÝo>Ô»ûí8ùwß,("•ÀÒÿ/Ëüåìÿ¿ÙÉendstream endobj 457 0 obj << /Filter /FlateDecode /Length 4909 >> stream xœµ[ß“Ü6röóV^ï)IÕD•ªãÄ;ñ8Ÿó`[çKÎöåt›J¥¤¤ŠÚ]hÏìÈ3”Ö›¿>Ý €HÌÎH:—p¢Q¶Ê­7]{‰#afªoºz* k\Õ…÷,³ÚV{?Ì9^}ý&Õ¾Kþñ~É-ÈÃD•½›‰ë5¢ú¦¥ñŒ«ê=,íЬz^é]õGÿªrÒ¢ì8\ [õ¹l4§Ä™ªoü͵æ¤MZiry~ Krþ5è¬rÕ.ò‡;%Œ^/ÿçêßÁ.Ò¦v–×R8°ÍÕÍEÅÅòêÇ‹•”l±ª¶ZãŸ_T`“w°¡ë3CìÁd /°¦±oqhL¹Þì^¥ Þ<Ýìà©Á¨ê:£Ý„鯲É}·…ùwqyU½¬þíÛïžÑ¶$ˆiª—˰$X«Ý¬wû®OíºHÁH§?´}ªœ}»Ù<,­$S6¨`p–gàóLÙo“77íujlÜ!ˆÓè*$jF«*âð.ÓQØ'8ɳäï«CŸ¹ƒ—…ÖC›2Q+éøâê» ÐÏò·Ï®.þráªZìÑÜ⵪æ’ë…il­8žÐŠ‘_„i?t>§k¦X:ß ²š?®Õ+tžF¸ê!ž(={Ym§ÉŽõ?äÊæ&¼¬d“?ÜÈ›üVuÉïûÔ\Ýõ’ëÚqê7aˆ`8¸&·朗7ý!3¹&àqÆÂ!û êòésÛ,àmÓÐ] -½X±Z @ ø£˜kÆ8³H¾¨ºÃˆ~§Ý6<ÊÆEØ‚þÊÃÓ`‘Òn´«aC¹›EYþ4"Ý z0̕蓰m¿ê/ÅU¹Îæ«v¥UEiÕeIÙ´*‹èX8ŠÆÕÆHXG×Úâ8´ÀÕ›$ Ý" hügõÚ#°ÒàÕ92Ã3,$´žyý+“é_BUÑûÛõ¶ûåÙ÷õfw]Ú‚á.lE6 44«.8r¤·G,ꉜ0 L¥gN' žÌÂàrZVí~ªz›YÒ_ú²Ò¯™ˆJÿévWoJCØZUˆŽJbÁ¼‡·ž‡È) ȶؽND|›EŸ*n )|1ÓØßA¤j3ê?s¼lÐM[ Opð·xæ^Áù¿‹`µ À !$%¤ª’7Géºd¬ ®ö:ü–.÷¤ôÅ"gb²fRœ ‚Ûsi†eEš¡ØÑ€ÿxÆ4L$м1¿ã CŒ±áO§¼#bæ!hÛÍ£X‹\®à6cnL/Ã!܆”V“û¿Š<´p£? êS´>ŒFØôž|Û¾;ºöîII±Ê¬ú¡—ÁöÙd¦† ›GŠùä«Û¾-Δály*`è%ˆWO®ö Üzsû‘òÙZÃT‘÷=ùzÑæÝ¡<ƒe•‰^h®˜¢¤¶½+GÕ’v!m–réÉŸßö׬ ¤ ´gϵ¶!Oü$Ùr9d탃zŸ9¢±TYh üÃpHÖàã̱0‘rZ ‡ð DÔÉ7nS®—Ð:*„IM[öõ¢™A©¥¦íSõ5=—Åý.z“i÷C²Ë ÃÞ1{—ŠNã_¼¸¨.$$Œ™Ø~Ÿ#þ!AŒÝ13÷âò4&#oƒŠÀ i­rÅ’6L”j¸-ho¨j$ æ°\ˆI-Y¸¯™Ú’‡´«í6 GªcÉÊ8¬_ýË ÌœÒ7‰¼ÑÎì)üÓ˜êÛþ# ò‰÷8èÆÂtƒpTpòl;ªÓo9ªC.ø!Ì;‘»íÛœ’ö—!úrü¡Ë"{fCÜܧU½EÃjÈÖ H lÊ—½›O({  ¼‘é„/ª£(Ðå‡3¯A‚âí$¶}|P ûd6©5¼áŒ© ‡Êª>i#ë:Ÿ´Ño9CÍÑš Hˆû6)z0áBÓžÓètïI €F*Ýú =ÀÂ(‘1¬Ñ5&«*[ÒßùÜ-ñïFæAg· GY代4ÉË-0'Ɖ$RŽ ë DüWøhÕ÷»Ãð AvÕû¥Ò¸ Në%3SãxRgü­æ¹»ß=ŸXg¼†\ãi!Ý臱a.qé V3?`BQv“Õtvý¸ÁWžÎ)+«éq˜¯ÇšömBRÞ&–Áü«kóûEJ’ÿÆûîZQe(wwÉlwþnIíØwžã3'ó Æ˜‘F@B¸…hŽ¥9Dãn‰¤À¬Z¿IàØ#œàt+ëgai)‚öµ1 …4¤Mm}—çÃÛ¸ž”m;/ž-ciü=U·Ñ^Q;à:m\Í N¬Þæ·Š{ÿŽsl 3jV.ðrAÕ.\Ç ôÜÌÐþ¯üæt#sØdçjÝ¥‡Ã,³>*áÆ™¡é{o AŠ(>ŽA¨K£ìþÐãw ÀL»£e” `Jø^V]ª±HÊùœsà ¶{r ÓnÚpSÀž7Ý]áUã™ Ò¿vÔÓ‚D=áj­Øß êa´Ã¨7Nˆ·½t c‰Úþ—'Ãvñ"LÒ?؜¥Š8 ›I±4ÏÒ-NÏVÂÀ¢UçÆkò4Þ¹1ž i|¸ë T8»ëò~»}Æû-Ñ^]¨¤ O¿¦Èó&ÇŒNá¦O8*ÝãªW§uj »àXA£¡sfšLlFe>h3¡óÀ™í±Yåü*väÆ#Noà³1?g1ý„°/«å§û>¤‡µ?©ÆÕ’ ïûúS|¿±µI§CÏOú„ÉQicBfùëØW3½«1¹‘Š™@ž0öÓrV±ÚPCµýå¾TĆ£`ñ‚½®¤¸ñQ¬Uð¦?.ç·¾¹+®l­´Y¬DS"ÕŸ eC+Ž¥µÚíüÀ7%zc°ê>üî‚l2l/À.–°j;¢íƒ"p;Š×ÌX‚6„œéésþt¸À&­Å=øÖ·\ î"-`‹[l/7 ¦ˆØ\üõxk]ÙŸ•©A}’.wÉ›ß|UÚ ƒeš¡ã¥—r:) 7ø]¬õ}YV¯”¥$^š‡¨fp™/ ÑÄPÐÅÂ…J.à,}æs¼få¨d /è…CЦÉÇD­$W\‚Ë(G’,JšÚZ¼¶_1_gÌíd ±Ã®>+íŠîÁSSŸ1zÒ‘"YP…ÅÙQMä#z& ¬™ûx€k‰3&PËz±˜báXëeºUH±_pçXxÝþSá@ªåh«3ÉV4fM}jŸ/;Ûðƒmú5Lz}}QªMB. a9ñ`ã/Ó¨p«±óH°:ëûÂ¥£gžÙx ‘‡Æ{žâQ²µål8%`Kr¥H‡ÀÂ?”Ï€†Y…-"Mø%ªÏBœ®Æ]m¥=È`öÏÊbƒŠE3܆=”ÀȆAcyYÏÀ‘câ0dîñÙpsÞU„4Yä©A„““Mî¹À%ÖޱÖÂÔ,1¡¿ÑŠ¹Ï„áôšqªºåW ç7SŒÏ`ƒGe½D¬¼6¬ðJ ß”¡HHÞ‘ðaÚMˆZ$|tevY¦V$Íg“£g¼~=ê)R»Sgà1_”›à€Ø8D– $¹u%#ç Oyõ§ß”ôJ8ê"I c•(ÊïžRÂS+¡Šâ'³ÐU¬Ò ¥ Y Å7ó0zðÓ¼Sö±[FzÍ Å"Ë|³ Ï]{™ÃÎí(tôŽ)3.( $rrE‰×чÎh4X jºÏË­[À"à}ìžÅ;6d~È…<÷ý#ó Ø•l¼ÅóD5é+St C,ï””’R•Y© 3=¥J·tñ`|0¿¥£Oé¼LsB“WücKª‡¿ütÍ;–9Õ¨ï‡~6È‹¥1½‰¸^L\-˜n]$Ù oÊé BĦ}žwNù(í±Ÿ}D¦íeô)‹9Ãu±*„xñ;8lâ»Göëû;òVhl¿ixh…6ÎÏÇ º¼óÚÇæ à4±!Ù?9³!9~‚“‡&3ú-æ}´Žr¡hãß(ö'_â·OÔS ÑRNÜ´;(|æV<Õq7¼D}ä•bºyi(D¢ tøÍiëÈðkw˜¬Ó 5ÉOÀ’oG°š”æ …ß`À¡ð+$]XS'埴0ÿSjª]:_ß`/TËñvÑ*ÚNêýûÝ6LÖÌo¿¥ÅFeF­ãï|I‚¦ÍK²ô² ÷,VS=åƒ/ t>K$ÿ>Lg²ÜOOá<´‡ %Ökúv_*Ò®à-n„nüUÊT¿þ‹°Ù=Z‰•¡áH¼yHyñ`ÿoÀF™Ñ䋦˜âCÿ®á¬à`ㇼ܆*+7:-‘éÀËræ!׊_]Jþ‰RrJ¦›T¾I«©!å7:¦^¤d0ûˆåQý¥?I2ÅÔIÉx.Ø£*Ë>P Ññq²3Éd}%fÒ<Éøü‡F§Òo6Mˆ§ß a>|^ocõ¹]¼. –OŸ3&rwÅÏ\Øš²†yMýëÈÙ¾þ3ïÖUøÔà÷+üíïØRrû‡^F"Êñ6ò2ŒÄ¯n1ÑŒÿúrœ^‚YþŸ_Ž,öЭ·í8WB ÂxàsA¦Ï—@:ñÒyÓn_Ý´:<¬ôãѾÛíYO’èËRœ‘®Ê›¨@æÈ–KÅP\œðm]͇v™»wÛW·ûQT Ñ»÷·{ºísv°S¢)‡/Çͪ"³*\ã(jË?’½óè»Æ.ƒý{|¢Ó\?¹ÓÁHhΉ̴*L1éz,–¨¤¥Ò­çBry‘]h˜>7âÀcqƒ–þue<5NÈèK±˨¡ÍÚKpÖg´‡çÂsüœ7&@7 :[ø“‘e“VÅèˆÿ°ë»éÇ^þ(¹yß”?0sêèŒ:‡‡Ói´øeR\hÖeº$)£ÎrÐ>E嫨‹©“þéFÍ›ó¨qŸ Õ-óéyc7ñiœMÌ[­™~ã9¶Záw’&é„§«¿³Êh¤Âéaþ)nBTºfŸê3{0Î3M‹h"ßš›UgIvj‘]¯6]¸ÃV“ìcÓ¥þ¿E7þ'Ö¤ÖyçϘàB³ÞB$;l†Kul Þ,Œ4y“:RŽÛ×£'ÃÓŠ!z%Äâðn»m÷/#Ã8/ü…·Æ—Æ¿¬Ö6FÈW?Þ^÷¿ó¤¦ð]ã5uäDn ª+Caæ¸o/̦ˆE®ÀWXCõÙŠcBh¸²Q6W5µ§r²¤~$?l|kÆêñmü”FXÅç)¾Ëi³šCp-­…njm˜0j\v솟C—…ˆUyÐæw^¬ ð•kPh!!â¬?d÷[¿ô—c›E±òVàXPË?–Øìú8M©Ù[b£Á#ôŸ硭!ö†¥ýx7&âÇߟFûÇ/÷ñ~Œ½çñ~àšgðþìòøÅ¼^1Q㤼ê²Î¢r¡_þrñÿËü¿ãendstream endobj 458 0 obj << /Filter /FlateDecode /Length 194 >> stream xœ]=ƒ0 …÷œ"7Z~”…. ­ª¶Žƒ24D†Þ¾Žž¥Ïy–ý’uý¥÷n‘Ù=NðÄEZçMÄyZ# pt^'i,;q…·"ë®:¼>%Ðn|ÓoÌUQp«Ø†`28 µQ´y®Zk•@oþžêm`°»³>+VžS%Å"„„F± aCƆÍM27¥b– +Å"¬xõ±$]‘òçKXcD¿ph•²8¿ SHS’$¾*ÝcÉendstream endobj 459 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 919 >> stream xœ…’mL[eÇŸÛ—k‡Œ·+£uS¯/‹¢3Y ~ApM€R*˨5@;J ”òV*°v}¡ÐSÊh¹ª0P!ËJ€”,Ó+$º˜m˜‘¹}˜FšÌctYL̹x5z‘51ñÃs>œóÎùýÏóPD!#E¨ÔÕÚÛ;Ê,í­OT7µµ:z-»•Ç„ƒ”pH&< ‡ÀÎg;åJH—Cºbíkvfcs&6d9EÕ·¹Jí®®ÖkûLQÑ‘‚)>Ç6¹Ø ÙòÆf›ÝÙmke;Ìly¡®­²;¥d+›oï`›,ÖÆ¶“¬ý$[g9Îô/ÖêYmmµ¡FÿDá’ý+I¡»{z›ÛÚ ©#ò2)#:REY¥î§‚Ôo²bÙ·¸œñ;rÀ*N'ï$)èõ ù8GÌ¥PØõÚþ νd[ó]ô¦|—Ý·¦aЪRèãÛ£3é‡n‚=.‘Rôzg! cpvjb<19Y±_€`&lÞ˜º¥’P‡µ$°Ž:ÑÏ£Þ™ƒùHûù>ùÆŒ\î’ÒH{ ^C¯µ4&ˆ_‹Ì½‹I5î§c¼RÜO3Ï&Q/iEúp0ТfÎ}D›Ä%—H>í»šO`ý:wE%{2"m¥O­â"o¼”ÃX…Í1^~˜Hi® DÉœ+}>ã–Dì7kl¢Á]jªªM%D&ßW1ªñG%³öO‘Y<5ðø–ýÐ,°q]¦=Z¥äkCz‚u!s¼o ³å‚÷åŽÍ Ái„`(àö8m%ÐöOÊŠ¾{ۚǬï`⣉‘Ó¾¡`Êÿj² ÎÃÊ|ôB|ûØâó ªápQÈv‰ù_cà!ØDÅX|w›¹WðÂ7»ö~BHò˜sø¶äRyŒF²sPÉ|,j}þ¿èŸúuS*øŒ˜‘˜å%é6&øo[Ϲ‹4Ý;yÌ—;7÷š\ÄÄÔ­SÛ¢4e`0·ÔoGlÒïx©É\­ ÑoÜU2wÄ’¿t\ÜÚÁD0{äÏ+h™Eù×ü&h^‡¹á¡#¯ˆKêò= Ìú2Ãj&Ñ4ÏÅi> ¹÷Á4E=}ßrd<<6ŽN„§¿HO'ä®ØÃ‰endstream endobj 460 0 obj << /Filter /FlateDecode /Length 6081 >> stream xœÍ\Ý7r ô”à‡yKoài7¿I~È]lÀœ9DJ€–VZµ<£ÕÍŒ¾ü×§ªHö°ØœÙÕ®zÐì ›MëãW¿ªî¿­†^¬ü—þ¾}0¬®üí oWé¿çÛÕŸ?øúgíá›> A¬¿|/+/Vθ>(³z¼}Ðé‹Ç¯a¬“l, 0 †?¾|ð¤ÛN×kéûAØÐ]oök¥d‚î^^ ý`”ü°Kß{×=‚kÞÑo&hï»Ý üMÃßÝ#œËÁ\Zu—k¸«•Jv/`t€Ë¥ëàÿýøß;X§e­•é½µqqãfs}Ó…0ˆî¬Lj¸Ë »§ÝÐýµ—!Àìkü#¨ÁøîyùÇaº~sˆ÷ýþñƒŸD9›Õîså+Œêƒñ+'e?Øpršöóç ½ªœïI÷ôâ+Ø©°m×ÑáЮM·e=¼*'¡4 öã×$2X²·|øx8þÀ¾SüQN´y‘–áD÷þ˜nÜM×ïê;iR§òë]Z²Þúy9Au×/ÓgãªAWÕ5û|†å`«~Ö‚øC¼ÊJkAËž—SØ ÷×mC δÀÜC ´Ó½ ¾Ö‚þb­…“—ÝS)0‹O^w_‘%­UPtùZÀÿ:Èh; ñN[5‹†þøÒ¢DãÂÊ ¾7’$cïc ÔÒ¹bº'L-¹¦0ÓßMÏЊú AÛ˜áì“·¹îÙï/І` |ünÜdß68í™n±l6Ì€Øoµµ(¥È¨_’—4ƶt“#˜þ %ˆ-qnPùÚ$-LUî ¼sò¶,HÐ4a¡ÀƒP¨¯g稄×ùú·¥r>'­À³ü2^1£ì³ç×+h+ÉóK©zå ¸~ßëÁˆ8§õ7\,ºïÁ6Áî_]ï¦Ã«-Šì¼qŠSV cœÂï}èþðf:¼È:Ü%­FCxàßí^ìñJí¬þ¸4Ç—†Þ)ai®×z°yi"/tèQÜ¢Sg¢á'8Ä.αKˆnzs•Vêu9ÆüW–.yqx÷¶å€!>>|ðø_žtÞæ%n„_¾Vƒ ¡n €EÖÙàØvwÅôüÍ© `ç$Ô‚ÐõæúêSº)ˆˆÙ3‘˼bÙM•WªXð3î¬À`@6„|=ܯÕ^e';½ÞÀg‹b—]Æh bµÕEÉš*¤½=Ù_oð #uwÉ3ÇûhYœfã–¯9z)P`¼ÊVâmqì»ëgUÐ?õå Ë?5bö(šnŒŸÐ“½=â½qw˜.Çb¥ÆnÆ]š\*5¢Dè>ˆF_¦Q Ûñã´%E÷`æåFóÂ@ÿ7Ó/ÊrÏ<ÕŠšPeÖ°†KühÀxêã>LÛt´ey Ï͆)ýÛ´:t!ÛÒì6Sº(¦,4Û@a…s.Ú©5RÊ“‚n šJŸÎf¯ñ!úôÆñ~ÃàºýÈ–åà`cU -4€käWó¡Ãbò±/¼|ÀËõñ†Éöð'ÈgìËFfˆó6:ïá@OÞã)óØ•LûåZpü ͈–&dÓ²ðÁ0¤[SXX° (8„jºNfh怑>†ÖQDÉÜp Á(˜ëz›[þ{vISé7. ƒÅÓLû×ÒA¾;k<™tÓÄ#¡¸¼lé,ÇS&¿86tÙF'ä ÀfY¸ãªÀ—¸›~-ÿÌÊk„®I$†>ƒ7¤ˆ0 Ìñˆ _¥!°ÆÒ#ÍØ—©ÒU –ºHa釰ľq{§Ý8]§¹–Žù{£¸Ÿ¤ÉœF×rü²gI¶ìp/³0ª‹>®çsf¦91×=6ˆ›ô@÷«Ñ•z~œèi ¨<Øï#wâ*8·ÁÄÒ¢‹2ݹžÌïçTåÛx¡¢’“FNÇ‘ÌÒ;- èb„ µiË“„ݸe&}ØáÖiN€ãeN}òæ;4ާ׋ñ9Þl³t%ã~qB4Jw×y±êĬö¿†—„ Ë[䃾,]-âM à—1b/:<î}œöúµ€ŠFmÇM›kžË^¦K W ŠÑ„‡4Ú¿n¯kS£Û4@f ·*H”á/n‹D7Ô ÷eÁòk+ÈtR×Òz*¥JZþn?‹oH”¢ãr¸¾Úåįø†â¹¹®fN1-SAöµ/áob& òõ"ý'Åýoš\àÈEôUÌ º¸¸¢¿ê‘C$ï¯Þ_ä™@¦«ŠWÂß(Ñì¾/ÎèQÞÆœ}Wè; Ù·:ŒãðgY™>]ÜŸxR€Œ×+Èì{9QEÿÆ|L2×ì·‰+}8N»øe!ò¬õ‡¤jøs´`ÀÍ¥ò?£³ÀºNhïJ‚ìlðå6{ Û])Í€‘M+‚s÷ îŒp½3¯ô'\keé§uÊZˆêSÀËDch’ºøC!çEÆ™ÌFQmG©ˆüœ7Cž¸MÙ ×æ4·¸I“B<‚ƒ"w¼þ%õ¹P—/¡ØTP ÏAõAFÅ~ÄüáÃĹI0¶Ò47„iHjéúˆYpÝ_hµêH’¶xÍ‹{¨¬‚ èàÊ |•UÖôN6¯†á:« 7ÆsYSR‚ ¾!Dn;¾5´hÇ Çy,¥µ.RM’|OƒàÍì» séõ,·öŸYc0¯1¤Kû^Ï%šdiV׳ƒûÙs×]M a¦˜ŒŒ6@¯1³åš¯ÝÄBÔËDcƒo¼5£_˜„äñFhŠœ _Ï`tšÙ‡‚7?O Ð<š˜Ž¸SDâ™°WƒMŠáÈR!•jxñÖ ·•èC mÑè7dù²·RúŒ·šë ‘¤¡›ƒ”®NêWÓq©zl×0“Îk_¬¦S`Í9Y9('£Ž w­êñ 21œLÔT~o‰lbªÀsÞézJ@Y ýúgÇm]‡^™_UÈ+w0ôRê¹:2õSYÙäßh“w$)ÃïtyWï{¸Îå»~¬Rˆ¯öŒ½óBš<ü;ŒEQ»Á¹¶æ¦÷RžÞÙœ“h°í­×ÎGè­‚ ‘°Dj'àL:8a9¨U1ðI÷íÅZP†é»o𣡤â›êÛøñÛæj¥îáäi 7-7-›IÊ–ÔZ³ .iQ­r޳M 9QÖQØàIƒä¬âa¦±?]´TÔIX\Ú:$eqºØ®éAâ0¶ëœ ¡ºßµ6 À`øê8ðIí·›Ë¤¸¦FTƒ„o$¥«z°äé“Òݳz ámS›ÐKˆGCïS>†ÅY6]ª«[IÆ1 Ô‚Ÿëôëz»¥P¨±&zsL?żÈÒIòí8³nŒè{÷™ªcl¦ (ðáÊdƒ Is·hNüÉé:[X¡ÙžVEÛKRº…*‚Òª@SE¤k…Š.¯ « ”ÚDpÕÚ©s^ vÇášÑ ›Ë| ‚Wçrxu¼ÿ¥ Ǽ·$+Ì‘§¨9ò5ûÌ:ˆ›ìZ¨» d“+œ¯‚r{ÔYÓn–Q«hbb“ªš¸úÒ¨îÃ.BüÓ*UU•¶ÚÌùì¹PVÇÛAÍZöûeª!‰4ç|"*¢ðî–²ÃÈɃzˆéG4v3P}aR(8öí´ß/hjÓ‚/†ØÛ³ˆ³¤šâ„#õR‘Í#mæCÈõÑBeEŠox¹æ2PÓ”Œ“Ÿ[âUô׺cÊRT¯‚©¢Q‰#Y•„CÄÒqzDÆR±ãÕ Çr4îbp0fI?8If1&ZÜ!‹ÖE%?ÉÇ4ÒÃym·¹¾ZçZu*¶èývµjø™@ý´o‚)Eˆ¬4£.% ­q½&ŒE¨É:(k5ðó«r`ÌáI„)C2ý¬‚|2ÛkR½äük6ù»¢®Mm/Rh\´|¼ï_Òœ%þƒÙ°«µ¸‚.v ®‡ÜVReRÁ®a®ì½Ÿ‘Öw¢µZA=n%{g¤Š€ޝ…a‡9(rð(G²S—fk ‰|ny`–¸;-ñ[!e¥QTSk`l>†˜ãÀ6R®V€½QHZyËKød>ŠPÐÓÕ ì °„Øy­£‚à…0ôÑÃä ‚ªÊ0û/ê}—c«@_¦¬‹Nm# ~>ëܧ©Sa†>+2É¿,øçä&ãW­ OÌhžw>)õÿ´lnÚ?ÀWërìïZ6ŸÓæc³;þïšÙ²ê=¨õãîj;~l¨¾2ÞB_£[ ñÄòá¯ã@L(…ÍŽK&•·ÌЬ6*©¿k™"äÒ "(»ãÍnögåQúÀÙîãѬ‡ÌJølUˆ”qHXªú) ¿eä¡zÜçŸ ¼×ÈDAUp¯… 37H¨h³Ï0!GhÓ»`±¶oK…È$þ~4%ÍÙjC|‘.„:ÎXÛÕ}+E¢~cÅT‘a&„«Lp7ë_XÂF <àüºùbmªs@·OÃ@Ôóý4ïÃþìFv‚úh„#òFž§iϪM ¢Ô\dÓšÏÖ0pøà}rÚÝ{`2”Ÿë ã6º¨Q QŽç-±ÃÒªPPø€¶^ÖŠ&Wò 1Æ ‡Xh*yu%*ÔÙê -Æ, ƒô½ ·¬®Äá T¿¸G­Eztx|7ô8‰Aš&FÈ—º„¾"…Xf$ô¥†puÅ d—rútã9%=š³®zˆRÇ2蛲\Š´½Æ.M’Õ² l~3+¡cĹÎt}eñ¹¼™ïµJ’ã‹?Ö óŽ©Ãa*ñA;¦¨ 2üß.¦gRóã :á$'k[=C¢ê¥B¢¦jÍ˲,´KßÖóGÕws=&5ú@ l«Š[ú=Ônl¦ß¨q#9>uCíVÇŽÕ}ºT˜®vùYòV­ŽT]ª«ž°…2Ç=óbÌôGÖþ÷®ÐÀÍ!­`hãQ–§k¶éA08%MEí, çXs2î,rmˆ*—Ø8h±É9WHXS”s§ý8—¦ÚTA¦\Ï·ŒR]ÎÚVµH—UuÙ3C=,ˆ›X¦{ÉŽc›kv¼PÆ…ÖÍúO‚©îå–,ÕçuÉÆ,é-»î¤Þ”ï“ó¾7ø<Éz®ñáéÔ>‰5¢;ö „9© ÙIóD[ùÖa¾Sc{ô˜+5SQ-ðLÁxA»W ³´°ºAcÁz˜}çáó~÷½…‰gr«oŽ>9S}sÆK>g•Õ ïÿ“’Û¼íá¦%޳̆7UÇ2öaK'þÍæC»{mm$€LÚä«&—ŠOÉ&—zš£ÉoÁÑ´5Šd[rbY¡š¼˜ð½ó^E^,¤PðS  ?iÔOè5%– ‹‚Œ%Cm>Ç’…œá×ÔI¢ÉL šL$Y´¥+=*Äo/Ý…ârµ½‘ó:¯¶©‰ÍUñ霿R<^tÿ(äžMÕ ñ1RIØBaqLÃ0¯Ó#aÐ?­×ëë’6šççºR–Íôñì:Úµ!ÀU¡¸`ëz‚£zB€©U¼Q @C¸-bÈåÑ#`ÚŠóÎOÕy’ì–‘ßÇÞ¨å˜öhìª.&>Û€ðª+O1¶u¿:•œáÈÈ#ÿXÙ¥‚`¢êæ«eá!Pkü xEX¾`Z‡7i°PK¨îNà¬SQY¡²¾:œ§|ò °@ÁM³úŸ•‰ž]9G}÷sK“9“ÔmÒ1óeìÞ l¤`óöÞ­ø<‚Ó²œ/¥ÞôHÐPåü‰SÐ*²A(P·ÝÉ÷/u”žQ¯h–nà¨ÛUYXšÎÖü熛­±CtÎ7¤ßÓ@BAÊȳ=H¶7Ç‚Ë_›KÐkZKà}uFAyà·íðàµ2œû¯ÆM]o­mßsbéø³j"çJó|gzÌ«4Ç–4!€¡â¦ ò;óØç1˜ÅjjmrÅrõw½êì ´¶¾–íëÖ‚NY#_Bk_·«$ˆ†Á¥X²h¯È4ÿؼm.@"©’óá[Sù&> uÊà[+WØ–(ï,ìªçBöŠ [&ákÖvyÜCëM¯ [¥=òI¸=ŠÖêø,W'š4…:öh"á'C|H?zŠë⌥‡ŒØLx=-wƒŽS‡ù-8cÍÛhâ¹+vã²@óÖc JÒ£úè«Y!eÑ·£Õ@ ˆÕˆDÏQνÏï§ø½ÑÚ;F[¦ÒÍÂ1 J,;ŒšJÔFÏ,P…*êâ ж$D±àBh4ŠÄ‡‡¬á„K×!·~h[:RCÖÖ×íV !Ü‘œ˜æ”¥¬«|³Ðé––éœ>Þi“ʶ4"Ýàý´l6‹Ÿo¼…µXÉ|²]vªf!³%~y>j [ò>BõµÐÇTIãćg4ç+By>¼¯Ž½õË[©_ÌóççdÙ\ûf† ¾ ü[‘ ߨ9’sâm¿^æÄê¶9qjÉ9ñ)·ídÕ½<»mYy=¬àÔOÁ>å˜WùJ´f_Æø ±G(Åò]94¾1e-ÁhA)%ZÕ¶#2ð”} ²áÝË,,ævBI#¹P"BlìL§T±é9—óë±=Ì-«õ4qŒ.€iØ „‚Ýô ·1 êbž{ßgAµ¢j‰^ÏîŒzÓéÌ*{‹Ó1îìé´ºB‰ŽÌÞû÷MûÂ*çÜúÇæ¡™»X†øžRao½hPÀ'€'7ÂÏãkÓH–¿i¿>Qarç“uªt~~ˆè³8€ã_‹¶ÌÙ=ß©{== ´|Ëdìr©âP|8ÊßôÈ {/Fœ n7íuˆ19ôð'Õ›‡¦°| áAôs ö­‰ªs+Z“lëÿšÖ\ Žó Ÿ˜9æsT¹Ì®ç·!s?¯±’Á’.¨©Ý“tA˜Ë ¿~Y6¹)v6¹”½¢`&ak¡$¾Ä¢ 6­ö4÷_“éy¡Z‚…qèÖRôÞq—x3º C•ABêp¡„¡i?â [&º_sKƒYlO°qA…ÎU $ÎуÅWóÉ4A¸³\•ªÜòÀ³Ñ¥š­Nw—³})Õ_<óv#kUW5–°LTÉ{h8%8î5¸~‡\^>­udÛšE²²íj&ÛZ/%JZqK8øp¡,P‘ïã´åoßjöëÔ{‡x5?r|tañpðñŸ(‹ÇÐ!·}+„“žvxsíÿƲø n;êæX•­02!-“ˆì™jÏ oÕMuAå§êqÁÜFû¾ÕUUT¾Bì([Ú¾tFòò1?Þ³–=M Îø¾z|•t+½ž}QLotoOØøèšN>ÛcÜ"§ietËi‚ü¥šQeŸN”¿vß"m%èš‚‰­NnCöó;áÔæ—ÛP¾ýµ+^õþÓƒÿ=¿ endstream endobj 461 0 obj << /Filter /FlateDecode /Length 5923 >> stream xœÍ\ÝGr¿ä)اܾ—ã—Æâ¤¿?|q °sIlwÞ ¤ŽÚ¥$ZärMrµRþúTUwÏtÏô쇹gzÐ’ìéêª_ýªºz~œ±–Ïþ‹ÿ_lÏØìÍÙgœ¾Åÿ.¶³ççgÿøåà›Ö3Ïgç¯ÏÂ#|æøÌjÛz©gçÛ³†‹ùùÐØŠ¢±­w 8¿<{Ñl׎»ùB¸–qã›Ýæ0_H M¼j^ÏYË´´œÁûø½³ÍwðÌÍ|}jë”jösÞ2f™kVØHµ ¾ü.ëõ2ëh…2í¸3®Ñþxþo£-Ò$R·Î˜0ÕÝkèÝÁ¦9¾¥•Þ7ëCüÞ™f¹y³Û¯‹Ÿ·ø+‡ùfy•}ŸRºÒs˜ëò¿÷Y^¶É×Ö¢m!okZ!xwsuýõwaWÊ Û²~SrÁßÐßÚ+çš«ìû‹\ŽÇõî*ÎOúf_ÈøÇ›ì©uù[’lvÞê¶Î@W¦Ø¹åq}E»Sñ¢yžeL"pÍû¹6Ð@à¾ÜLéÀ!¶õÙ……g²´¥¢{‹}DY¾‚tl:oµÐ­Tœ‰Ù‚·Ö¯ƒ<˜/4ª"o^E}ã`#ž²Ÿ²­õ•ø”bFÐSÍ»Ø}a=ºe¸‚™l¹“‚Ú½l¢™SU­PÂÛ8Õ•©‚ZHÍM1Õf]æÎ8´È[¾œ×ôh¡¤i WÙjåE®PAïƒ%{èR¶læ5AK°Ë}œýº6’„a`–¡Å³š`"JZ›üPëD·œwã¼€nhfÞÉ¡©vºS›m€zWÈ·Vྱ»å‘+éa¿×²AÅ—Òêu›XÑ|Ùéâp,Tü:>­j .áëó³ßŸÀ׳ýc^X°;ø ·Õ‚Àž°>öúøîÀ”κ{êÕÎ `˜qۜπ:èÛÑ‚ XØEðlÖÜN®ËÇA¦3­³2íça 2Mkø†¸¥ò‡q¶QìVïæ‚ŒH–Ø>aŒ°°KÙæ'pÛ//æ€Ï^c7¡Gp‚ähSERÖI]Hø0­Ò¹à ¢©»ÒÔÁð\Zû_Öì*ü[lk¢Q×¢óñËã~ýŒ p–'×á%ˆ! ÉÈÖJ(2¾U¢Û›¿ªŽÎ[Í•K£OíüÀM=K¼Ã4·{¤6=Ø3n`åè¿´æ"Ÿe¾TÌqrF‚Õ û¡¶%ð§ð¨¡YË_V7žÄÞ|ZÅ|]ŽøC îU ŽÜQÞ°ó2jÒ˼7Ó«s”N9ºqÊÚÁšk30.t>„ ±¶ùr^é^¨V9PL.`t|{73€u˜XðQ­„½å°IhIÎSËÿ©ˆ &*µ†‡B´\Æ>#Àƒëî[ªÖˆÞl¾äÕíyÓÀù_òaŒ çü !€³ŸJ"P.$’Ë*‰¸kØ/ªkEq<þ F1u7múÊðAXÙr"„õ"›Úƒ•Ú»?/Õ¸1$|x)úD3×HÖ3X9.ÇQs$|#þa.=°}\“²s·eøM»G¿ß/\[ؘ`’Nª;’ ¤pA5Àm|Kjý›qÈiq33àí$zpÀ!yÐoeÞQ"•€D·ß(¾Uüvx—ëøq¹ñäí@ùk^h2„»Ø›…Ù¨<­¹¡´@¢f}Îk#6YXXw% ,&'¶ÀŸà¶™f¡å—•‘ª€GÎYÐó òÁñýˆŸÕ)–ú§êR•ÆñJT É]ë`MyOÕMôÿŘ÷³®/j‡™‹ÐâUhQ' 8U‰Ó`4m±aÞ®¶@²’V–˪ÜKŽ.Âð÷­ã>èï¬âQ0Ì äy Æò/gNôÃØ3üÙöLHߨî›ÍÙ÷“&eë®ë‰˜¶ªu2P…¿­®SRO¢ê œé:fnùØþ©š âî0=ðî¶{’6ŠúN”É(Ó©‰âàƒ™Š 6†NlÈš`B³š£‡³p ,˜E“L,yU›Ì8~q_Tý¢ù5•2àN«qTPDÜ’„RXé~° í‰õ-!­Æ›Öå*(!Ji!Nœµ.Ð+:Ul³˜â°ÉÝs, ŒP<È#šªÜr £·Ü®á}X0êqpllÂy=k•Ô^º‡Ñú¤ù“dþ ÌN½Âu¤µ ˆ”ÉòòÑ>2“Ì)) ø)^ Ðè‡ÍÉÎÛÛ%?ù4²QÊ9y¿lr Vç¡ãË8Û8Û8kø<Ć6©¥éä' c\¯ñ'ì!¬‡·Ð²;{zÑ€ý`’…LáWó…´˜ï”ÍÍÕúýÜp,ÀqÍr¿^†„¦Âü'fĬ¦³ÍeÀ“Bà1Gÿa»]÷ë‹g¡)ãÍÖµh.(«¼s¦¥hÞ®_gŸŽ«Ë8—Æ?¬¶ëëå~:OM\³ G…€½d¿Ü^oVSiïˆûöìü^4Ïwy>ôôÓÎ,î× 4&Áý.?Ó¸¢¬¢r˜ŽÓÕºH ‚AÑEñ«#0-ÒÄtvÖk›Ÿôé¶' öF*Sô+³'dm9"…È—Îq J¥¬\ýŸxÞÍ·öùn_Iƒ‡,ÁãeÔàïvÇr»Ë…#5Åò 3\¬ŒÎþkNRN.±L¿ëK5{—çÿw¡ŠDêæ}µžä¥R ø8ÚS+•b˜ûRC¥2'(•TRÀu&”J5‡ãM_ÇWˆücÜ,ð í½/ên–ûãº8£É{Ú,ƒÕ/UitžÏç/òó³p C‡©RGbñÇŸßU”›{ñ4GÂ&F¦°ÂðSŒ<¦~²þâ™p(ï Åj¡Tµ(¥Éââ…rÍÛáALé%5¿¾’åC½¢ÎÙ¬¢ŽŠpi|Û”øÿ~ŽgdŒ ä1í‘¶wâP%o@Ñ1Ñ\ÇØõMäªÈªx â“‡¿ªgÈyÃÇ”d —…Ä2›(™{Ëfð@MË"¹­Eâ!wúÈ×-/Çšº>ü18 C£äd%®ö”•çV„¾>©2ji Ò eFxr:f_è”~ZiÊP>fW~†#€Ú§‹¹RÇ”Ýü¶Za¡@¸Nv²à,tµƒÀjÈ2FÁyd×·ƒz ‹j0@pÈ{̦¸éPó/j=€í“Ù±B*å’!¨ïÎI®š\ýiR‰‘d”EQVüÓ÷À,ú¡8”CŽje…Âel§ ³]üÛc¥ù • Q§J•u»mîû6w”=lh¾ÝåM_5Q,.ík9@1âú秊1|üCñüdÁì1ÉʯPtîáãv[tb•‚V-À%q^Vоh–QÆC4»›¼Ö 9™æ+0áÃ~‡5ÎÈ#Ái=Ÿ®šYæ=Ra›åeo±JXIÞ¤â 0´Ñ~Ó|µÑM^%T+Ì‘TãXL¾>€„^.‰ÄÈjädQ}»<ÄîrÝÜu¥LŠHYh` Ý*¦ZÒµa±Nˆ2±²K‰]ý¦àÍý©8ÓãæOÔKͺ²åa\J  U˜‹c¶  ×9ô’ ê%C|çA’Ê@…!vGƒÚb5ér»ÊÞPÅS­à)‹É^OU„¥ÛaxAb×ß\ˆ·Ã@ÿºÂ(mî!âtûjØes(~ß®¯³ùLèbÿ9ý ÌUb®‚ÇCèÿ_7QÂ25^%ÇÕKñ8ÞY\Öï­øu˜D ½ËõØœ±¥ò#l­l8^˜ý`R¶¼uC €rÂtL_‡]q=lìúè)°›MNj÷ßb1£) pWÜçIòE_èá'=¼‡pˆ­¬©ùÑä¡Rg.è{ÔŠo 7ö*xdåjtx3uŽT0Ý*°ëÒÕuºܼ‹ÒHŸ=EÌ g/ ½j-ïÊÞÄòìz>N·–õ˜Šù8É% ž0çèÚR6Õ§IÇy¬>*Dpj:Np̤óRª!>ô”ŽË ¿Ë4q‡ÈGQ¤%ÚKy2,Ч[¶M `%OÉê\Å»±xU—c>º*E}úÑ¥ßøu©À¡?‡³7}FnX2KÓ6ü¡Å°qD1"‹€ß< ±,¦.¬ãX|ÚSfÑ1ºbZ@pé¡hè*ìóêA –Àcµà9G7rº ç“Z˜g[Éí0Ìvâ¨8¤8µöÐêº$ÃoçàÏ áѧõC&ÞJåî†kBýþ6&’c]ºÙ-Qwc'nÜ œ†‹|¨­ïˆs¶Cêk‘ú|Àeì <à«Ôâc ·ëž‹ ª”„ƒ0:­2¿/t¸?|¾”¨]R‚t“4Ìr*ïUzŽÑõ€áõG•6o>Bl´Ù]ÔvKÛVØ” hCª’“wrÈ+¤f¢¸;žxø¾ˆ‚R\!C¤°9ìbgÞv»gƒÑO8Bo¨_Ëô'ÆteDJ“°uÜ`M™L? pŽ!üT‰_OÒÄ•ì:Þ‚¿…Wû‡@¦¦éÏRh&ÇIVØ¡E%žF¬ÓZYåF~¯ù4$戼̷jsìo8—ÎèÒÍi¢¯—‘Bk{G*84Á›,]7l fÁÅw”H”>ÿ8µ±`6k¢³Dî‡ÁsŸŠ÷²h°Š¬ñi žd2Sîâ2…®¾Ai)w8›CÁ'1¤^$?:„I¥›à’bûï§ú¿›¡0øOtÖDÚ(?ü^õ¡ÚS”’ô΀¼Ç(Òˆø6—§—@pÇyH³Þ¨0ç>¸'ˆc RDta£„/’›eØrljc+™Ýîò]Ô£ÕÍU±ÛoÑ'Ó/̱"½@>eù(áC⢑t¸@þ¶SÞbXmñh%¸7=ßšuÊ‹T¤Å7—ˆ¼¿1ÙD RŠ‚wº÷¬Ò†ÇíOÉÌ<±ÞÝ*©LzkMzÁ ¢'g‡Žù9F‚q=¸g¿_§C ¤A»ÃÀ¥÷æv€Ì+þÌþlØAdŒga+ž‘üœâù˜†(Êý½l–/ç±&R‹KFBQ{´Ëh’áÕ7” oUj ¦ŠM7xð•~¾³å/ÝŽ;åÐÔ=«…Ÿc6ô“ôð¬Mû³srOøí«ÕñvµºêÇ'ÏsÍ7è0_ßlúáWû›kÔÖÃg™p>ÀbDÿ1›âgß­¯nŽ«ÃgñN>N/“5J9NïŸi™{؈õÕ›gý ·7¬Ÿa&9h¬u6+Ç^ÎëÃö[,²ö›ãÇJ¿å&_­nñáêÎ}óÕ·ßÝõôàòr³z³ºº¬Î–ZO½© jf¬Ø¬&!‡Êƒ ®÷‡÷ hç|î²ÄJ ÔÄ­µ>´˜€žåNœ¿³gªUí%8qáŸ&4Àš¥˜èã¦øT¦®°½&n½Lê&?šzÝxïœô¢'‡€ÎŒßŽºuã3O|Ð4Ð-‡ï”jÇðÄ({p9 }þ1öåîÐÄü 6Ú1Pt9¡”»_Ë[žÞ_r?ùµ]íÏ‹ÑKñ2ÊÇt«!Ÿ³ååz¿éÖ›8ȯÇq¥2 ‡/ÿÌhoŒ BR+Ï5îw©îB©À/`PïÉëüë1¼ÚÏ–AÞ҉Šc)?<ð×ßçùÓÍ{Ë ˜o®ï¿9ÄiöEl¸ =³ôÒQl$‰]SV۔œÛyzƒj®«¿LËqOƒü‹Æ98ÏbôŸç¶hÙ}˜8Xv˜Œi8¬ö”c<ém«½/§AIz a,, …_ÁJB5r×8kƒò¥÷žR#ˆo'‚蘮‹íU5‡„TÜÐ,˰~ÃEòŽÂõ¡'-˜ðÐD%b`w¼ôê¶½Ú_²ê9 ¦éº·ûýäD>ž~›füN]P^­éžWœÕêÇü Ï²Ã‹vNÚ˜ëŽÉ“ø’MåÆE!¸-È6!È ilzÖ=YͺŒ«ž6qP.³œFŸc Hù&FAÓvQþ@o‡þûJA õgkÎ$•IŒÛÞÆåÒù@HáEå~ðŽ*·ê[t8¦@“©êÙQ«tWëî?‘Õþþìÿ­à@endstream endobj 462 0 obj << /Filter /FlateDecode /Length 13700 >> stream xœå}]“d·qåû<í>ï>Tè©z—SºøìõFH–ä ‡Ž¥áØ üÐ䌆mvÏPÓM‘ú÷›'O¨®¡Fó!S²Òteáâââ™çd&²~wØNî°á¿öï—wO¶Ã‹'¿{âTz°¾¼;üü³'?ý´x‘œÚÖÜá³ß>á%îàB;¥ì%•S éðÙݓϟ]ÕpÚ¶˜×7×/¯¶Ó–bõ­¯¯ž†àO­†ãÏŸ_=Å-l©—F/no®?AKéÅ•ã/nžé·¡¸­oìºêj®Ç×lÖš?þýWS«ëo§¿¿òUÆãÂq¹viÓï·…ã/®µ½óéø{¹5oÝñÓ“¾ÿ/M-VŒÍc¨Ç‡ulÚgDOÇ_ð›ìsöEF-3YcYÇóµÝJ&çÿa[MíøjäK4o)iýâêß>ûGy/±Îï%TСɻùìÙ“£ WŸýû“_~öäÿÊk­!Ÿª?$W¶“oïòÆÿ{ýü𯇗?øòK‡|*éüÕ·-Š“%нú›»ç‡/ž?|÷üùËÿÜ>;üêJ¾n%†ãõÍÃW¿ýööðüõ·ß<ܼzyoà\}Ç|Š%ÔÃS×ÒIæOñùñŸo^^É3b-|ûðœ×aO1”ÚNÙ»vÈ×ê ”Ù~yóð‡ñð?ý4ÉÓÝ?ñ§*oõð<Ã?Êÿþ]zù‡'ÎÉÄäpH1¦Sn‡»'¾z‘¸!¹}òë ­v‰«£þ^uÁÔ&7™‘<7’©U«Nln5${+ïs8ù:}H¦Vòµ,›¹ÕL­Îžzž‡½Õ›WÞb8["òÖðE’]Pcã‰Öù&‹±SÿÛóø3Ë.®“¸áïM6[*G·mºôýº-·Ó&S“¶"³}7¹ùt 3ú¸Qô“`iS³;•672ÉÜJÖ<²ŸZuÉÒ*Ɇ«s# –66ΩÑ4ò·šó±!dfNÑëÊ9%Y :é²{0yÙÅSƧÒÉ%|òóWÁ¾òŸâ>Ëû>úÝ>Q¶X\•ኅÈX}C£ˆ¾‰¢U~xÛqö]”Ö 6&ž|ÌÒÅ“Ÿ?yâ|)§˜Î¥NQÖ“5²=6µ¥X³¨9çzÑÕ²ÏeuÞFG}®w YöÊ~·*âRÎy¹]Ãî[u½[Ù‚,¡b¼ó¢«u$ÿ–Sïhìæó6b'ÆÝ|”9sf2Éä8îÖwüYOa;š5Ê5êù°E ˆ‰êw“ Ów)ßÉ“«e©aÁ>•wê½;9¹uX:XÎýQËù­$‚ TñT™±X?¨Dfo¯Š¡£öîQò*SËõäâ[KÚ†7•7K9}H ÷€lât*ä3L±¨YSP"öIö-b~? $mþTdƒhÁ?¿$§‰¤ˆ2o?J õ¡H Ü>²¤–“/"Ib Ú»K`•"$¢žjzkI Ð*ÙË¿ï,(Nô¢@ÌþH&íQÞDA¶úq%%eµ4mžßCR£*óê·Sªo+€ ŠºÄFÔó®3ιV,ø·•ˆ‚†¢ÎBiŠ{ƒ¤5²Yž”[HšK}køœ´[óy í ’ B¼½«Äo[ƒÊIÉËZ T q‚§‚œ‰œ\àTüy%¢Ñ=@’sÀ›U²2YNåG ‘eC„\…Ôÿ(%¥v¼Øþ?Ë‚€?ÿ'ˆ>qFSbú ‘ÌŒ¨þ$Íí 5þ5K‚kjm»»ä/ZËDâÿê%)šùñ VWÆGú¨ŸóFÜ÷f`Ïì?¶ ¹Lt÷'7ÑG”0yãDTíç… T~rŽ]À÷1ÏzqaòÞÁq*¨»äÃvªÿÜâ£b³»sãíÛº_éà ÌÉô^s9ý)ú’>¬`qÉ~ˆÏô}lÝHV`Þ¡Ýþy%ôüPR”’É3¯ïcJèSRIŽï.1/“JÌ¡ò6º•øSz‰zˆbù³|îaaʹ}\Iw(%¿a½»Ä\LIÌFz;A÷&%™pÞCÒDÂJ}k‰yœR §ÔÞ é>¨`±ÁîƒÊÖ«®Ìîr*9ÙZ½ 1wRMõ}$ÃyÔd½Ä+¡*;Ñg•/z†²Ò6üÙ%ôåˆ@tú¸óå”#c;ÿÑz}D)¤Õ/õ㑨W'×XO[ý ˜&7D=üz Ý?efÿq è*›po_ºod€í´¥¿f‰ùv2¢ì[ü+’Ћ“knÝ÷ŸGB¿P.q#vþ ˜—)§&,~d‰:œ„Ä~ó" ×*«ûãMúœ²óõÝÇ•tgU@\Ë[KÌùTeÌ)~d‰ùµJí«¢;¶ûEù±²\LørAb®­¼mL7Ú}[1“6ÿúÉç—5KæéuÿvØÏ.¦eð¹â:£»{RÊGá[*аoµºi0Tî®QåÖ¹xJ”ò©Z•¯Ø&“¤6ÝϼBMžØ„ït6" ·ÉÄ©¿$ˆ…×D@ޤyJ‚C~™Hª±À-ê;’åâ1ý Š|Í@Iɼ4¥—ÈéL¤`YT[‘IP‰íA·É®T“v]„F¬$ËjÄä5u—C(Y{…ƒ ±×š¥WÑ^›%Øy©ÒkÞd )ÏqqC¢aÞäþšUí¢ÓùÈ›¼cf?Eæ¤ä­D[|0M ’æìmÇHÓè¸ò"V.>ÊaÎX”‡G·òö®£LsÓTÇj/ Êt [';ÂÚÈÎÔneMó¬:ö,„-0ÇOv¦ü•]MöØPÀÃywI%=•'ÉÎt*)¶ð±ÿŠJªårÂo¬eÐѤýÐ(kÃzv¶ö°•´g™|.µÔˆ«v1óØà ulvU†*„D,;Q™Iÿ2?Íž+ËÖô„bk ‹©È:W•è°—´gx)ÙF¶&zÞ åèíƒkY0|}B|µçMôK±”·€e•¡Á¨*`9#V“¼ÓF¡ìÍM×—·ù)²ZsÄìZ©ÈÞôXÙòþ¹ÔKÔ› Ï¹ZJbˆ»ÉB£ë®È¢Þt?ô=^0S[&š€mGÏUžI]ئµbëeXHHZ>’Ýi8ÉUÙž04ø—ùdN•F‚å¥b¯²;áÄ,b:˜ºXeÂÑ1NW©½]¦&ÀNóâ;HDpRkÎì¶œ’B÷¨0k{ˆ*‹¶©zó¶X*––ªÀf‹·mÌ½ÈØ‘ô6е-ªJÓÉÜï_”mì n8Á¤ 9Ò|в ì¦Z IíXn@ÇfË^;ÆŠå 6Ù¥è9UóÎB»(’3pÐdæR¦™)æHÔ,D5Eºxü°¢’h¨ iÒ¯òæ„N‘oÂozª¦Qó„¶ØØqd¯X®™æ•]Èþ P󔨑”ãxW,©ÑŒ8oxTœñ=‡#1ĺ`½ÃY’F¼@g‘ÏÄMG•¦}öM葽í Kè?år2·8GŽÜÒˆn<ï"›rS‰åûɪc¼šYSM]ÛR–7¥DÁ!« Î:î~Cùu ɵžCOž‘=Éž‡ÇGpJ5‰jg“±CH^%{²ƒJ>– —Mâx•¬›V9fѯÕ$Šw|@Û ze€•=oÍ&9ÈÎ&á" ¡Gƒuð× Ô Ž9È–I&á=³QîÙx/,[“Tö,›2˜„~ç X£™DrÁdæ(Þ;Ö-($ŒŽ½1»0:f/²p…«6_Q€J2 ý*Qö¤¢Ê¿òQ€J±Ø·N”M¬ ÙVl{|Ë8 H&Q‹ç%ÆìÚèYí’GT¦÷ÌhÐm³Ø¦¾š+Q¥©žìK×%¼¹€•²JJ!\…)ÔùM>:6‰À•Þ3³Îò–GÏ$£ï•U"8úE";t0#û‹St˜hU“Õ%úèçV NØ®1³y‘Ù¤~•8wÖsñnML)ÐG‹€†xÈõ« )Zݹu*ÛsíÜ~Èæ\:Ð]:­àóg¯êi*™>ƒ*ÏŸ¡Ôå1àK²!×Åæ/=Ênœ{l‚LÚ"Å–hÉ"XRAT=7 ”¬fwÖiqg "Y;•M¸vŠ8ëô(!·´@wØ¡²‚"ßI Xdí4•³Ne÷­ Y;­ù¬S0…)+&¸³4™àôlâ,‹XAPÂ0 ù µÓ–N/çMŽË´ºó²ÁªGÆàÇC2øñÈy—t‚¼K:AîêeäIbyÏxèy’Aên0äIb y¨ÍÁ‡² ¹ëãA÷4‰N‡Zy¨þÁUBök y˜ÁÕð&‚<,Ñ Èj¿H\!«¤&ŠÜÍà`ÈÃR†<¬igÈÝÞ‚>{§ÆÕu/EçÆµ“ÀÁQJ@×W§ÆU¦ˆN›Ëý”™Qã&ËŠ®³NÜ«ãT™žæÛr§áäÆê_#î5n,kœ7ïÔ8ÃÀ­%5Î8øÝÉ2 ªÍ &5ÎÞ™o¯sc!üÙ˜Ñã,¬jòã …KδéÙdÎèÎs@xwâÇ9ò«ô8Çì ’=–%‘Nv|Kî©ûY!¤ÇúÂ2k”g¸HÒI3¶9á°Ñã¬9w$̤ÇY=Ôçܶ~nŒü8K˜ëô8Ÿ©:=ÎØjFYIsI¡‡ìIsÉÞø¼Ñc‘ôWF3ˆÑlÒc•,ô8†;“(=I -éô8à ½Ùy¥Ç2Â~ôÎ豣ǩÑ|,ãÇ9øîZ2~œ1q=ªüXÔV°õeüXöF±‰7~œn‡g@7uuzœ¬%Ù'鱞Íåƒ=ÎÌ9Ûg„‡,Ìiôd€[¬óãÂFšmü¸ÙG#ǵyÛËCO²‰qcä+rÛun\¡¡È<ts˜¨q) /q4®j¼¸„®D:/ÆÊ*n鯠óâ\̰^ sÊ ï¼8'‹E ^œCeH`ðâìÍÙ8x1j¥…ãÙèĸuÅ`ÆX+5®}! nŒÃð¼{'ÇÙjêìì8ûÞ¦Óãd bçDzØè”9Ä 9F›žA‘c_Z#Ë\(Ô$y,,Yö L§Éa30x2ÏlbDYÔŽ¶e±€ÌçLY6<—ë Ê¾ç|®,Vˆƒd™k~PegAº+»l.ªA–{ÌwgËÎâm;]vÑôÚàËÃU9³H”ZíŒÙY9‚2;zwÊ̘íÌ™¤ëa&Í"ñ‡™4—ÃÌšÝFªµÓf‘¬´ÙmÜ„on\2qnô²O̹qÀ;snÔu¶`îÄ+g}"Ï•{ubÏÆ‰~­Çäñƒj†w+9–•C’ì?¼Œ{ëõ¤Fu°Z/”ç-öƒåÁ.Ö' ,õ6•ÃJ›¬^¼»©,ØãV»d/šÅâJsɯ]2µBC˜K~í’½Ut,Ù°·Ú%S«ˆXfœ[ ÉÔ pd.W6{›ó§žçáË‚sæß£,Xžê‚íeÁ²_Ë‚ÝðÎÜ AAd:q¡^hêâÓ™ÚT²Ÿ©Qí|ho¥ˆ ¶©U—,­ÔüÌ(˜Ûôqîæ‘ÿieÁ‚×JƒË‚5 \ôº`ø${Éê‚íŸÂòi) ö»}ŠÞ¹ ØØ8œ÷½ X›Šf…FzÞ&#¹*õ ]coM²³U±ÖÈ÷¬ú ‚)uñ½Qßëí˜ùRÄa…Çå·<²Z¯š5öèz;l77êEàëú¨’™º_üè©ïã³FêêåÎ"2Ç⣹þ%@·OAßìgó ü> °ÅÊñÙÝÖŽÍ¿EI0Ù£‘Ï$ЃKYìí/–´šI<·£â€·Úñè ®uuh€1Z‰'‘4Zm1© 혆†“Š’ yÛ´¥!o Kf‹ŽpEpÊð^%pÌe#¡c†’û«?• *¼ª™û ®H½*nŽcnÝ(ÇM“Ni:¢‘¯Æ ”Lˆ=}k ¡ŠõD¢~CÁ¹±KüXÆsÊ‚1ãX„g?<¾’ A’Xr~l•dÂ0àKÅæ²Á6sõ®_RÈ*%U&ÀbVA#Èo`/ÒF\K$ç i£¯²Ëi Ð…¤w ê®SI±w?F\›å;Ó¤’þ¶tLjÛÖ”fIªÄ_p3F,̇® ï’`É›tcn©c¸¿0æV-Õ#Àýþ½âJÔq$ܬvIÓ2vyãd!T³‹œåæ‹Dé|Ö“,Úm¶ä'ÑšœP0c0ø ¬YNkR™»2À=‚Ð ›¿™Ú„$y4npFü’90\l'Þ)Ó¿vf“¢Îb¥Ã‘‚¢ã ¨[É&²‚J2½"'мJÚhl9cëpËxµÅ˜ˆW ¬æLR9b¡Iê+ HlÑgsÂx0uȉéÙu:âD à»ÓcÁ« 1 L^—Í^A}H{J®,¸÷tÀ9Ÿ8óýs™MëµÇæú,µp¸ÅBÿòGäp¥-™CÝè×Ác7“TŽWm„JpXÔî­ƒ©ÞÛ€-e' ¹V /‚gß7Y…Ê€d³I‘4.‰jùT¡&õªŠ¾I¤­ ‚²÷)ÝÆ3VÈI£jÕ\͈³0Mé‹–YgW5ÇU¼Yþ›HÔ±™q¢ŽJ[=§ËÝ ÍÑ¥:ƒDR¹íŠ7U<]¨Š†œ=5lÞ|\"iª)àˆml#‹ &sñ!ô(¤ês†–ÉüÔâ()ÔmµÙ¤¶Â Üxø[U»É¿…=×bÚÍ’fBk´{˜J°¸Y„dT’ í^’£ÄÑîÕ`>À°­cî©-NYŒ¹Ôܯ ´{%U¾ä¸EÚ=xX%‰v¯0ÅX%´{¹˜×Cèí^Nv*5n…v ^‘w/–›./)òî•vo¤sEägÒî¥~÷F»’ª¼zª¶º4ZæèœÅ”Š9øDÒÌV[$0:ŸÌVûÞO°T$­@N ít~b?ÑJÍÊ"¡áƒ÷šï ¨._)ÆÉâUªËEb%1\í>äÛØŽ%÷˜%in u舤Œäkƒ|vJôcÙ˜:2ÍKJ/1c>€èed“1“l¼ªÕ¹uÿEÁèñõ öûa{ ö̾™€Š´&Qý•:t » ͆lNÔpXV ]¢ïà0IÊN()qIYˆ¢¼—Ú%"¨KÚC -«À°­‚ºW‹¼U°¦pDëR!%ŠdiLÛ:Ò˜Ös<iÙÎFZÊÙHk<)R’WA]Gš¶´ŽTÃÈ« ­#…oq)¶Ó¶ Ö—ˆ½½ŒÔÎ5Lm^ål¤°Ð‹ º³‘"v· ôfAÞü:Rà¿e¤€ËHÿÊ*hëHþ–‘‚-,#Íp·¯‚²Žtbiqg#-ål¤HYò²×‘"}õ-#…?®‚¶Žq³e¤ŽÄE·u¤­])¬#à+« œ´Ä³‘"l³ êÙH|œU^¶[m) Þ2ÒJ§ø,hëHô–‘ç-#­i[GŠØ÷2ÒšãÙHá_õl¤ò²×‘6w6Ò¶&‰EÀ»e¤@wi¬uœbók XD˜|iëY!» ¬#°[F \WWA9i‰g#­îl¤µž´¥e¤ ü*X³èÒæò2Òá;Ý‹—Ív¯IwJ×u:°¦þIÛs I+þwCÙÁÿnL;ø§Äè@)ˆ‰w¯–G¾Y®Wÿ´äì‡à_%„ÄÄþidwìŸFEÑýGVôÀþ#j±‡…:±ìØ_ƒ*lc؆…´§cÍ5b›¼x’avÃþzÒÄð?`X c0ìŸÈÇ'쟂SØ_MñoÏŽŠéD¨mÐ?õÒÀúãQa‡þzú.Qb.¯ì8Éú#LNìÖ¡?ŒD ú§b¡«ý‘'娯 ª³Ð?Áœ›Ä\^­Ñ54AÿJ7Ý€þÈ©H&1——/|ôGqe Ò èŸ“7šÑ¡ÆSh?ú«Ëkþšô´@¸¼T;ôG•cîЮʞ ûkÁG ±?V#ç¹cœÏçÛ1쯮 »ŠØŸUùy÷fGØZ']†ý³ë0:öm':öT`¹caßþD€N诹<ñ7¡¿H²½.ƒþêT²nR?|¶q5wèŸýf{©CÿìeŸð•úÏ>0£ƒÿ쑚¤b)_öÚhÞÈŽýåW{é†ý³à2Ÿaÿ úâM¢ 5ÃïJÌN쟑B`ûg ôSÐ,“%ÛôϹ ú”ýsµ ïùËâʶN ùë±pòÏpò1 úg˜ŠÄ‡"ö/HÌȼŠà¿ BÅú/8ãL¢ð_$}Ȇÿµ¢‡úÊ:(Øß¼»1€‚ÙžQ½Wš9@A°š4ÛH€Ž‘d±I€’½c"é{Øh€ô“®hEn+ã2¼mHª Øò`;([OZèT`/eÒ¹€H,)´“}pN©±¹»å3u: OÅul| «¡gÏ$yô¶#Èmlj£Y䬯 r ŽßN r©9XäÒÓ(:-ÈÒH}”dÙ{Ö±ñ‚ íÎy7b Nif9ÆÍ¶¹Qƒjèý¨—¤ÚÈf/q2ŒdŸì7+:=P/ §Çøæú‘ÀAГ©3AÈŽÏ{;‚¦<Ù­H4‰p›9‚¨3&UwŽ §P¹×Œ$è)T:ËŒ%dMQ „4AtéL2Œ’›YBÆZJ3MÈJjèôužÐ …xk# €+Tõ)=Ñ·Ñ©Š"Ðáйò{Ôõ:È~ֆ뿳…²ea§ 8‡©pgðõèU0 ŽÆ¨3yÑüH¾€3—Ä0`ýP3tÆ'!É  ­û®g¨vz' µ¯¤Á’b£ Åõ«:oÈvV`'ÙN…îÌ@]¯Ô!uä0¸”5Ûtò-°³³‡h>ð>;‰¼ó‡Ðq Þ~%dg8ÄÀ«:…À=%Æ!œáØI„wï,ÂYàr§β'aðp"¶?'&aa¥‰JT*«‰KX<僤Ý<þ¥?ÄYRôo÷K>}ˆ_ú›syþ´ƒËeQzˆz$\U{Mε7õðJò<Ùkžø’#Ï%öš'†TMì5O<‚BzvÇ9KfDx5[ѦCql&aJ.ð¨æÜ‹„™Æh.^OBó(îàMÂ\¼”F.›¥øì±‘8C$K]­m;ì>boÑr&®';bçé‰dFëèôŒ¼>Sµ”]TJa!CÄ»J++;«à[ª<ûÙK§ø&êQ“žf.},Nu­û1TàLYxËLé± ÓÑš|—"79#ÙHUo*©T”aS«¹>‚Q˜1°ÏÃPbÝ­MµšÁ’ÂÃ&kVL‚¥ÎéÒœÈÐyµc|D9`bBž76-:뢺‹‘a ~Õ0Ñ2Ò=#V°¢<Ð,>媖eÐ#ŒR#l+•+#ÙªÆS3ae°5µ%÷ œÖ*<ô¡™lœ¬¼$ b¨ÎiØ%2×”z^ULÛµÔÛTzâg?òöNJ›Åâû±…¤Ç4Bš8" “¦f&TF]—€ªašê[w£%ÿ6Kí`ú-N‰p"±7½<׺° %%¤÷$ ’þÜROäpôa–­X.%Î%@÷¿±þš: ²'``t0ĉì 4r €‚×8Ž–ÐíøIå&@†Á–YxŠÈø–™ØD5Äž]á8il‘šì°}í®‚€SBŠkªE C2ÿ?²+èIAuTÄp›½aM ¬šÁW“˜<’Z¨zͽ¢kò=ç¬ph%§Þ&01»Q=A#«o4;¡ôäTcl8[º‚¥“ÅämùPkáoú7äÊŠ*ð–pÓ”Í; Ëöæm$ÇM*e"=OÛ’þ dšW ¶J$ B®Á“ósó“X?ÕŽÞô2©ò8›²%K ø…¦S=#ØÕ|wžüe‹ÎrBj ËØP´Š>·¨Y`Ú°÷O¸žßQeÉ%H¶®«þÚ0&ÞŠÛ¼l¥V{‚ÊiU}]VE]u,±Ò76¢ñØJÓó¢èXM¿ìÈ&‰é;Ío–0Ñ,Ö¨øWâ#MúQAÕÒ `É‚ëU÷QÍÖK^Ò:-ÑNšÅ©> è˜Ð9º‘œ”R_™žõj͘x³AK/u²¢¹ ;´s“ ^3HDán•È;ÝCĦúÁ¶¨ú¸” ¸lÎTϺÐÚpôŒ¡°s´zÎ#t­ªé$*°3¨ÓÍYÕxÂ!ÙkŠªÑÞptçnár#$÷›¦¤êOuš¿ˆ•Ó’æ™Û)3úïb]†6q.‚î¢hQÈf•äD1 7«9}ñµtŸSµcŒÈžP«#)§°è-\žœ"™#¨[dÆ}#°è±€:Œí°—u‰øÝ@Å)X®ù8“Õ²Š8d¤¸EçQµPK? Õae¾Í§‚ŒúHCN^ýF`ìÈoÔbŠVF·‹zb,¨é#ü^W‹FOÌĤd±ØicßÌ9k#®ð¦6£²äótôpªÏFK¥Š(=òᲸôñÈŠ,¼e4FLæfuîªùGx|SòÒ?‚œ(O 'e*ƒÁ@ó à‡oí7åè&Óßn˜ô5øLláŠQcØaý˜l“l¶h@–œ1Žf‡;"ìºáábþˆ`ð¨׎;õït§þVãdgþÛàùù[I“øo" î?¢ðƒûwC±sÿî³Ü¹ÿfg¤÷ÕÓ:÷ß.vî¯ÆŽãþà î¯N7úŒüpƒü2qƒü%ƒü³>Èÿ(I7È¿ºØx–ÁÈÿž9ÐÉ?`³;ùÐduª&î¯>561îXĤôNþèéä_ë–´ùWf)¬ú wFÖ:ùß=hüR&ƒüÃ…ìH„%ÿùî†1òdiù×óç<aä?…q8 ÿ¦pðùôåcuòÊÖÉ?‰î cþZ8ÉÍÌ?CËX‚€1ÿV½½…Îü‘D@·CgþЋæA0æ¯Ç‘æ÷ûBüˆ/#¸¢¢|¹ÅþIükÿåƒAüqòŒÊNüqË´0T’6‰1<Œ]eÌÆ0-Ì…Ë6⯑‘ÃÄû‘¿Àø·Ñ~¸'É×õÃ;iž²þûCvÖŸƒ9ƒ:éÏ#¥³~$ËнÛY#\Xîç½vÖß ﬿٠Øö×ÜÛtÚ_7¾Ìö30;í/®ã;íÏ…€a§ýÙÊ`í´ dÚÏ ýÉ4ÙNû àÎú“™“õw˵³þh€tgýÑÊñí¬¿gí¬?XÙŽAûC¦Fßyˆ6_ƒø3É`fþÁ€ÑNýÃF¸sû¥‹ûÃi©“3È߯;ûG¤é0³~6éôßÛQÁÿ{ž^Ýù¿ß¸‡ÀÙ_ìø')é.€^Rp÷8û}‚Ý ÐËbï^—hbv7€ëkrøà<Ì~dÒ±Iw ¯U§xxz¶Àp`F³+ ûw_@OŠÞ½ÔÌî è5±ww€³Ÿž™üØxrXe™É#`Xor X±5æ¦\N:Aý1%›<À”vRÝ!¢¬˜³Œ“_ݼøö E,ÀoíøúùÕSª7åÿæê)fzÛÒñ³¯¦6ÚD6Bvǹ}Æ-uPÕšfªhsäPµão§Kç[ÝÚ•5ŸMâë‡ë{¹ƒÖÕÀ¯u>ÑJ$Òu<þw|Ѳޏ;Â/½Þk‹V/Ç›+Ám[“Æ/÷ë^ØuÒÛ|Û›ÿ¶ÜôõòéåŠ>‰æã]1èt¼¾½wzñêuhvww¯óx¼y¹ ™¯ýüZ‚¢¼MÕ¹»ùþá•\)šÕmþøêö~†]¿¼V,,ÑDvùIÞ˜h’mËÇâ `ïÀæSß«$¹éýý¼ïæ€Å×ÛݽâcWгõ-ìw¼íí‹<êž·¥]4Õë7§œ]ÞýØÏ‚ŒQ h½š£ÛFͦÊa{C‡zF·Ì~nï밿þ3¾Þ´Ujož€Yy\/ÚãáŠËábÀScÐÅ÷Å´ˆl pηùnY6:HØ(»î·ûõÜsuÙ³HaÇo`é¦;FÌÞO?-Ëô›d-þ†-ÖN4¹‰­f“MÖ9dqý>2«6|{®û¯Þ´UÖíð·ò`ÈMiþøéÍ‹¯tÅL-G§{üR´|¥?ÞëòǬˆ>yëåŠæ¸ñ‡X®XU0 Xœ°ð÷_®u8LÚrÕœ‘´š’G[#~1/ÊUÇüÀúÚ§é~Ÿ¦W“f¾´Öœ3ûptoZk¡¹½Ø.*V¥ðƇ¾ôOAd&¥ó›ž?÷Çžd4yÓÈ›ÏmséµayœÀB-«§p¥  ãMþ÷ÕS ìÍùãß^¾~¶ýæøà ›—/dÞØ“ ø©#Ô^v‚ ?û§'ŸýÏŸ»CÀ3õça#tuÉâ£õÏ¿âjüáìáÛˆÁÅÖ•%pœ·ú«›Å?7ÃYTêß‚‘.¬uvi­ÓnRá{Uø_Îê€_Ü]­ Êå<î]7Í0óo^Ø€þ(jƒÃ‰43äûRéV€ÐÒü›!«­78Ãg C Šê8œ.è»>€Á†K¿¥ül2 Õ€ñ½ìµz`¦î°C¾x«¥†'×>…{ÕÅúhåcÁûkû,oà=íKZæõ›_þóýîn_}96Æ'ýÊp¼ûvÛWÿßíriœRo'x¸n¿¹úÄZвþâ»~•›¯r¶å å;éÿñ#Í6Ò³á}sûêá76£Ï"çîíóëgÏnŸ¿xþòÙÅQþêgÿôë_~²?÷—Ï¿?]sßÇeOñ“1ºÿ) •µ.à¢Ûë/ö†óPpÍxj´¼»Æf¹Ø}š~o=òÓÔì'ÿ|ó‡~rq,7·Ïµñ<ŠŸà¥v–bïOkŸš_Ù¡Š}€ãtÅO¦E”.,¡é}ñïÈOïèåóïpõ… |ü†Þâ}³îxîÒa`þUÙy•É}nÀ/¶…¬º]›ˆÎ\MÊõ¾¨zoûÞì¢T½;·ÐÂITÉ1zuêø€-¯__]HúÓ©ŒûK€`Ÿuv³îÒsä«Ï&éX¡^š`Ól°–ì᢬ãöÊ{¿¾·«Ä,ÿn¾ææa ůôöÕ}{ÂÝ_‘á8´qÁWŸ?‚?$+ {žßW¯ï®oñUUÇùÓKd•\~$ëS¨À¿ãLánßÏ¢ögÙòý½ 0˜Bÿ¦Ðk~¾›ûS ŽðÁ·ðé›Ü IXÞÏ9aЉiÖ~>½#`¯iñé,Ó¾pÅ ôÚ^êvîàº_©õ½ÝD”Õ¾k¸g?Æ‚sd6Ï™‰ÿ—™ŠÏ õî›yÁ_ØôĤ÷÷ÿN© ¬cùæûy}ßÌ·¹y8ƒõìP€3´ãè„^~ìbÆ~xe ÇÛó!j;ÙјmÜG^þqø„âü{#AxSns— àÓˆŸ¨åø/ýIã¥Yƒ;8_]X!š÷9 yã²7§/l*-ÞÛWX.ˆG–æOåáºj="u2 «ûR ~U"¦#` ~6ªÑR­ ¿ðžË0\rÝ`ØÈvƒÁ¯ÍˆKÓeåÊ[×U¹¼ZöÌíjƒV7̬‹VdŽ z­îð²ñšk"Œoyž«WWÝý]SàŠçß׆s¦éèÄiò©ôI+a½ÐB¿pboûÓí¦ÑdúVݵƒ}?ÂxÑQYŠÜ¨¦€û¨ƒD/ÆU\“"GÙÆ_Ù•‚jÞÓQm÷53 ?ì~™¼ü›»›[6C0ûÑä¢/AHß-þvúæ’çwg¬ù^æpÞë’7XŽ…jh9–°Îú÷×?`ôÆE·Ãw|Ç<=ïÜÜ]uçþ‚¯z+Yýñ݈î™Ngt¿›èùÕS^›¾Â½Ë4CÇÑ̯.èô›ÇîÇEÿÖ¹u%Ó¹^>¿øÞä¶Ï3°íqÐ{‚ÊlbÄŸÒëG°S+iË„¬šåúþ ‘¦VîQìRÏ!FuZ“ûyoßÌ‘²1øH$“ÈÏ&+´úe u ß œ¬3(Úc]|\"ål SÉ[ŠþR¸_ Öa“Æß)2—Í £_»òüŒ÷úê1_0;órhè‡1—• Qsæ6«jåÝíÍ—ójêQ/1¯^ÏknYŒ×çÛ-hhMÐÒiyù§OL笤ø×­‡pî.>J/íNŒ¿“[àð…ŒÜ_Tc@õ{ò“KálL#*ôúÒ]q,¡mùÑ]Ó1¼ù®ÉM®– ^¡úGBFëÀPH"”îÓù¶Ƿ1íYbJ§RàGï/=ºJ.æ†wi6´psë³ñõ%G2)å5þÑ9ñ©‹#ÂTÿøM¦£»¸8ø&‹uù·—ºDTó<¶ö½„·p¥)8 ªŒÎ3„PÍXææMøåæ÷7oò©À)…„çÍý@fÀÂ*nn=py&ñSb[ß¿½°®.ŽØá¼®>?þ»> stream xœí}K“]GržÃK¬ì…v^Üåi‹}§Þ™#<Ù²B³ ‰i‚œE;êFCÝM‚T„ÿ»óËG:÷€CzǘààÞ¯ëÔ#³*+ó«¬sÿ}çö~çð?ý÷ÅÝ3·{ýìߟyFwúÏ‹»ÝïŸ?ûÍ5²ï®ûÝóoŸÉ#~çcßçâw5×}y÷üîÙWËó«÷Î¥²Ü<nÞ^¹½Ë©…Þ—›«ëþ·¸üþÕÕ5þУËmÙz}{¸ù %©_—?^ò_cõ®/}®ùVÚò ÅzËß¿™JÝ|7}ùþ*4êËæÙMkÏÅå7\Þ‡¼|OMKÅ/_ìµ÷}ùGy4÷ÔÐwO±-OÛ¾q 5-¿”PJ¨Ôk’dKuÛŸÓ¦H8‚{Ë}¹Ÿ;ùÅ{Ž‘J¿¾úóó"½¤6ë%¶°O±“nž¿|¶øzõü/Ïþáù³Ï©`&í>B½É“®ò.×ö9ï|êe_H“¡ì[Û=¼ÚýËîí3QÌ­îÞ“ªÿ‰þûË3·o5Ól‰!Ðÿ§°ûâS]5îcÛå–Ò>ÔÝƵI~wKHKû¡ö€tŒIÉû¡N’ßóCE(ûZ¡¦€ø°I$e04/H)Œ„ˆ¿1Ò½ }ï¸æ²÷R†””» Òåœþƈ4E×(@—þe¿ÜTÝGH~I€"H ¨}¨ð'BÄ„˜‹ ô½ç–ú>H5$¿Rie’_@SÙY’_ó‚p5…ÄÇŠ¡nʘ É“ƒJ´üX1„Ô*éM娪*$?VLNÚãBòㇲŒ»ôX/4~ÑK!é±^È(è3>?Ô¬^ô‹{Ó!5Fªè¥x­˜ÄÇj¡eN”ÒöMV_ES¥`(Œttƒ¦S üX1Õ£ '0!ÑÊü:ÚªE•WI€¬ªO&NuU4Ó¢•!´ÕªH½’üX1=hw*ÉÓ«¢’ü ™î"ô„$ÍtZÈZ†$Ít¯³¢Ò¼ƒbz¨ö Šé±éä‡ Æ34´{$¸Š–Š-³JB‰h©yû•D@mçœêªÒ€©Â₉½6Zƒ‘š€R ɯÐ÷ætnU2!¤˜âiý9VL#ñ‘b M;Ĩ¥àM Äר¥PYŒ4|*1víM °î»’ð—"¶œ]ÉTŸ1C/¥¸lEH|¤—R-uiœäGŠ)Íǽ—ŠI~¤˜¡Gy Ó•šê4Ïɯ—]u´~ƒ"Ô‹Nõ8È8k‚bª£‡“}_T¯$½€†¨›…¥ÕH|¤š—´¥ ÉôB³¹+ÒI~:ƒÕUš Ã+°VU ô’÷“‘ÅDzgöX1¡‘U ³^M$'ÏP¿ š†:µ:‰zñ´¯U «ÅQÇ£TCÒƒZ0l)BrŬéjëz!QcbŸ+²bòUn'áLÇb¶®“ôOb[á´ B+´ÕZzѱ¢×EÖI|¨†f,:œ Ð;-Ÿ,K ­ðã¶¹PK†XƒMV‹Ó] 8¯פ¡€Ñ5tÆ'éL ]Z¡¶£¬±à’‡Vxa²%lî*«àÈÞz´7IJàOÕ›!éA+‚V¤±V™ª(ý#ñ%Ò¿ÇæË@sô –&É×Ì: 0Õ2hšÚžÚ‰$é ö~j&Ö ÝâIv¤“B^4ÌH…N vä(É+%gO‘ðH'…Öû¾rw= ªÉæY|tPJ©ÔvŠ‚d(¥TÚ92÷˜|^+KPªšjÁÉR´“¢«G‘Êk XŸ"éa­`[(ŠðÊ"¤Ëz dSÑ3.ë'‰‚^ v)C2ë…}yŠz¸?’d„ö}´E³„­D iÂz©´ñø$HÃ0+:ޝ$¿Œ‡ñˆçêJ!å‰pBà…OÌV†ÍòAµZ k¦«q¤‡¼j&íå!8,VÃa.!ùA¿Ôí.½¡áB1©ð^ „>A1)²:鬘Ø; C¾(D¤9VL¤‰¯5“ø ˜H«N’ôZЉhÀÐK0ïFX/g EHÀ MxCH€Ð Ùu˜uF:ë…Ü]ò‘½xš'^’¯— þ!(à’.ï˜xÚÑÆVu‰E2ýЋƒïÀãŽ$¾Â 3ËöHk±`ág)Còƒ^ô+@gµ8¯~iˆ$>è…«†ÄcC®C—¶ÉN²kcH$>¶bdªTLâ A¶x1%‰ÄWQO¶¦‰/¢LR„&I37£ BzE[€H‘¡v8Ä"%’^Á ^|8B ôBÖ°¨p‰ 1³]êÁÞÙŪrɯÁÂA¨‚4¨…]$íqa*ªK$½Ìˆú!Õ µãUÔ:&’^iâœéSô7l.­9+Câkìö5öc¨Øû È2êLÂëQäHƒVà;ò#–í”n”(&¨L¢ ìȪ‘ÅÚ«YÜV‘S&ÉÅ(®­È2“äº8¿ì˜PY#ÃA&+Y%0O2rfãÊŽ¶Ì`¬{ŸÅ×ÞPG«úëŠÐh¡¸ôú‰¨©Û/ ŽˆN²:tºïUYN4 E-âÊRh2{BD·´”ö¥ "ã¢õ¸ÍÈ(hÇÚ7xD%Wªî*ì$9ý<¬ßßÞ¿¸BTæz_þmç•ÉX «`°¥ÓÎ>£5*–?¼zûxxúqpÔŸ2;ýÕŽc çdOi·Ûý™ÚxIƒ¢°€v ñW–úW–úW–úW–úW–úW–ú K-ÏÌ,µ rb©e:Î,µ>5Xjõë'–ZmÝ ©•IXIêÁIMSD\%©[ïÆ@+K vDc©[³ðÙXjx;vK½r!ÆR·jÔ²Ô˜*B}M ‹¤ÕM½’ÊR3ùáa–šÉE„¥&$j´ šš ¨æBSbôŽÒÔlˆ%ØRžšõLS³=Ï3MÍ&_BJ¥©yW°SijÞ9dHBSóæ"âTššéÒÔ¼IiSBSó>¦O M͈„×JSó~(á¡ÒÔŒH<«45o«2N¥©I3M͈¨Wija>dXBSË.?ÓÔŒÈäRšZœ¡^…¦‡¢ Òf*DijñJ¤€ÐԌԙ¦fDæ‘ÒÔÂŽE1ɦ„²ÔìGõ™¦_k¢©ÅÂYhê‰-Qšš©WXj$úW–Zèå¤ê%ªÌ•¥B…a©…O ªV¢1¼BR "ô­ÔB§"$õJ°(GÍ€°·BQ ã2SÔãc™é¥¨…n‘f„¢ž¥¨…€ž[(jA†zbd”¢FFÆ(µ Ò_¡¨™çPκ¨N‚N{£¨WÒÆ(jF„™UŠšiás•¢^‰£¨ +éfÌŽQÔ+³cu³³ÂAQ¯\QÔ+×c5S;BZ+G½²?ƒ£ôpÔÓWå¨48j ÊH+GmüР¨` õ ŒE=£ÁQOˆpÔÊ ­õ (GM€ò»ÆQ'o\²‘Ô¢$õ8×0’z”¤Nv&0Hê Q’zEŒ¤N~ÐÖJR¯ˆ‘Ô„(o$õ„”¡”´%©“QÒƒ¤N'$uÒ˜c%©WdÔ+b$µ×y½’Ô$õŠI=ÁR{ãŽM=AS¯ˆÑÔê<¬,õº©æˆ£6`PÔ^ÝJQdPÔ+R‡bY)êiƒUÒzPÔ+Ò‡bÂE=AQ¯HŠáY±RÔ¨C- ‚zm(E€AO0Øi;{YÙé vzEÊP‰"ƒ^‘ºß<´ÒÓþ„žÈ §½Öƒž^‘•žVd¥§ XéiE&zÚ•ŸVdâ§ YùigÔÙàSŒ@TÇ:QkúƱžu¬Ÿ^knLu¬Ç¤Žõ0TæYSó¬×ÍÙ<ëÁÁ¬žuÒXõ¬óðSͳ.n êYW=Ð^kuFö‡3{cÙa¤ŒXúGÖ­ÍÜj„²%ì`y–ü1ΡGòGXýhdÔ¢i#û#fC4ûîLÙ¦Ž¥n§ôênWRÓ?°YÉAÿHÿH–B0Ò?pš½Iÿ€{Îß-ûÃ%‰×ìÄîáí”ýA‹M3D,ûÃ[öÂÈþˆÑò/,û#u«Ù²?òÈ=Ù#gIJ?hzkÂÊÈþ°ôŠ‘ýGÎÈÈþhóvÎþ ¯Ùµi6ŠfxM*Y³?¢åqŒì`I#ûÃéFöG¨–o1²?’eiŒì7òA4ý#˜òFúG´‡FúÈ]F,ýƒšjGéÅžé<Çíœþa‰#ýÃY:ÅÈÿÀ:~äD­g䄦©&kþG²2#ÿÃ|«5ÿÃYê†åÄn #ÿÙÓ+ùvâ¸æäãü‹ý§ü‹(Fþ5$ïHÿ°Cø5ÿ#š?ò?Ìùºa¯é#õd¤˜—´¦˜Ó¾¦¤#ßôHVWZÓ?b·2#ýÃ\ý5ÿâÁ5ÿÃRèÖüd^°å8KZXó?,ø[@Üþ(ÿCYMËÿê›kÝúIú‡¦kú‡eÏÌéî(ý£ªS·æXº&€X\4@œy¦#¤ ÄR@ʱ{]FÅ#Äv—5ÄæðÈqæ¼N9 š2r@”¬Ÿr@ŠU3r@,«e¤€$+2R@,žS@4GeJÑ|ËŽüÈq–ä0e€h>Åp®» gÎÑd‰á\|)Äe€TKŸ˜2@´­á\›,æuÿ§Í$εÊkNIŠŒÖøê]›~W÷:í¼kãÓæcïz$w ïz$w ïZ=Œ9ÿCæßœÿ¡‰SþDZsmú]ë‘Ê1¼ë‘Ê1Üë‘Ê1%€h*Ç”’(†7e)³èqð%ì!„ ¹¼£ 8¤Ñ 'Âc†b‚$HfÅ@Ž"ŠŒÄ'dQ—«¬M‹"Ço„tIى͞‚3À[xÞHðÀMˆ&HfåD_ÄoE<׃$ ÄÊׯÒ¢TÍ·$iÔ%4Í+§Áðñ §‘9I0"D å(c@ ÙP®7/GNÂAnÑìiB8àæäst"–!tÁ*õPÝlì‚DÞ i4Ù& iè!Q…Q§!óf”2$ÁÄaî1±’;5kJY4Ǻ vÄ‘€†Scdàˆkåˆuà ©’sÕ³ÕÓà:à$;žÎä(Þ›X{ÔÌ-u6 騀НÂ9P<ÂI-˜Š†´D½e5ô€×IÙdxQ¹t¸‰‰Ú›ùì‚üÀ®Šh’À7YD¤z`Cˆ¦G¸‹PÅZˆž#¼`O‘k”3aö"|r¨ùGì EgB5 N²´.ç°Ï9Œ@½æ“Â<!¦šÖ™Ð)àG’"ìâò…v×#¢V³§8{gÔrŽ‘;ÐØ6bä¼»nýã|”iÍÈÇC¨²«‘`Õ¸´b¾Tœ%†ÐY3®Vë]æüåâìÈ—Â{'yUcBŠäY ¾(ääƒBLæÑ-üfyªq 1!z€BNé)jîÖáÎ^0ŸÍG8fä‹ì¡&‡T ßYƒºää^!:+aÛBöR²B §IQðµ’1J£Ò8ËÂ5™P˜Õ»u&± ‘þ&ô3¡¡¨çÍ £uh)ªóž #ÖJŸ6¹X+Q/^$h£jF‚“ZHv =™OÐ;k…Œ¹–éI³_ôt4a†±V‚œ-E)AU™ !MÕb¶±ˆß|6 ÏŽ_òtÍ™â§zYŽk×$3(Ǥî­þŽKu4ÕŠ-©VÔ¡$¤«Z‚ÛÃaFÈ™Z )C-Šø lpS6˜9ð›‰7HŠQ$&aƒ'¤ ¼")Å(’ÝPŒ!ûÏH L<ÎHšQ„$hš1¤ Í(‚Û¶H†}Û’á\26Øöý_ygÇ(šõе2]Ù9-´"ëE•â¶ÏhVd*ÕäÆèTj k©ÄGrs¯ ˜Ê é5Î5­ÈTj;œi|?ëŠ HªŠ™0_±!q_]GœðUO_Âü%ñ°ßô¥è_<®P´µ¹qëuŠÁÄ x7Š'‹PZ_ž+Ö´—º)Ã9˱M… Ù” ŽƒÉ©”"›RØnhM¥ٔ‘߄¥Ù”ªbø§RŠlJuP£y.¥È\Êd³–š¥õSoÕðá^á)½ïiÖ²Ï8cLô%ë—.꛾äµX˜ÿÆ_BYâü—¸Ïgôÿ‹]§‰ppõè×i‡¯ÓàH´×üÑë4ŸF#ÿ´ë4Ã証;g­Ð4]”s.x†2ÁÌ93§+tžrÎ¥IrÃÊ9󻔯UΙ3B”bιQ4$ô™‘Îx'ƒ°‹F:W¥Š•qw¢M ã öVXLcœq©AšQÂG)Bùá IŠ(ߌkÆ. ß\à)ùÝÄ7—Œ†U¾T-ç ¾¹¤dˆòÍ8kÊ. ߌX)_å›q§ ´òÍ¸Š£€ÐÍ f•¶VºA˜F¥›quHhE£›áëjt3Z-£t3ˆX­Xéf©*û­t3.Vi¡›áŠ$”mNE³XŒmç*ôˆÑÍ) îVéf¸¶ÊÔ*Ý ‡Ø+-ts’ n¢›áz+ +ts´€`Ð͑̎¾J7ƒNUÂWéfL(%|•nŽi”QºJUrYèfd$Ho”mÆŠZ”lŽ®9:£ÚŒk]S׌NhãšÁ‹ê ”kFp¨Ì²rÍ!kØ0¸æº’ƒÆ5Ë \sà7âí&®¹+ÊÓ*׌@YË(×4¤TspÆvÕìW¢[¨fožú š}íJ)Õì«fõªÙÛü šAM*¢T³ÏšbaT³OÆûÕì±p¤)¥š}TÍÓŒ”'e‘•iFZ”kÆ4{oŒµ1Í^_Œ1ˆfïœÊ3ƒìQÒVyæ•4ž´Ÿ¶­<³«J ž¤^DyfÐSÊN+ÏÌ–Ô¬<3¿çDÊ(ÏÌäÛn¥™]Êö]Xf78[c™Á‘uå…evQóÍ vKùX¥™]0öPifÐR2fÁ¤²ÒÌà†„V–$ò³Ê2ó-²ÝJ23A¢ä°ÌÂI"$óˆÄc& Yg„c&D£sîµ -3¿¹Åe¦˜ùV‘’×B1ç>´¢3§÷¨ „b¦(NÙ#£˜ ±§„bÎ8pUžW8f¾sç”Qör—Ï.ŠÇLH4D8f¾Òä„ÃŽ™/óiÍL2g\Î’Q)É̉DÚ?!™3®t),$3ß”"Â1sФLPå˜ù^A‘*Šñ’de3šÍ£3¿ôKû+3!Á˜já˜ù£r¶Â1ó;¾$6WŽYÞX#L¯pÌ„(¯o$3!a Uãœ!B3SÞ¬¡™9ÑIÛ;“¡híÐÌœý¤ä´ðÌ™O¾…ž™¢„+Pž™¯x "D3¿ G)c!šùR˜ÑÊQî7½ûdD3!ÞÊѼfQÑÌ/Ñ‘¦”iæ¼*av…hæ×ê(‹ÌD3çY m+<³¼gGªž™¯”žY.ÄJá™ùú™ÐƒÊ3s.–²ÓÂ3ó4²¤[r–ñÌ|EÍ"Š)Éaš9]k&šåšïnå™9}K;#<3#¢(å™åfÛnÐ̜ϥĮÐÌë;}Œfæ /aÀ”ffD¸5¥™å-?BW ÍÌ9_Êh ÍÜÆiŠÑÌÈ™+ÍŒœmIif Jõ*ÍÌ—¯wË<^4Xæ–ýà”…en¶­ËÜìÒï`™Ç{ÍÌ÷ÇwËÌWÌ…èUš™o¡+ñ¬7¶íºÜ ™GâØ ™Çu¹A3ërƒf×åÍÌ×åä)¥™ÇýûA3T²A3s*™Ô¬43ß“þÍ<^4hæq?nÐÌã=ƒfæ— ­<óÈ/<óÈ/D3ïsܸÍãö›Íœ^&üª2Íã²Û`š9Ÿ^ˆ[eš9ãLhZešínÛ šG™Í#ßlÍ#ßlÍãæÚ`š9ߌnTó¸¨6¨æq/mPÍ#mPÍ#mPÍ#ͨæq mPÍãÎÙàšGNÚàšÇ³Á5fƒkijƒk7Ì×<׌kž¾Þ“j”kwÌ×<#eÜS’‡”jž€:î I¬T󌴽]xSDÉæq mÍ¢dóŠÙ<#E3%›9\ó (Õ<MÕb€ÍÐÇí1”f^¼Þ+Q Œ«c(Ç<u(De˜' ­úv¿<}½Î·[Ùå£÷A¥—¶ïþ6z Fo 1³ô¿¯ç—ˆ?¼ººF»«q)¿½ºF î\ÞÚþp帶|Ç/GŒ·ØS¹,óëØ7o0;ýáñðtؼâý`þ×åÛémï÷Z±óËÓ›mÍÒÍåîðÃÓÙ”²Ü«Õæ°|y©_/æ/O‡û©Ÿƒæ“WáçÝÃeú¼¸#^v×e•ùB&yÐpbµ/Ôˆ×qÖ"^&Ÿ ¿éþý%£Žm9ÌRß¼)ÿûÍ‹óg ÞÜêó}+›û»wx I³äeÓ²y½¾ñÞ—åiÔó'…ÖôÈ4çuàWAÄÝ5_¡mãùKò×Ëã¦w7·› õRfA/Ë7WxODìËÊšÖ\1UÈ|Ë;ñÿŠùÍÍíh˜ÕqHÚ©ù=ˆœÄÿ"·*‚»hט R?¯´'ʸFF‰Ü?mॣaܰÜ?=|÷êÝËoµ Ëß­_>‚d8îß¿zX뛊½}ñî«¿üÙþT–ëõOÞ}ÆÝSyô¶ ¼¢åúÝ»wZíZe8©òo·UŽNIÇñÙo:þ-=ýÙú8U·>sÒs2¨èãOcøT1~óêéfêÍeIÒËŸÍù°”b;ñ$0P&âóÖùXÕO´ ßÏÞÃfêœuyã>ÕÖÍÇù“,r¶^Šû¿äjŠÎ*E¸u'÷W ~µìCfží'®óiqy}Ͼ9ÙøyÀñ|l·õBñŸž9.óúè‘ÇM|'UžPûL{ÓÓ½}n—=ämøñpP‡'úup)œF­Ù¦5z:?Q×TPæ'ÿ [\þxa¶­ ·É…äé†Ï´Ž$+™üÙO˜lÑ\ZÞ¬±ÜÍ0;Æ%)ξàFÅjÒ¶øOܹœ ›ûÑäãAìÕÛn´ARï7²¸ü#{/õÚ[£#ýtÞc<)kèÊó~kzYR4©žû»5¥ÉýâxÝ«oG¿ªwó‘h-‚“sݦ~Q;ïâ4 ¼ßƒxÏÔ G{ù+”@˜R–ÿ6·öø¤öYàٔѦÌb ¼`‡‰[žlŽÝ^ÌMSh–ü²oF¼ñãÕÏ稒Q]ݼš6xa”>ŸÄPåãS 6äOsó?¹]¤µ„M»Ë×ËDýµã)|ã}®Ö÷~ç†7“T²` Øái@ÐÍãªùã€øØgÊʈL± ¶?’WðâÍá-ùwȼ‚ÿpů‘¬X©81s´U½>ܽz<û ¸«ñ_ƒ?£ºioX fÉ?ÔjÏÖj…u_=^ 5‡ãª”úf'YÙ>c€q1·‘©v+3†\1¸6ïæu¤ž•¬‡-­wGöºñZþ'žö¼°ByX‹Ìsx™oNå¡óü•(çq<Ï}4«µÙ¯åùz~þkÿ/ºÆvNæí~r@æ¹ÉÍ—Ç 7?§¦Æ—Æ’Ý:­£oL®>ÜmhTò‹›íôæ–=¼‘¨³Ë!Ÿi¾?²Ï$dWª…v"|›+ª Š Á^’&of—ûÖψ3‡ÇŸ¼¨Þûå¢ãn=ö 7£Jø }“'Ò9û+ÔjC±Â¿žÌ§ 41Îv†È§S‡“ˆË -· Z^ •Ã(È1n˜‰l`šy0ùÕjötlšGtäû™ø¾yÒã>’äV׳SµeSäøbK OçžÇ»‰žo4öÅ¡rõ·œ6«¦å°åY>à­óé\øØ.¤ä¨òÿcÇ,¡]:Ýž†=Ž#ÙOåˆC’ óÑ]Z-ˆ®ÿ³ŒF®'ÝšèëKJªh=Ÿ}’0„êQO;²‹,-o ÜVà׃¦Î6+¶†àþõ™_?SÓæ´ù” ì§ØDž¾%/ß_`“«ìkíø] 5Ú&÷K¸ÝdmÉ¿˜ÛýeÜn¤ñaÓžêý¹~7^(ŽD·QÔT/m†7Û½t;çÿqqm¾ÔªS>sÜ#¼ìjH2Åü€ow5¹ÅÞÎúÀç6;<âÙ™ø/r¸]|„#RÉ'+ö¨g²ò¯†ãíôÄ´òÏÞ§­ý>å¬Á ¤fêp[Áè‘g§¸âþÔó tÊs(ñ-ìíÉjZSùˆiEfY.'R¿bר“A?‘?÷Þ[âD~ö²26Ûúáöôlüy†þn-`9< ™PÝo{rV·x¯E‰G'Èe¨GÛX²=ü?Ö Ù±ü-ñ >ºc×ëþáü9M$GùþÒ„8g¢#6j×ÄDgéìÉTçô¬ 7àpN®¬NO[“&ÌpëôðväX¢5ªÞ?Œ¹±%å=^{’‡1øaòõt*•Í©^YÕ·‡~'ÊIþÔO›(çÏ%÷!Å˽=:Ã8ÓÛ‹“ 6½ý Ä‹R§'|'‡Ô±ÂO虫gÏN·{BÛ'_{Ývìï”TêÆÐœ.ø}-ÙVügwðÆããüî¬mÈØîJ¿¸®GμιžööÝ9‰ÁäRú\”ÜL.I®ÑZ)fRð}ÇÉyé°åœÝÍ‘¤™w×SÁ¯6)T´F/h¡Ó²UÉ]Poí9ÖnU¬?_#î‚|¶!á²J8­b-óÇß­ÞžåñÖâ‰Ï¥pµVI›ú¤ ÷îØL±)’´ŒK>ù[5RÈÙžýœÓ5nEÄ´å%/ÎYÌÄO›³É5<©päI5lÇ ·S0jVJÁíù&%9[vLÜÜÞÞ_™oü^pDŸ')Ð\žÖ®qÓIqͳE6Ó6¾9“!©nÀ¼":Înxƒ´öÇS3v´Ø*g¹#ùå‹– ×e†5ù¨/òÿ{‹ùt_ähûØŠáÌöñ›Cæüã6‡–cÇaÌÆèœdcþ+rû šx¿ýþuDò| ô=¿ï!á úL'ã€w¤ù¦¦!z§Çù°?-à[æŸH†â9ì߈íÿ ‘rû”d^êWy’ÌË r—ã6Eùá‹#HÎÝ'§xŽƒ’ÏŸý?šZþûendstream endobj 464 0 obj << /Filter /FlateDecode /Length 2696 >> stream xœY[ÜJ~ßG$ÞGQ$zÐŽOß/NN@!Ñ"„vƒä½dbâÙÉûäò頻=Þ³íÃzÚ}©®úªê«òÞˆ Ç¿ôÿîpÁ7û‹/nÒ¿»ÃæÕÕÅwoœ„‘&ð 6Wï.â±*4ÆŠ3® Êl®×ìjëUù¶¬»öqËn´—!°v»SJ6Á+öêa»ÃAqãY5ißwí%΄]„c¯»{z«œàuiÞzvŠÓBì‡÷Ŭö§âǧ­ô P¬Z[ÍÉçqÅ^·4_HÃ>ÁÑñ+Ø›&IØŸâR´GÙqºVžµl´§ÆØëøÆJk¥©A“^»Zžé(PοPƒÁ›ÀŽ¥8=¥`ö~ûöêÏ`íK»(/­Øæêþ‚I³½úÏÅNK×Xë6;eo-¾ºfn£C€S$ûÇ‚€êA@Á†ã~y4árìëG¸z1óø.ΠƲ»-NPÜ³Ò Õýâ­ÞTxåÇ´·ìþ©•Y¯Qß§C÷X¨? äûüäÙã“oNI–àXßÞÆ{*±˜Ôï†ÏÝ/ ¬î˜„‰?öI# Wû±Ï ” ž†5U„ê€G.k G+H†«ð=Àé®Vw¸E§S%Ã}å*ØSÁovð`t0•#ß'W×íÞ%Ü †ãeö¥‰~œN¿«—cvvɺ±!v“í¥B˜µoª “†­¬oqsŽþæØ0.–Ì7¢BÑù$. ç 6ñΧÊ÷ïÓ¾Ê0|ÑU¾(”m4Ͼø ]qé®B6‚gw½fcw¨L3¤#‚ pT £¡;=h¼©oñ~4 €¶„<îĵd ãè¿3rŽã0ž±ñf) Ó5£î|•_¤ƒ´düF6Þy þ;jÐër"hËáD s±¦m0‡sN%ƒ4)6êÆ*—aí`—±QiŒð¦ÆCœ´ßôù˜¡ö‚èÊÊ‚+ƒ®, äU9ñt¶c‡´û£é5E_zÖâÜÖ$×s¦¦ÅúÌÔ“ð Ûž¹FÿOKÎb[[Ž™.°/H®1G˜ˆaÜ!¨µ€CÕÓèÐd4Cµà!Å`%“&ÁH`¤t²F%\cPÏ`‘å#ÓÔ'¡hƒ© (€+hPôõ:E¼¿Ñ©µT1—ÄЦ¥ 4œ…6xan« $k­ ÌU‚ìR>sÒMÜLÛ t+!yÓvpPiíö”^`JB<Ò$ ºIbd¬Ð}_-¿ÏçÚží¡Jù`¯»´¥[ ÚaHª+FG×^xÂ8ª¦ …é¶ÎÏÃy»Ê­]Û÷_sâŒpýËÅÕ¯¯Yw(xÓñ„Š@Ð指ô!1L5ÓcÍÝ—±JÚ¿F±¡2õ8Ö±9æOa/Ë¢\-]Åi«‰¬ƒ¯ôŠ)+¡(9~ˆ;ýP¨b„jÕ8 ™iyeØÄáñC»Gƒ•‚V¤ªÙÜ}¥ì:'&¶-,‡´PÖâ#Ò¿$Lzá,Â(žiž‰ŽÒ.1öûã©«ÂÕ!&Ézô ègCÚwoŒ«tðuR»=Ç̺)@™Â™¬Ì"m²º2X&NŠÀó»D® ¸b€ŠÖÄ­ÿ¹Å{ø`b¨gpBeŒ³^°¯iSA™ìªÜ1MB&GÏ1ê«¥Îò'ÎS3Ò}ýsbÁ=þùe%u‘ä)=â’¥e0ÀÑ ØlXñê\1ÔŠ»Ì—pçAÔbDiŠÜ ÃOÛ§<¿ÂÑHSòt•E•8Œ˜W.¸ˆ<)£AáÇõ*5²#Áé#ú~¹JMy¹h³ã)‡(žÑ¯ò^¸Ô¶.mþ%eJ¾_s±¥Ùçá7IH!T•¬­j<ÒÅ4 ÷þývg`€höúäÃý RÝliTn1凿ItÝ< Øowø¬©ŽHN}ƒ³NûËô&@)0ÍÿÝü(8O‡,•@J±Ë ÍÞ¢ãæ^A|1–ŽQ½À¦Yò£cÉœ ò´±Ë) Ũi1Ƀ‹ïÓ¸ÖçPƵF?›ÿI–…[ŸN„3:}™‘KøÇl‘4@i >* gÎC3͇¤þ騻s§ w[Êzî³@ ¹²ÚÍ$Áûlͱíë X–æ‘€ډëQ‹ú6 ·Ÿ§/9RbÊSn£Yuë8[×{5iª/å‘s"Ø÷i;0õ24W¼$ÕqnˆlQ¢~Këà8UUý1( ËÓ l+.ÌL›êÁ]ŒuÃmYTͯÊ[I&ÐñsÈàH–=(à4Õd“–üªÆG4Ušz±ˆC›É•âRH çøÃPê='¿¢¬è4å»ÿ×®$˜¢XRoñ‰â)Úªn_õ´ÂÔ¤Ž n®RUIÀ —6ê H0F¿ƒ ±õâ¸gŸ»-ö;Ô’c™e‹äûX$Ù=m¢Žá¹ï>l3±«ûy_³ rUŠ!Û|KÛ–¹§Ûn»µJà®DDŒ]±2:bÂkjŒþ‘¨YN¿:†ÅÊ»QvYùÎâaî4œÎ9Þ0(:ò"‡ Ù…@ìE);w5JZAÛ˜¥UËCz·‹>`¹Õ¾Ç©~²†UllYÀFʺxž¥ÎÝr:fAᕞöùÚ)5בNÇC’ ò¸Žs‚· +˜˜¨J¨æX4žq猵µÓ¥WÒs±@Åc*tÀ[Æ* œÖŒ{ÞÐ3Q3«º'ÞäK–”3j:0éûqÑo_Vc :óÇúfð9:2ä÷I’6–±šÊXäé£ ÈØíßÓ ‹eB¬#âç˜ }Yôduðgy“N„×b×v7Eë%? Y†ñ'Hâ‚yÌïtÛ=38í#ÃC¶÷òöal¯ÅåÛ›íeš :^›#qÎD÷êÒЪE èúR¼Åþçð(߯gUí1<‚'d?†iÕ8ed&£WÞ Ÿ[Íí A2?5 ô%$Q6¤ Ai^ Z'¨$mÞkQH*ê:/ IMŸ9bè—‚Ÿó… VªÆØ ûy’mû<ÿÄÞ‹’Kº©Ö‰ä¾…ƒÆ~ÎíÔŸÈ÷wç#%‡Úß«e羘¹sè¼å×ÿáêâïð÷_!W~endstream endobj 465 0 obj << /Filter /FlateDecode /Length 178 >> stream xœ]O;à Û97!ªJˆ%]2´ªÚ^€À#b B†Þ¾|’lé}lÙÍ0^Gk"nÁÉD¬UV· x‚ÙXÔR¬ŒŒûTX.£f¸ ÿþxÀétïbæÙ·uÕV‘t V/$ag@Œδæ¬ú;uU0éýótá„$F¬§¼€Äˆ;^@i'‹Û¡ËÆ9â‘Ë-°±ô(9s> stream xœ=[HSqÀÏióìd².t ɶó ":0#‹Ä¢IMo=,=nËÍÙvlžmM›©ß6kéR“4\Œ@¥ %ðÁ=úÐC*ê¥ÿ3ŽmJ½|—‡ïû~¿Ǥû0ÇeêšóêUºÌŽãBÎ>á„ É$+2 KYÒ`²é2F­‘ö&ÅqGo¿ÿ‚¹ƒ³tz–nRR5§B ]R^^VH—ªTåt…‰±šµí´ZËê“–M5FºÆÜl`Xnw䬞e;ÎÛl¶"­ÉZd¶èÎ¥·Ò6«§5Œ•±ÜfZèJs;KWkM ½Z´—.v‹Õ`2µ Ã$—4V +ÀNâC»^˜ëÆ{ð€\8¼ ò8Êà¿òôDøL-"¯£c0s§y‚sg‡±@o“rgPÖ8à¾êâÀÎALx"…ظzªï†V•âQ(ˆÂ”;F" áæ œäŽ_Nè s¤(!Â1˜‚()O¶â> stream xœ­ZYsä¶~ŸßàÖ>a’†¸¸œª¬íµ“Š“Ø«”Ë%åÒê —Ô¬Ijµò¯O7@r´VäÒƒ8`hôñõþRT%-*ü ÿ/ºMU\o~ÙP7Z„]ñêdó§4ƒ‘ÒV–'W?…”ÛR*Zh©KËeqÒmNÉÉÖ𲪄"õØÔ·Ûª¬¤0ÌZRowœ³ÒN^]nwøÂòJ’]·Mý)aªÉWÍ[÷–kZYÒ„y†eHïɬeäË›„ª¾K~|Ø2üPN²¹Mܯâä«ÚÑS&ÉØÚo (ù¡ Ü[ò­Ÿ*­0È;’ nȘóæÖ¸ùÊ¿QL)¦k¤:çç]Ø „óJÐiÉ>eòɭ䨯·ÿ=ù;èE˜T/ܰRp º9y»!|{òóf'-v\–F)=%CݽOäݼ2x’J:cî}ª‚‹ô͘)åU-ëÍ­_×rA^7×éAútžãë“Í÷o²è[a~Úh… v¤Ôš1±E+$Ï–}òz”•Rót½SÚ\6 ùÛm<¥ ãM.2'IÅÉ¿Ú( ®Èë­A»»l2ú«ä9•OÖ¡"ÓH=ÖC¦•MŒ¢CIÒåÆ=¬ÉÛ¿Ë)Á|5p Þ1c«ÈuóÇáÑL§’dlºÃ&JYÒ5~žŸcÌÌ~p&»£œ:éÂC)…eÞ(Ï·;ÜOUb2<-@Ž£cÃhNd7Ã`I‚bd>Þß%ŸÚòØìSìüü Þì¯ÂZèØ7 “‚Š: óÿé·ag y‡l$.œwýä¶3|jm»÷z«(¹Æp¸Ä:qaÉ?ëéàÁ´Ú°´åäßN• °îß9 C¸Rä?o’ -ÿT’“›c°1${Î,Ùƒ3cŠ“lNþp û½€A€S<íaÂEªÍ6•ã dMP$(uþWøŒê‘™öë~Œ/œ¾=3 §ž07…€­à„sO›Šãr–‹e$xÉMEãb³N³ßÕ×QP˜RAù5%O×”²ÔBë~@`\ ¸¤Pa[rFðü$&ç›E åà匙BY0*M&ßZêxâ)Clõ¡›ÎCe»O³À3‡ÀàÛAD`È_î'ËÒË•™']4E@À6‰LO !À|iŒJJζŸÃlÌÒlˆ¯ïöÑ[É$Ëï.®›‚'¹¹lߟ‘WˆYÓG:Ò a;HT³–K›§­}û€„®L&YÝ*K¨ª™€jlŒU½/¢øQ%„/}p>”ºuÜ9R(TÝ\’ý.cbßÒÖy™y¨ùCs Ä4†ýàü˜¥­+‚!/Y„&ºÇ¨= ãôè'+×jrÏ£çÝÏ'é0T>ûë¾î°KÊ*W2œäï£xfŒ}ŒÍèƒ*p_l¡Ns°å{ßF±YÏÖPÐþï©-dKGY chN>lŸßmF– bcØ£×>´|›÷éDÕ¬ÿÙûÊ jxáÈ ?ú†”†Ù•‰«#©r‚Ë^`,Òx:I¾Íqì2Â!x3·z†*yß±N¿ƒ1( !¬3ŒýܸvÏÓÚHÇÖaƒˆÒu!sÕÏéî H hº"vf1ß§†»G1[—,@2m$b3>Ôa  Ñ0Ö)êdnÛ¿õt(R¢}ßÕín5FâªzÖïgÜÆ†Y´ÉIR1†ù.¼R(gƒÒ[àg‰ÑŒc“Y!¢*Ãî;ií±! ž¨;@èì,Îñ*ÈKÂ%¹ ¶qaEr ìš÷ `Õ-ù©}ØÇ©!ÕEúÜï±kª0³Éñ pJBâòj?íéËäÍîxãíÁýjµ‘bƲ‘Å)n¼õKAN¹Ò´Ë{ÑàãP\˜Ø’sí°`³ìÛO¶Ÿ“ŽùÜ_BÑju+Ú%yÊz0òæ˜l²Älv÷0ü L¡@¢¾&,9÷W€PA=&(„(wÒOçœéâ™@$¨dvQ²çlA@¹œÀÝjac–«9\²ÅC¶ÚÍ#Gà×ßaÇ`-ïFT¢ˆ;oŽåJXÃï I.°Ðw'™·„çˆQ€ bNÖóbúä"wÃè^)™Ÿ1Íßûìö;$ oWÃd¬)×4à^BŽwHÜã À}?K÷²k”û ³¼¯ÆñÊ­‰Ù¦XœÁcÛîÞ¥)×>\ÃZrÌçYy= A*– q‡Z_'[~†1Ïi¯÷}~YÚ¹ÄKhwÞ GõÈ@¥~ÚŒ ð–›­(î]R ˆG¾„h÷]‡qÍr÷A‹réö¬ôì\a†ï¤‹Ñ(Jf4Tý–bnPÍÒðú­g+©‡°_Ÿ§™)†úÍÌ,]ï³H®³\!»©{€v¾BdY÷Âß=J—õû `‚ÏjùJо#§Æ(Dõ‰eð*š%‚b^–kw"'sϤÖÝ—æþ‡W )¦?®]53ËLò¯_ßjœ²–†lR*Ø!NØJðоÉ43½Ï7®óГæÉH˜æ/¶1Ï\é;ÄO˜Ž$(‹HÙR+))È‚˜¿‚w֓µÛu¯ÆÕŒŠyf¦[˧g4²dpÊG.Ô¹Qä]A%ÞFgiq}©ÿåÖ§D®Õ— úÞÝKSG±Œ)ì¬4ú5õM?ª}s,/æÖ²{–ÃÓ&Wz ñEÚúc`Ö`7Ò)ŒKsVÔ‘«ûF 2m¥"Ïù4å·$ÂÕRÃpçÈÆJºÕoo’c üLn\½_ ¿Lé¦;ó»'íĶ7%ÞW nä\Ä @ÉÅ×'C3ï p¤=ž™ëær›_ÓŸó’ÉGó£Â’¥Êþw¶–9eà3Ëœ Þc¿Cæ¿4xóN!u–îkNòœšq¼‘Ðéz¡ÔŒúldc;ŸÕ]³ó©À¬€öäjVf¦?`}åƒÅã}éè” Åz1´˜Îí'£/ÜÍ}EC&UYcIÛtYLñV‰t3h†BT2'¶¼?lŸ'V‘¡ÊšÿU¾o6dëþ—ĮʥuÛí‡1þfkýBÀkX`+xQY÷±Ø#_’:vцœ—ÂG2ò„YÃm،Ӽcãõ`ݷËl'c}”=ÿ£T(ž4ÛÌÆÍÔrå‚ÄCƒ û¤CíÊÖ•¿l™’L.ë‚'7¡ÿFfendstream endobj 468 0 obj << /Filter /FlateDecode /Length 611 >> stream xœ]”MnQ„÷œbnÀ@ÿÙz{ãE¢(Ɇáa±ð€0^äö©*ì,²h¤²Aý}ÕÒ[?½<¿,§Û°þq=Ï¿úm8ž–õ¿Ÿ?®söýõ´¬6ÛápšoŸIŸóÛtY­Ÿ¾M—ß.}Àúñž¿Oo}ý36£þ´¹ÿh>úûešûuZ^ûj7Žmw<¶U_ÿý«ìþ‹ýñó«ÛmÓŒ#>­iћњññ±i§¦Aœ÷Mƒ¸gœ›qf<4 â±7 bg<6 "4vÎ8âqÓ4ˆFà›Œ |“‚QÁ€oR0*X4 b0fÓ &c5 b1ÂÕäkô5È™‚9“ QÐ g4 äL‚FAƒœIÐ(èÀw)8ø.§‚ߥàTpໜ |—‚SÁïRp*8ð] NÇ}\7rÞÈè‚tB:]NH  Ò‰ ¸®à¼Bà¡+¯à 1™¼!æ s€7Ädð†˜ƒÌÀd2Ðb¨É`“¢U*ÑSª«dW‰©½É½‰©½É½‰©½É½‰©½É½‰žR]%»J ¤0’‰S§ÎùÐ|½(|søz}=VÃüq½öå¦'NO_®ÓÒÿ½‚—ó…¿0«¿/³?!endstream endobj 469 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7311 >> stream xœ•y|Õöÿ„°ãPɸdbP#]Dštc¤%$ tHïm7=›mÙݳ5½÷ÞÅB). ²T*ÏB|>çSïø.þ~ÿ;»!ø|¿÷'»!Ÿ;wæž{Î÷|Ï÷Üq¢¢œœœF¯òõ‰õÚ“ôÚŒië‚C“£v&W&òîNü˜AüóÎ 8õ·A¿ùˆ`¸3 ¼wÌäg]ø…£PËH´õÊÙÉ)0*õ­Ø¸Ô„ðа$™3fÌš6üžï±+ÕÃkº‡ÏÎÝ‘±ÒÄÈp1{<|¦ûN÷X+%ƒá“ccoì¸ã.Z¼d2E¥ÖPã(?j<µ–š@­£&RþÔ$*€šL­§6PS¨@j#åEm¢Þ¢¦Q›©¥Ôt*ˆZF½J-§fP+¨×¨•”75‹ò¡fSoSs¨UÔ\Ê—ZMÍ£†RèEÔpêij 5‚I=C¢¶P.Km£ž¥ÄÔhÊ•â(7Ê™L¹S"j õ<õõ"5„ò!Q"ƒ§‰N籃ÌΞÎû¯|_O»ÐO>õÍ\²tÈ߇ʆÍöÞð—Ÿùtˆ9#ZG.yù™7ž©µdÔ1—KlÔ³KŸ=.Ž=d´Þ5Äõ.·Äm¸Û¥çÆ Å‘¢Ít†`Ál½€Y´.ƒÁYÓøÑbùºUóçÀl¸\ömÙ[¶ÏaÝ€ö%2ïÞI¶¢íBþOl²E£ò–ƒâ²c1Ü W¢‘f/çp5Ap²¹ÒÊ]šô.èS­±ªü.g¬2’‰a MWîb°+É‚í"¤¥ÙÃò š”ÜäNpëS±šÂÜ–[ÌÃ!ÄdGšÙ]Ùj÷otÿò/ÒPP`ngž ôº e~åÊNæóÃÄÆjõ;ó`#¬Lõ^eéäX[›™<ßêï‘/ìô²`€›J‰›ôOÈ’ÁÎ4IA;ùûò? §Ý5‰%Ò¨…ºrsS¯ÂÇ ¶ù \âI~¹²wù˼J\|ͱ3·‡£úo¢ƒfö1;Ó{cÔú@z/Š¡1t­ÉîZݵc³ŒtŸcÙ¯®}Ì%ÈÅŠ2¬Î|%®ø'Ueö.æbLÞÅyûMÝmƒ¿BA´.^›¦KkƒÞÀØ8ƒ=éA•©QîªÙ)€Bè|Uhú«?¥õdQÜÌ’oP…수[`}QöMF[©-Š:Ò§pšôÜ„V(€r}e÷»¡'µÍ€f¡¿æq0šeEïY]zl(Õ¶‹¸ç;Rlnu¸~XÿмCGáÁë¶l€°Q hRšöãO7‰µç’t˜Ò¥™²ÿ@XPÊ$áÑ­!e;ì‚Ý£±w^u »¡ap·Ö“Œœœ«‘v¹³ŒÃÇ »´-ª‡:0·¹9œx‰„8Òæg °Ý%†êùä"6Všj ÔMšÌ×/' –@Á SÃî8€ä"4¯8Y?¦ZÁ„{¸$È8pÀ\`m~áÀmci^-£§s+ñƒ¢ ­Š¡,åùµˆA=\+±Üá~;®X]Ø|€âå 7+{QWte÷—x<ì€ í¥Ž®J¯'Ûo)Èë6äëõÕ†R} IËOápTöR¼Lƒ¹Mé¯0¬l¹ì„Ï?Ü»áBÞ‰6†õŒª8¢ÛçÞLøŽ,‰§þ$Ö$åJv¦’‰i{¶ÂÝÂ:-û ŽÞéFL}„ìÒŽ6ãÑh³™ü7mve¯ñÚ>tì¦'¢9èE4Yt€Tï¦'ðñ8¤µd|ÆDÎïA£}e7ÇÞ3âkºô]<¿‚çˆvÓlK¿KhH $¿¢‘Ü%<2’âÕ2Ça@/M^·"s§MJP'­ÈçO³eîC‹Fš+é·N0V›êãIñ‘þ QЧ< ÏÙd‡ F2éöúñ3¯°ÛjS£ØJ5¡Øªì©ušfùþ¾›ÛåÝöÔ é?È¢râëjä²ÝÊY]n£M8€|ç’ïš[«onùk*ÚDtšßÿ‘u”@+ •"OÍŽð^¥®É%ü9ŠÚ€”¢š}–êÏ£(òv0å0a]¨h51Ï5Ÿl£oáߌ9: €Àž×Ó‚B´:€¼C #Õ`ʨLpgß÷ˆijn¼rgÓî£p>Aœ¥¥óA$Yê™Ç©Ü[üœH@S“ØÜ*bEŽV&UdÅmyæÂšËeßå9ŒžBî$³öƒN®«È¬' [WanaНƒm€=a>“1KЇÿerô"ûÑXÑ‹øùVTNV9zÈÑØÖ% $T\»=]{ìOï"¥43~ÞÆ¥†fÆÈbÞ†ŠuU}‚Àáþ}®v Qä"I ë‹á­'` Ÿóñœž6nmdž,SR^°IiR)‹¡Êò‹JMÄ"KÍIÂ& Æ;žã6àA}Iëô‹ 鉟$Å…gû(e0‡kiô?èh}µÞh¬p³t&Ûyì.r…*B±•Ó¤hˆðŠ/Á#‡ 4þ|4QªÓhÒÜTáµ]ò#é:‹±ÚXÖG^—„Œs¹jû§í6Á|F¿Röoù³R‡gƶ—ï7ìDD° € #ág$×§üâ~7µ·0¬W¨J›yàq½Â,z]ÌvùËýæ-q_ AWÊzÊøâ£ËpöûË׳ŸN#+‰â·ü_Áþ¥þyÔ@/zKh"¯QvdãÀmEÿ´h°g_BÿÁ_ú×¥ú3>V¤§<Ôä…•ëÁ­JŒ–}dÛ\ý$‚áÃO?DÏšã%}N¹&'%z£¿<<Áû˜ök§kˆ›-ÝUˆú<Œ8g’dØnÑaà±’Pdï§ñÓâÈ#=ÏN^Ï׊MÍ©µ±Äñɹ±êØÊäfh†ÆZGþÙéÇås[¢MXVƒˆ /Ƽ#/ ;ŸçY¹¸’Û]Ù•¸àø™#W Ý4}”.¹PUÝÛ±Ö"®·íKEZVtXW`1)ÞÎ0kQÆ\ÙÊ.ïÏ‘sפúLJø%pƒß"bH)¬‰ak‚›Œï* †ÊÈÞö5s½ý+Úk¡ ´´½+úlúEá|ë›ÛŽ~ŒÈ(R5âwÕõ„ô gmzâ²ôûvñU~ù#OÍìÏch4½üá4mš282Ì-"8Š`$² ™†eôF½AŸ'ôŸ&i…ÄÕ%ABZnLÖ?ÂA@à4^t‘¨¨üÿÑ•½ŠÒÉ&'z’Às$q©³ß¡„{oýfØ{Ù^ýÎd NrÈͽÀÇ#o<¡°·z=àPç1Ó³º4¢ <|=N ZMþ$_ö´+{Ò“/ìÃV´EO‰ºú ã)k3“«îxzÿ`{<»i쇧žC?÷nǧ¿¥Gíæo¦ g:ÆVCE©É5÷¾cWªÍœ(œ*©Ítéw®‹X9u¿*bs(ÇQ÷£˜ }¢-%8%E-´!!¥ßù›}Gâ%bþ>ÕÃ30Ü6€ÿ‰Ê_Ïô6›vUø'7­Å÷¤xä•WïƒÛ}øéN5yÝ#·ý›ÖÛ™jí“磟PMO€ÎÁw£í¶xÀð„`€ÕåÂi4Lø¸²GùJ‡š …ƒHÍ«‰¸˜ Ѱ#+l¼3¡2‚¨ÐÈÌØd†ý¢Õ(…T÷Ⱦ½ÔÀ^ „À…öêW;ÞÂ#[Ñ Ž=ÚSvôðA÷:(J“ùìÁ™\Ê“Œ{ã7”õéðLv£ø’!)@¡ÙgÐì04Û•]ÉÿjWuv·/¢µ Hiç¿N]¨ŽuÓѦ‹™h3XÔuI '4.RP• ñ– _¢ÙõfC•áT)ïѧÕzC°¨¯Cm&í5Þ«uaõ¤…w+ B£¤Ú”weümå8U¯5&4B¹^E]h_ͱLQ_Wо!ž„Ή«Ñ°¨oãŽíºæs:‘ì7GªSh3 ”f šˆ²ñ™OÚ¤5øEV|ìÊzò2!6VÈ ´úä ߎÄR4ôW’Wšg¬Ò›Ì-»y‹³4lnÑX:" T¤-ŠÉñÖÆ¿|Ë.Ђ’8$=U“¡I)T+ïùqx¨_–2S¥‘Q¥Ž9hÌUŽ•©â³½Õ1:¹*¢:ÀÒ¡/0·~lh<^}ag}ºò‰WÊ+=Á<ëoãˆúŒÙÐè©4ôÛ8š:àPÇ[`.¹:3¿¿Í©£L9ÉÞO Õ_vAúË[/¯%_WÖÌw'ZºÂ ›Ü=–f™z4ÎP, &G¦Í&TˆÇ‰ÈµlFTa]$(¤. 2Û“\Òf«É¡7s—¡˜Œ“ˆÈµbRz,]öäA£œÐO âBkäþí°b£Õ‘Êà†²oÈÓçâ}7¥gçÊ4)jT›QœVAú;ä|ª z¼wtd§1¿½ý(‡½°ïTúX9uÀ¸÷=Ùº ào÷Jÿ-¡+¾}^œ×ß Á¥ŽR†4Æ·Ã>hmsp í·Ibcev…’!'C‘õpíï˹œtèšÔâ´j¨…²ü~ío˹Âr=èóŸè%jI/A¤ÙBäŠÙßXŒ´¿,ŠÂ«?Ç®ÂK¬Á€F¢çZ‘³²Hœ€'ÏÅCÃb؆†6 Éõhâ×÷®axòåD<Éá(tLø8ñÛÅæ–½°»Ñ²×ÜÖ„æp¦ÓÁM­‡j:Ì ‚05ä0å×ïë1CÅT/@(–U9K«RlRÇf¼Æ©B5Áé{26‘z«‰*7Q]¯+„F¢4Êõqx§ŽVl;³/é”òØÏóñ+!uAo÷üû÷ññ ú¾Â¡GÜR@‘­Ìœ»^&Õ2¬-]'Ѫcs*Ôe¤g{Çr|ßÒ‡ ¸tž©7 5‡!„xPljì{CË`9}é8¢n;põô™‹%ŸW£á³nà@4åôù™sU!² ¨Æ S³¡X[¢È«=t²í`nmkÆ,Ù2¿µžØŒWs2…J­Éì}ωî<«>Ç£¶3ÄŠ2Xsk¢>õØÉwº-äLÍùïoiÙÞèk ƒ41ÇWå–z^« UGÄá9œrwaäþ¤Õ‘9[t¹1x9§ŽQ…â‰Ú^¯“…+àø±ºå ƒ%ÿ˜¹¹ì[β×X¶¯|Ù}}o{ß.¢ÍV—Ozô=¤™ÜB¼Á[—¸øJȹխç÷vŸ)8UrÝ÷Ò¼áá°8({¹:¢6³Úîs³¡4·Pcìn»"õ%x/T±M- ‹N‰OІj׿f€:¦7ÁÑlÁ=8°2gmÎê•«fìö,J=l1ç[ŒÕ¦úŒê"á2Ô‘3¿Y‹Fr…wH¯ç(©”•žàãËÓÁ§·ž6’¢Â7  G YL céPå“`ÆÒ$úº4)>€ÿÅɲtZT‘¯lZ_d&½o*¦D¾@²²?7úÒ¬O%¢H;Ћ¼¸MŒhÔ‰þ!r¸­ÍŠæ(­ AÔ£u⊫$8 ƒmÊmÉíh‡”è¶¶—n·ã*N“š›ÔNÀl.(ìh¯ò,Ü‚/™OæÂk^'bÔ7?勹 ÏXmn‘–K€É€H¹jO漫˄Tˆþ¶ 9÷FpÐy4ø<šO¬YN¬´^L†W¡Š@H ܵ½„¨[·¡Je&µJ­R‘õˤľº skþѸSSˆ…ÏžŽŸÇÛvãœû^÷ìg¯ƒ¿$Y@úíÌ9o¬{ | úhŽUUo©7”ž·û¾€wVf½)R(áÏ®?>òÁ¥5å© €pÈMÖ¤(wryÛÆ*"°QwàUKq\*¤ÍTEtÔV™[N n䃼®œ««4Œ¥pjE[­.×lJA0†œN±ã´ä†ÿ¹e5_6:Zp¦ôÖ[7…›á0eQæùºîM7âöÚ"‰—_–gú”›³ϹÀ¯·Ëÿ΄¡âœuË·{\´yÁú÷ Nœ¸xä3¸ GƒäL8Þ/–-ù0üOÙ ­¶ ßÁ8´*Ç~ ƒ¾@‡ø,þ¢¸ðpd~¤@”,w»oç´ i&Þͯ4UE‰vüçäY5ôúe4ñ2š+uâ«ÐæG…Ç›~Mé­6½ƒÁtzª¨;¹0Ü¢@£ÉÃOsãÿíè’þ…ëz'žH}¿Áýt(©ShR‹Òj  ò[LÅ{Ñî§?»ðé£ò‡Ç o±ðÈñvCÕy“ŠÈæÿyI܈ÏýÇz‰’­*òãÌ+Ðâü£Ù÷°GS'ÚÃuäÎÌß(S(³5Yš¤I“@DŖ츊™BKwoï¹ štU0‡EYo¼‘õfnb6¦ÐëQÁ8ƒÛn ®U·˜ŠóMu¦f )ÉrÉUnÍœ÷þDËT!ö޵Mx­Ô`,·ìãKÕG__fðvä'(ܲ7ÿxþ‘\(d~yè*–o Üâ-Û‹b¸‹Y]Û™ÿ'|/.ú8¡=˜¨ò¨Xu¸:¶(ì($¯ß•’¦Pi2”št‡Æ©…ŸOU¡Áv!ýNl¬’åçäáBäÍ¡ËÈ»8¯,ßXåfªK+N';ÑèÒåøñn.G•¡Ð¤h³,²%:Žƒ¹¹AW@˜¸¦ØTg÷qàå[Dææ]ÚB„c|΄;0:ì2ç_$ÎBœãñT2)®…þEÐCäl˜:¬ÛÞýÜ£K¡›H:»}‚h2”¨Šäyø8 &:WCÄE:H²s“4)EŠB%*ÄÞ¾Œ½³•‚}n¹IÙå¤|˜ôe<…vs…–R²»Âé¡çz±¡LeJ/ƃ¾LDnÄ÷­èEôòw•Eù&C™>_WOz,ÁÜ\ ÅÃÚ^kÚtÐë#ÿz`¡ ZPR²"þ­"´¸ÈTD[‡Ú†½0tp@ìð!ûÊ-z៹Úd>œ¢þ©–Ù´endstream endobj 470 0 obj << /Filter /FlateDecode /Length 7039 >> stream xœí]Í“7vO®sNrÙTŠÙË67b§ñ ÈåC´–³ÎÚ©²=©J"¥jii4¢Ee’¶¬ÿ>ï=ÝMr†cg)Äi¢ññðð>xüaÖµlÖá¿ðÿ«ÍU7»½úáŠÑÓYøïÕföìúꟿ1ž´®slvýæÊ¿ÂfL¸Vi63Ê´N¨ÙõæêEs=·¢í:©›åaµ¼›wm§¤åÎ5ËùBÞ:+šg7ó~áD§l“5º]¯–O°%ôÂLóÙê5}+ ë\³ ïYfµmv¾™s¼ùÃÛ¤ÕòÇäŸæÜÂ|˜h²w³6q¼N4Ÿ-©=ãªù †öhÖ|Ó†Ù»æþUå¤Å¹cs)lsÈçF}Jì©ùÌ£¹ÖÜÀ¬’Vš|>ïÂP@œÿB :«\³M'y‡ÍZßÎÿçúß`_¤M÷EXÞJá`o®__5ŒÍ¯¿¿ZHÉf ¡Z«5>† z›æÀá­N‹fu— –ýUºYÙÎíÃ]Ì.Û­M±©H;åXsÀ%.„$x–ù‘¦‰:Å3B®ãB•Ð|™kÞÅ^:UŒ¼»élÎ@¯Ò?«Ÿ<' ™·Zœ[”¢®ªL›É(’j\™ýõ&e÷ü+š/']ðÁK|/«„‚ÏF„ÓF;ÕÚ4ž-S9jÁt“é"ogô„2ñòÀæ:ËÚÙõ— ‰ç¿Ãï3a`[i  ù›šìb¬U#1j Ùe¬ëîÑË]]ÂT£Œr4_Žnµä(«ÍåÞ+ú¾Þ “Úš“½¨8—MmE`—aد½¢wµ^òãç÷²«ë:ÎSÆBy¼ ý”/8ØIu¹®õb€ôêdq”gµµÚÖrXFhÒ’Ã9О-[6eÊ88Ú5Ï“Ç_…Çtêo·»Õ!}iƒßÂñ)ØÆ–…¸ÞVÙ¾{ӉȜTÍ(m:oí¾lHë<¿¾úúÊÝj¶›6¶sbDc›kÕj%gÚXT¹hl7Iº½w†µH䤿  #=r¸OÈTÈj" Øç‰)°ØçÆðûðº’#•DÏAë5õŽpÓ4Þ¿Ê-˜ïü¾À{y»8Žö–Mì÷Û©~_¥†InC\¾‘ªS`çðl#yË/ØJ…ÖŒÉ{ô§F Cß,˜j¥bÁÎùh œC‹¬_7ÙºŠ95[€ÄTÊêL­ææ8úRÌùØ.NËÈ´¡l¹„ó5ÍÏÉIj¥ËÖ©­pø«燱ÌRÉ& ZðN;1Kzq#¬#[õÓàJÂì€á`DÒZ ü7ç`DÓÙÀ½_ûÝŽq]™’kegqJ°V¥:;¨TÓ ¿ø/QSÿ®¤·lu¢u>eUÝÂôgö–`Ë7õý5)ÏàÉä 0–eP¸Í®eœéDTú¬kbl0ö=•˜@žtÆè ¦;û;'»H¦wµie:3“-¼éòÕäÄ!Öa‘€?Wæ Þ¸@݃X–§ßª:*Eƒü2´Œë—ãaŽíϾj>œçVÔŽ¸pp¢D$ü/½Å'Ž9î°ffr‡ÿ<¯z ¬L[8ó@kó9Ž((b`¢ùëúñí¸Ó®˜fi¶é.®äE³Ú g{›:œ‡åj2ðÚ¿ã}T ¬+ö1tvÙ2ö©s/oØÙÕí[ï ƒx(úΔøˆÓr:àª)?éÔµZ_rÓÉ& 1,wËÜQ?Pì„"ˆJßyßR£&Á0ˆ`¹ÉÈËšÄ 2Ùy¡žýê0èÇ»,Ñ[­ƒYö$Æmsüs§m9Œs‚iìÀSâ0 ¼Ö,O {…¼ ZÏ Š‚Ò¡bÌðïÛ»÷D6 UJ9$#sóeó§›ÝÝÍÚïX'¹´^= mcyóúæn¿Ê" sAÁ1A`h„²æVöÈþ&ƒ†9’`o¾š|Y‹¨‚j­ìCvŸÇØÅv‡–¦¦Ó·ôÑÍh&ÜxÙ³›3´?Ê]Y®ëS—xM?Ö}t.1P•D)-…§¦9æï³àqn´Š…€Šoׄ1‘|Î!,d³¨ˆ?C 'Áq4/dú8šßâ>ü§ÀúßÞå[š@fNÀÆV)„r6†NG^€Y £zoîM]>ª4]U÷h4‹FxÑ|2ï“¢FÍSü¨(¾ú´xê?~24ØÄás #ÐËæ¶Å€]¿ç£hžÓRþáfÁ @§Ãfù&‚ð«RÝHØVÅþ¤¿Êé^d×úÙÑ$¹ŒìϦÈÞiY=~ÁLHÞZ &aböŒ·€JV~¦÷O¬¦äA ƒF’³l|ž’W-‘ •|gÎ6Î~¬GÄ2C±ÜJls‰²Áœ…e\ ÛG¾(pßöW¨^fÀ•û×+XÈ@1ÃP\kÅlsÅ­Ë™÷OÖWßN§ëQ Q èSØïêÞ½­Ð“ÁÖ n½©ìÖ9 ~‡"•’—š?Tz4gÞ{<…!‰»Ù‰¬Ç¿­²’вÓÄJÑ‘z(+Å6ÀJÚ1;ˆLßX —-³2q ·k¡Z8P°<Œ_aÔˆ÷ŸA΀9^óáK2SÑ>à ‹;žú#W‹ó(Í?­-¬Žç”ÃT¸? 1xOû"ãø>síZ!Á,‡iä©ãšMØÈòžÞ^! G Vm¸wUÞWº±Fü5œÂ<2Ü»Õ÷ÕÙ'¡Ðð‹š Çð#qboNêKP:ã‰ÁnYot'çaÂd*;5Ÿ>0 *L÷~}UâçóþS…Í`‹ìˆlüþY­'PÙ-do†Ì„mé,±M¾¿šØ×íNØšÁ&™ G¥d"€¥Ð˜î¾@KàròטœäoMüÂÔ,8'ÅoNd`V +F¡ŸËùÇ:• ñê"ÙŽOªV3ȤĻn¬?-Ô4`+.¡Ñ+ÛÓñ‚É €(1s*Cp°Y?—)O¼e<ÜÇHW ÞçÆµ>Ûé³ëŽ£›Z xFG5µÑƒ÷´öïb4õ!n* ˜Ê²¸9”fx^$“³,þ“ªêfh¬EêN²d<-GXRŽá,{c ¦'C~¡2{{*K×|È ЕïV³"Ïž£kô–`¢C¿ïT‹1 B(J˜Ia=ŸôS,߀Á‡ƒµ…p„€A‚á8ž¤,,oÁ$Ã3²¦ñŽ O§îYwv¤ŠÎNÀVó‰Ä[ôD–°o¹@ŸÁùŠvÒü¤dèØü,%"kbÄÁ_Wr0ÑE¹d/SÊÆgK´kBª ˜µÉCPÇöMXþˆ›æ@a4 k¸(%Ò2Oî#œŽ2xÑõ-g_ä* ºÖ 's[aÌU}Ø7å*]ç*à6ÏU˜r|×zp´Ád[&çª%ê#ÃY÷s¸ßð< ¨Œó‘à{™LëÁÁï3ìwïŸU[*ÌZ˜Þm_mÞ'ã­câ!߇U0‘o„ý:üÓœ{d"øÖLl5Z‰Ìu¦”èËÇYnV?S–>4·ëýHûÙ½Ùõ®/ÀM§8ëõhÂa%çk§4?ì×+Ô(mNÝz,¡_µšìn³CUÃraøz^Û\’Ðhº$еf¿ÜÜ|÷¡ ´ ©ÇdÎ*p.ð`úø‰×(¦í!L¢ktmE³ÏCáø…¢(ìTmþ®'šÚ×ßüÇó*s‚äd_Fþò[qÑbZ|¿I‘‰žÚL¼í!ryÞ–ïzüW!pj2đџöiË×xãôŒ8N×’ÛŸ¼tÄáÑùø£Hñãñ‘bSB瀒¢ÇËõº:!¡[98Vñ€/ðJ¤–}Èð^Ȩ^åìQWz:RzN/Óà(›Ã9-mô[¾ÚX’; µ$”B7…$JøKËš=;BE÷ö¬?t¤;áu'åˆù¨ÛÎ3ŸŸ–»§Å™)#ÊìC·l„‹ó#È Ã0‚¤±…´\íí\°aÊè^£‘¼P\‘±øiø4ÿü_¾üöyÕÛ°’è׳ñ¦¥Ó‡¸BD²yK|à†<…™A•sLëi§¼µ.”£YÞk£ÇQ¶˜´M¿Ñ–4IŽkÎSÊ›‘nÿ°„ñî[BžÕrZIÓ×bÌ šð{~¾†ñ°hÜERî4w'§µÐa™óM?12}.VI.0,#u~ƒ8¨g…s–ìl¼dƒJàá·gÀú‹'@ê…¤ÀPލ_¦9tLîcþöâ¹¥K¥tåšpv¤h#gRbß>Påc.—"Øtk@ˆ'ý¾h8³ïÙwÉ´1ã~ZÖýË9®Ö Â_^§–®HSkVñ¯KKù'(£ÀÃzw*Ät×aF J/¦»¹Ï¼¸Ûª È,%¹zQyؾz»úŽ/É3HÄ%‰5ié &Mz+ñI˜µ+¯,¤àõ23Þoü"ÛÔ—§Îî8×±©°Í”‡ì¯Ý&#ÊÊ/•ôŒ~ äßíÊÛX‚ð¨MÝÑ®ŽAµô ·JÖxÕk&B"2{!(\Ÿ´¿€ æJ† òDpA“©2ÓË…M˜l®¨½i"·U]F×j5À˜¾9¥?QlŽbG6‡b'øYT"4Ä6¨ò"€çãûj0†ø,ƒ8uöwÛx£Á6wçðŒK‚0e” 0(‚™D0N”sÏòpPõ¦a±Ç„|'âfÝ€ éŠ!m†®ÚKT çBél®¢J8hY™ô šä"P¿°­?#ëËùÓùB£ÕªþóÕn@I©=HãÜÛy8.¸Ær{Ù'šÿ®$.M«5†›ÿ¯ÑU`2ó²)4újâ#Ö_ÞÁ `âÈjmË9†\O¯vÈø<ÌD“¯-÷H:»šÍÆS‚3'ȃ08èh—-}uР¿ r– J7gtÙL¤ç/òÕäÞçêÌjØé,ÁS%#xꦗÎÙT¼©4FÁQÙ­–‡±¡U¤NoçØw7éŒm7ˆ¡ç¤ëWŠð1ùet7l>rÞðp—¡#0Õ #}úJ)».Ñk§ôŽ¢¸&*‡aþ×á9˜ò™¥kî?NÙŸtGXÁ ¼á~O£efÛ.ƒ/¿K]ÒUÔÚ«aøÃ‘¦Eò)&·…·»yM¨ Ävè(Œj¨¼¸ £7#[üÂ's†` ±„ØA‚ÍûÉvR°éVËþ^äŽÅjóX+>G’#¾çÑ&ŽÂ9Rg3§H/Ùô Ùä Îtú1‘lïk’»ÖˆÎýR¼n¾墳ˆe³á¢‡_7Uyg\Šã1}Là/X')Å7é25Epc°©\!Õ†Tž"1Û§yz1°¿UÓE¸©ÆÎC=;O!ï8â1@œ“È»‘ÁF)¬âpöä(³ª?¤24:”Z}¬Ë¥àY¡fÂ"ºÓûqò;Œ'¤iÒ_¸—묜öÐÃW§`È—Ë+¼$ÿ†Ø½„U»+H%ZcœÈ9 t²FÂŒÕ>ò—et_,®RMÁÙó€iý6À‚9ð€ËX›ÝÄA´Øutº…¸èt£T%kÒPïy©=„hƒã}D›E™ýp„6çÑî† m¬„ƒi"¡0G<¶v|²þÉðØ`.tØ'øó¼;…Ç–ÙÍ¿óàØx"½8…‡1Üä÷ O±cÃ)¥ ´!¶ÁlîY2aZ'@R ˆ-ïu¡±Áb!4¶ös™Dc£ßLg”d×ç±½2B8¶×µ¦àØCJqŽ ’ç,86BQï5׎-Ît_O£±¹/“”ì…žc÷^è)06ëÁ}ÿÆþ•ÀØ‘¦ÐØÒ˜œš [€™ÒCâWrØhu=XüâeXT ~ÊyŽÚï”ø†c{x6ûiÍ  D<‡ƒ®oÁ#`~XŽ‚ eÞV\ŠˆK­œŠ:䕹0yÏ)ƯGî^ꤤ4E»q "4‡mQzt=•R›ìö‡çqEû03½§©nM­xIœ•aU”\è/¿îü=bš«YPè %ïì÷«ÛžzGSÜ~>ÅUì}^˜ð§9!D´Š>†ï×õѧ1†y»Y{K,<‹7¯¿¼ºþý 7‘YŽÊ§ÂŠÄ»ô³Zå.Þn(Üæ7ð‰ï ,¯*‘­xµ&õ9Ð[zŸJüÄYMnL=(¢¿’q¿Ð)'Ì›ÞIr&ŠGx[¢”Ìö2£šÿ¢£ìóêPæ JоßAD%»Pb;è¹R>FÌ1N€uGA¾ô3‘€u¬nƒîÓÆ"Ý÷ÿƒn;ÂʺðÊÛ1«#És~îÑãT>†W™š€¦ åS‡#<–tß: ‘é(Üð08&:Žk]Ž:ŠHÏ”¯ÃX‘1`M‹eþF?v£ 2e2ã‚OH=…³`Mɳ{?Ęç±W&ku„º©ps¨Ÿà¡1^FF}'sÎ!m%%g£´ñSŸª¥†Â‹9. ¨ç²Er¸=X¦¥ŸH5az,'é¹JâûA¡AD‚¤ó7U4(Ñ^ŸÒ‹nR×áäm^ët;^T:ÏeÁÓÆ-îB¨ïèu'•"ÝÝÒ07:µ0•I*C†¯÷i«ŽÀ¾rYXEdRŒTfµ: <Œ@8LZ=ø %¹MdKúƒ—#bÆ~úr‚'`ȱ‘¬ Bèf¿îK¼`½S’4v¾ús Üú™{Xì‡À²nJ˜æÄe †øá.…™<Ëİì ë‘ ¹ÌGÓ]Ë,ÏpŸŽhšþ‹Ú8¢›åôüÕ0~ºÊ:å*Ò,“׋‚ÛGA&©2ötå¾›aÖcžSáEh‘õ‹pÎåÙ„7‚½Ó•PlNÑZ®÷ÛøW~‡e•—´Ì€•‰ã‡òСäÊ1‹"g”õ³J¹îUxY•ðÎ}~â ½1Žáôœ]ûÔOïQ²S ´˜g{t J ±œ5ÓûC‰8§=.¶vg \Ö·‘&¼Ùoé®®XË„Zæ¾ve+MŒÕ’pÌ(>u·hºÔ‚¨ԟæGÂ|XêÁà.RYÇÌ‘ÎULÝS]Ô‹™å…šÊ:M]`˜Òcèõ¬2c¹Õx»D‘.ŒD€:͵»vCåuƒ bï“A—º³«­Ô©¬(2ìÎ@¸'Ze§àç"‰”Ö ±½m|=unì”™pC+ÎLú; –çü䆔06Óã»Ô“.ªå.×ý¼Yr‰uÊîˆ@Áà5añvMQ´#ÅÛ?†)¹2Ýûfê¸l˜m¸>˜ÔQG#yŸº)ÁÛÐè‰-€µ¾ªðjö%“P3ð• ¶ÕùZïy£Íj¢Ø_P¼Tì^ºÏÂLeâ:¶ª ÂÏåX¯°B‹ŸŸP˜î8!::-&«œS%4€o¦EGG)^DGj\ô•¨¦e‡ÕGe‡ É‹è"„ líà€o×Á ”|ݪüØÞ˜p‡WS–z|UÛ~—9ªýo |(Mxn5ƣϽOPȾm.i=C+ë Ÿz È¢DÞ¶óMLhn‹±ñDâ%T1CeÜ„öŠC’~hüë2ÜôªÈ!êÙ¨©2›áFaÇK1Ìß/Ë 3zän~¹v6›Ny dè—n‘¸4ˆ6Á¡IüfÐ~ðÄÕÑ î5ýÅ:ÃÙÜ]`¡ËV'1Ï›C¸›‡Œóˆ&ºÀêeélÉF7XÚ%íör]µ„,H ë°¢YœÃÄï(3X'3xÆÏ3ÛŽC*zøáŒÂË}ZáçšD¥¢¦#àé#ê~ 9bE×rr–,H+DŽÀÚà0÷O€ÁkWØ'^¸‘¾üo&Òª¡Äø= ùÁ® ¼OïZ®@™e[“æ8m ޶½W*™‹7ú¹¦Ý,Þê‘—'ëz½hþOŸÔ`IUë«+g¦¾Æ‹÷ée<%°sà ‰. »`0°ò¬=B*Þ·Ú—sÌg—¹=ž^öîˉb_L¼X­†ÆÔ¬¤ò¼34ê-¢ÐN„ËN×úbµ¢¨ÅÙM¯úŸ–¸/<£´… A£3òîbÓoïÿ3|‚>ÞfRn2µ°Ë~®FÍ= ¯›žcö3káç)¨f—UÇԥߙZ¼}Ùµ¼> V :]–Îbf~Ûmº%å ´¤Ú^±TŽ7JÎ/•CSÕ‹öŸåTu‰Ë&Ð[°mi0çp¿ÕæÑ·±•ò‘ïì Ôøæî‘"5Ó·°CŒ·"ü‰»$RLÁÙMú ÊK{§yÕW¢¡Û7qíi4uÊR¯ññÛâ*·ž“¿GåDŠú6®UJÆ£¿ŸJpðAd¿ÕR\ ÿ,¿UŒAßÈ”õu\dï‚m ?…ÒzX½ÀhQÁåŠâ]*o§U¥.ÕY×Éýf°f³ìK…} £²<²B3”lâÇ*„×aµÊæ×€=/¼ëïÂÆàÊp3ènxX¿‘ÎÁä—=¼ëíÍúýËæ·¸y¿­{ŸXþ’÷W"03ÁíÉ?˜=8Të9][VEj½VñI"`9ñcC__ý/Ì0a‚endstream endobj 471 0 obj << /Filter /FlateDecode /Length 4020 >> stream xœ½[ÝoÇO_õÖ¢} "(Ðca^÷ûé ´I ·hÚ&ÐC 9gI–/&E…<õ¯ïÌ~wî––"«E€˜<îíÎÎüfæ7³«¬å †ÿ¥Ï7'lquòã OéŸóÍâϧ'¿ÿÖ xÒzæùâôÅI|…/¸ô­6|aµm½Ô‹ÓÍÉYsºt²eL™¦úîzÉZ¦•Þ7Ýr%¥h½“ÍŸ/—+üÁK¦]C]­ûY¸m¾ì/¯Òræ›>½ç¸3®ÙÅaދ拗ŨîuñåÍR8‡Ë†¼KÆäõ˜l¾ìÂx.tó–Ž Þ|Û&é}ó4¾ª½r(;WÒ5•-Ì©p¦æËø‹Æ Rƒ&²TžWi)PοQƒÞißlK!¯q¸×RÂè«å÷§»(WÚE:Ñ*éÁ6§']žþC8—嘕R|±’ºuÆà°³æË•:ú¶ë~vþ¬ùlÝmž_tŸ=J¿1Ñ|¶yM¾îû«M÷Ù³å÷ImËe@)ÖÃJ§?i~'[þö„ËÌìðééïΚ3þ=N¨`³®a­4Ì)ïò#Œô\3–¶eÞÅ7¯Ólº:—V­áÒ¨üD6ôè™ä³™Â6²h^Ô§eyæüaºñIÍ aïrÜåŸÖ#2¬2²Ù¸=ÜǃçX¿_:„›Íðl†—Å‹— ²€’}·¹L`S:c&¢s¸)T‚iÈh6Í&!Þøæ}Æló|¹B©øy!Å›íór†®¿.V"`¾H³kCݧ7â·«ì½ycñq9QY¬µÚ%ï_o6Ýî}„:5ƒ’­6Ž;k6D@²âöŠ —,cÍãdÜ©IÀ€rz±Opàù3/J2=‹îôlYuDF>½)›í‹Ä®·»M·Þôï¾úúàuÛç?\žQ2ͱÊ/V#tQŽóíæ&Mâu×+®-~žü]jEæÐq†ä­+Î4C(DÇÔø@y-»e˜aâÑà—+aÂnns €à|(b|#x•?¬”äñë-d‡WY˜a“_î‡~Ó —£ä ü¡œ‚€C-¸j¥2"¤0eZnäb 9o“%yÍ®¿x ¾³’ =œ >Ûè:A¥@5¼ÜF]ì|`y©ja5®*$è†ù¸ê!cÂÅû¡ß’X±Æ˜€{·|„ eA ›í~@µtâfÝOQ7”aw™†ÓÀìá³×¢ù”dš"ãã ®4¥C“iÐÅ6† NqÄŸ›õ> *’±Ãs ‰ŸQ¡ÚA Ø—Ëm¦A&¼¢Æ’2{Vs³È’w~TÀrëQç¹5M¿ä 4‡½ KaÐÜ£eÞË‹bý×G4y^’€Ñ´y©ˆKðÒüÓï¿ulzµ,<3-Dæ ð‡ûaht'Ä­bà³&Ž´ŠŽJø1L¾+„Œ"щMkœæ&E_ˆm•Àë` .ž¦Ä ¦¢ŒÓ ÷ãkšŽq Baqù¯NO¾9‰$j«2ÎîûJxˆãväF  B?샅p6¢\xdcŽXlGøÓšH¿‰¯xÏ›þ:}Ê÷¶Ô˜,xk©ÀZààÞ¶Rð䥿NâF¸{È(b[¥­ãyÊ~Ÿ´âüÑ»¿‰)H*ÞT±¾ôŸ þ£=}þ޼O~*í;d*’¶»üÜ%o‰àðT¬A78áEñz?Kã*×Ç6BRÍ*R=® )5ùR6T+q”ý>°Ñ ˜~ÀŒîCÔ8Z®ïgt÷ñgZ¬à¤ QsÜ·®ÝLC2u¥×ô@o–™f¼OË%ædÓÏ’~é¶èI#Ü>MçTòGP‰<>u ?&ЗãÜB¯BªèlóÏXÌK†pÎÚúƒ¨3º;‚ùe–F^B‚Û5 ï ¬‘Ðê`t»ÜŠéö©?N;Ê¥m9¯`Œ}µ †¡¢.?YµY'æübWâü?¥V_OBráû%Z±G( |ÅŒù”zòˆŽIVpfBc&ègá'¸H°íAᡌk¹7ecpõðPdÀ’ÔŠˆP‚…œjŒÐ“ŽÂùyHXö«Âs×›-¥dhC©õSòýcÆ£T#Cöž¡Bƒ´ aTk!;[~˜˜a| Ó•Ó~$&„‡è¦<5VC¨ÌH%è¡.GùJ]~‡Ê'‰«Ûç_ 3†,Œ]!íïÍŠ9ÒGõ ¬˜u×âšû‡¤Å€DkíX\ ÿXFÕ.ôZPßNTô‚#Bb„Pœ`ÌÒî%$e µÚ²XI-[#˲0WµnØ0Õm¡H¿S’Žêv3uç^h»f`!¥wtÕ¾¶ª¬­š,â&a†e«5?[®xŠá£ ågUm 5T9Iàÿ«š2*ªIYKWÝÕWÕZ3WUÓ´ž\eï;£‰$-ŒÚ©é&e±ƒ~PæhÑ׿Yjl ¤¾ïB»Ò"›VwìòM +BƒüÅÌòyß1 lºjm˜ZŽîýS­=9ܘ[û {;JÈP`@NÊç’ä&¶V°ÇØAVÙWê…y&Ÿ Ýú ®ÐJ¶ãðÑFÖôô'˜‰O‚S7ÆEu9bö»šJ ¸â-†ÏÉHY9li #¤¡Vâ1tèâzVÈŽL¡fb<ǰ:IY50wn)ûFÂ!¹Tõî:J‚S myÑFSsMPŽª— ¦G±6ÄÊm–  S Äù='ÜçàÃ\›<ä›í‹™+Pszßê1RWÍÉ„?¶”ºƒ68•⨗J:êýó—Se•gdlë„mÙ9ÄçRV›¥ 4xÈÐSrƒ‡9±1†‘“38r ´výóâé±­–0(Lþ—xjÄMˆ´±œŸ´,uþ´ÉÙí Âåƒã‰ßöcs€WX\œgÉ$’u›&¦…ŒåsÓätzPï"wÇãóyw\‘þEð9v©ÆŽ³t ”®X¬_¬nR÷e¼ë©0¯šGÅte³=[=ºÏ7㥺ýmò1½óAP‰N“>OÞŽ¶áØ'þnïrJ/ô89,ú"^ŠÑ†%p»p•a|nøý:c 3¸d3µƒðñ4”gžu5‹·0NgΤe D3• e÷òè¢Ú•çŸÇ’„qU«D¸çx˵pþ޽ã©jws³[ê-¡ÃÑ(¨éüeõ>ŒCÂéljƒxáÆ uÔ=± ­‡ž4‰¦iG†¶˜ÂH-¸Í¬Í¨†> Qz¹P¦` >g7k}’ÇæX*íjšçqeX' êÝt×¹sÏ\kÌô¢ÇMÙéË™]³1,4=i\u3zî-u³­2߸ÙÕY:xEÌJñK™÷ŒNJ°DoíI{o|ëxÈê<–Pi ¸nSKÝãb Û@Íö]07“x`_å" Š˜,}æ"„–û y—ªB*‡…)-ÂZîó±ö¬2€‚Ë0qKE¹í\kŠ¢uNäc³xÚ=¯ÿ,$9*ã燪õñ¡j}GÏÐÆBº 1ÖÚM–!êrMu—^Áupó›ôÍŽânrš|oà]žõÌPQnêm k¸œlß x*ÐWN›—GSWq¬åÖŠ8ÚTò°)°cò«ÚÐôÆgÓˆšð0‹QllM!­P\ÆÛHÿÔ†„PÐP{¦&n¦¸ª–’aî É{—ûìFM´ÔÓ|ZTJ“ëÒYæn½$¶ôÃÛ?~Áz¡ËÏÕü°4û˶8 þÆ=æØÉá8Iª„»çÒR˜p5%·k†|‹S…s†“?á5k Ü+ÛûIÍ}8v7ÔÅ(œéO +Ý.ð†!ñV›×‚/¾Ä-ÿ€t!Tݲæ.Ly·ûe!X§þ°S-îÕQÕ­ÕvTÒ¸ ‘·c+¡#ìBû;„Ø…Ç]9ðÉ­»È™ô8ÂÇ2«IÙì·¹’6³ÖØøg e{r ïÚÆZ åaZ¿«í/ªw¤Ÿ´Åñ”Cȹw쾩ߚ÷Ælô¨ ×`^ V‚=¤®")MrIÉHù!0axdlyà“ʌܶ‚¡8¢5Î;Ò7 ´Âu [®ˆ„¹MÐÔw)’8.k胑® pÅÁo^Ur­j ‘ƒDÕÉP>Œ5Ï€]ÜÏ_kðÔ­ÑœOÎì”ö„æ>8G<³UCÉRŽSÞ™í“:£pèY °J¤p¥Õˆ³Wy)˜ÐHàZtÜþÕÏeqöÃÈ_ ɇ@uoMÒz ó’W·Úœ­Ö]F—n”Tõíx­[MZÜ•ëÓ‡K\xØo8²W î y%ÿÈPãý;)õÇŽæü16„ÂÍn¨êúñb¸n®Èñæ®+êêË£Ý|KÜpÊaòÍíú ñj£è®G"iæJo÷CyÛÊÊÉ ÷›©&H[ám‚]¶ÀîSý/…ÜO±[L4ºz5¥ü2ÞËÃ[2ïóë.ÜJ Üʽ¼rdÌÆš½¦U™ÅH[œ¤„Þ­T“Ö2EÇÕv÷>ÿå‘% 饧¿ÀÚÖÓ"ÏÜîÕC=.„˜¤ªãc.BòRüù­q§ùW¦hƽ¾½¸;Üý¿5|q€Nu÷ð–°G¸bê ÌI©€„ZQ@Õ’Ço¼¾cˆÏ#‡øÌºAEsûV™v•k”ýöªóPv·ã-oNþ aåÿ§endstream endobj 472 0 obj << /Filter /FlateDecode /Length 4225 >> stream xœ½[Ksܸ¾ëœcS{âl< ñœ8Ukg“8eWj³ªÚJY9ÐÒXæzF#é]{}º9’íQ¥|0‡Ä£ßýuz¿hj¶hð_øÿr{Ö,®ÏÞŸ1z»ÿ]nOÏÏþøoiáMíÇçoÎü¶°la”©P‹óíYÅõòüglx6XóÚY ίÎ^UÛîã°[®¸­¦]µÛôË•0ÄÉêͲ©% kàÃ>¼·¦z s>,W°¦2VÊj¿duÓ˜ÆVk$ë^¾LV½JZãÄFYfµ­`·ÿžÿ’ Æ`=Å‘ÆU$r%Tmµö¤êšÕË•j`zë×›õåÐÝ\ÖFÂhW oq£à»ªn–´ŠW¶K2]½†ïðÖU­÷q¬¬voÂ"ZW—»í-ü ÎT»›õÍ8{艬ð@v¦Îj΀Øgçß¾ªþ95R‹jÈøÞo»ZKZî\~xCR«ÀP2hïMM¬¡`%Pô!™·]Fq—Ì@³(l'`cP“_V@†iͫ˔0b'+ £nŽéÍS œ@™xQ˜\ «™ÞʪwÞ «…Œ³hˆ]É3U?t›M öhÃÆ«- 3ñŠ­à²›îÝè왋oºTþÁÖ\ÃÂ#xš¬#`}Ü(Èqç\¥ýàÇa¸èIuÕ3Pwø“é{” Ûüe©Ð“¸®Úw夵¹-õ «æ™’ Bbsq‡Ssa$ ‰ã´ ¨K¨0G/@.¦¡)Djœ7­µÐ,1b5>bÙyý2ì u—Nn'ò Â^–ô²Û’Ý®‹jÁ=v}xM‡Ä**uaorHºµ„‹ç€©°Wõ~JuWQˆS3ªé¢aÃüJŸψ u¿“‘a‹$›k7á§_îC5†‘)W}7Ò«çŸÉ pÕ³}·ZΠÂ! ‘Ua©êº¨¾{þ Ò†Tí’4‘D®¯ ¤L³–Ñõ| ýî]#@¶4eœ*™µ„ìô ©€9rül]x'’•¿.»ˆ\(ËG ÙÊÈ"„#Dû´õé0ó‘Ò¨ï|þqTÍ·½ÄxPï’ŒgÖ%è³Q>v‚Q'šÉ˜N²”º–P›fù1s7Š¿˜jcÏ!Tž€3ÚýoEYô•ŠÉônCà‹µcª´!{‚ ò¬ÈÍMˆà ü–íI@0`n´$àÅÌíÛ!ÃsX§bwLèêÙn›Ö“›lÜ‘Y¢znÒnÑi¸£^ q"®K^TÏŸ½@c¤NGk¤é§[£hÀf0°Ja¥·Æ§]îKù…æ‚G°€‡w8²¤öÈ)g3û•¦–4‡ùöCÙ@&AQߟT¶y“a8mbãI—òý0æošZs–­Ë›¦9ÁüÑ£¤Ì5DT *˜ fÆA•Ñ=?∮”-zYi#«ïúÜÒ½#@+C˜›Cz?HóYH·2àÞ‡µ\&„ !Xß}ÃÝý† X1HW‹Ý]oqwJb!¸aÐò¢ ”šëN”ØÇfŒZñËÐÇMdîú³Ø™M*Žæò>ãTÕún×M-tÙNê£À™Ìz–y÷¤ûý´Q4Vþ¤J&»ÎNûÒ9’kSs˾Ä>7žoeÛ@PDKWeª}Ï…º°"ö\ž¥]±ý~'jÌ!@,‰–s=ZÅkÝX~JÖ5/ž´_­!·JãÚW·¼üyøÄfé½ú’VØÄù­.}»§s@¡žÊdž˜¦:ñž–_[ÎêG¢ï9]¯¢›p\Ї¸‚á 4És¾†Ð[…¦~î©=î¶€-pqT¤Ãz7؆2…n’˜G·6»Ý]­7u¿ÞÌ… çI´ßs£8€¯÷³ÊšØ!ôÏà Õ §I r¦Þ&6r Ë, »PžOFwiÒE¦ÜÌáížæNÃ=í¥'W0špÈ q¥0å€êp pŒ®îê4¦ygÕAwe ÙÆ^Ù…†`™ãÔQjlÉȘEöëÛÑ}Je­•\©è÷˜H‹^í°ü~eË€ãq·Å€ëb|?Ò.a”I‡gO#£×÷1‰®Õ$† 5›4‚\ï_ÙyFð1Ùèš•-°ÛI”óÏñK‰* „xâ?#`ÑxI ¬­õGÌ­ðôƒN•8hÁó8e>pàR˜Õ—oô§qk^¥Ilè#­DÉùðjYânݦ}úâ:ФxBgÏ!íA10—k¸ú¼\#…ççÿ&Ð-ÑÃúQ•ß#2 ÏkپϰÆUXEûS>öL»œ–YT?[ÒʸÈjs† ôð|“ÎÕëÝn¨é¾ÞêS5—ñ†ÅÜ!¼ï Mêd ?ùœÂž–ÐúóÑíÕ;QÚ:6a¿KNvßfqq%ñ²$¸Ð䨎è³ÇXña} åQ,Vä ^CL¯ùŒW=·maÃÔFL4ãÙÅÝÈ83ñUT_è¿O”…G®ˆáŽM[c[ö ÁÝäGº‹@dÜÖ‡·¾ÛŽw0æŽ aT~ˆÚmœÍ24æe€d°™Éúà4©¯Aznd¶WÖÕ¥ñ&‹ÅŒqºä5Å…bN‘Žϵ‚$œ(øžÿu¸›ât Æ=)âùg]ÈD'¶²asÉÄB6x®é|Sò”sldCy™.ÒXEõ·%³¡Ï@mkšç´¬`úØæ—(3¹,àT|ÛI´áè10$‹N›pIO-#ÇFÐBnUXËóȽé’~hÀå¸ÓþÚ/G”G/QÌ«ìÏB¼²æêÓ¾îhßës—S›%ñ™ôD²g«\¾½ÌLR>mÅÒ}%‡úDIs_ yÀÐÝåI€àÖ&A2<ÜúŽôGô’WËÓŒyb׿Pðš…°MÍð8Øigí`1L×{•§½,œå˜e(Q±—¦Î  bÎ&tÇ/태î¼.£°èõb*yx}òÍø°’­r0•ß¾î$mòë4[»©Ù[ºÒ>½çèÀG¹ì&¥Pf3`ƌԔ§Ù‹Ü¢!–;GÍÃ펮hãŸ`ÀþY4# ‰Ã\KÿH}Ãq¤‚6†6ÇÆìB•,¿ kǵ8aÆëY>ž”Ý2eøWÆÆµ4 x)Ç*,Õ1•¦ÎÇ&@ªÞŽÇêE¸Èªm¼ ˆ/â—Íß¶ïÖøÕS5õ(îF»÷a<”DOâÊ"•P¯fhïךõÕPz/£% º8Pÿ(’@NÖÈKb壥ëÛ¾Û ä‰Ÿ“‘d1œ™áÅ È»ù°}Ù…Ž…×q$ú'‚¸›ãòË—Ñ£6¿x®°47tšòLİÝä%Éâð(bú©»¹YÌž-a] áŒânµ²3µê`ix#×Õ‚¯,¼bš:zÙ+éjåØÒ?AH—S£zšïŸ¨…nÒ½0– mÓ…¡â…l•íÅD:g{‰9}=#֘¿gôÛ¹ÚÛIðôb;‡„ùv€Øt;Üãù³÷rÕ¨œ# ÉTçYž˜ÛâÅî!Ðh: #+':R|¢#¼oë¨dFG§dËÎÖ0¸Ç³ÿYb‹X¼ŒMÉ5O×§\ cxD lºéÃÜ­e®f93x1ì”+> KLçrùø{«Ôn ®A(­²î‹ÿ;°€,=¾0Çû`›²R˜6ÀñO@ Ê´O™À‹qÓ¹}NÐþ"$òÎ ¨( ³TõÁr~8û™ü endstream endobj 473 0 obj << /Filter /FlateDecode /Length 5990 >> stream xœå][ÛÈr~ŸÇ$/ ÆOTb1}¿ìÆrr¼‹vNâ v {Æcz¥‘W”oÿ>UÕÝd7IÍ}¼^/ü`©TlvW×å«"»æ—Š5¼bø/þÿjsγ£_Ž8Q«øß«MõÇã£z¦PÏ<¯Ž_…Kxåxeµm¼ÔÕñæ¨6‹ã·ÀkEÁ ZûñÉÑózÓ~ÚoKáƯ·ën±”R4Þ«úõ‚5LKËü°‹tgë§pÍ{úM{å\½;Åß|¯ŸâXÆR²>Y,á®FHQŸ·‡Ë…­áÿwü“,ã´–R7Θ0¹…É s[¯Îñ³l¼–0Üïî%Ó®þ´Ú¼Ë&ºŽ?:ÂEÆÃjxýq‹dÊàå4ªæõ«|¤í9£œð¾îÚ“lÔbÐ]š•ª÷oJ&¢S¿ÏÈçÙçöÃBk¸R›zµkWûì’óBÚ›Õz¸Ë¦xøy×_ÆQ.ëõç®MBc²Þ¾ŽBSv~ª¶þóú$ñðú‡…í‡5®Ú‚?¨BX~>“õ°AQ¾š®móYÑŽsÙhåEuüäèøž×'™¬Wûh×4çƒbÏw¹}•ÿ²/âÇR°QÃ4h\¯EýC{6–a ÎïññÑ ÔÕÇ=è-üd™k´ ëãh}qÔë'o$ÙpÏëf±TŒ,î8ßÜpZ¤“…Éæ&º^$œ rµ[m¢$ç~‡²%V«Á Å[íÛíy/˜u± Ûݮخî¹/A¯¶¹:äÜÅÁ`êè†è¶ ð¤>ÊYÝ'66×ÊÝv“õf¢DF#,nô’ FÂ]’J:œÍûL!sGLÖú10&Ëë`¼†#úq•_Ýu튤¶dÒ,£¦oÚ°p‡u½+D»k_FYòßIºMÒuø¬TýÓ¡qK³ió}¹½ H  g+ãa,¿µà6[Åóñž£GGÕð^×§»œvdÁ¬A]À8Ÿs…0d‹[kÓÀp:DÇúmˆŸåìtùå>PžÄq©´‡M4mti¹B‚ª¡ÛT&òæ°^äÀm.p|'Uýy1·ÎLcŒŠ«ù»°Ç*¸È2â0°ÏKÞ‘çKvdPt‚É*g|QGpáJN¡¸‹7ü47–i„ÔÜD–‹9ÛÆhíLq;ÒRpƒy£cLé't; væ/Leo”¸½÷¬1ÞÊ|¼ç¸æ%@!p).øn«q~6UlIÍQòzS„»Uæ¬æ•À7Üô€ï¯‘[ïm`«ƒ…AgUb¼EÎK«s•x^b‘“4á¨Aw0OÎSÌe¶idv ¯þ›¨~¦˜¾ºBŒè‚Nˆ•‡›HÏ­·ÕÒÔÎ_hëB:YU¢ÌÂ*1+Fv:ÃBd{ê( äíÃ!èî.¹»^RWÝiÔ0 ¯ô$Î\p6r1‡Üd¸Ío.ΜËmŽ,–äm–À‰b*˜¡ÂÉ#gRbiŠ ¹w0ñƒŽø{°šàa„áJôÿ¢DôƒA¬×Ë®XJ~³v>!áð0…OXΈo^|ÝîGò›Bbõ”®`ÎãV§ÛH?“SéË([bÌ-8¬+ ,S`Do†1¶q~¹ÙÄ­ÞÅEÀ ]±e!T ²Ïpú®¸öa’¬©»÷…‘&÷&r²^uÞ\ˆ¶À¤Êô3a®l’¢[ed½.`TUf³F·)ZßE@hˆÌ@R#… ;fEí¥Ð4Dr$LSxáàúÈÉÕÏV9ü©Oºž‹ZÀ~/2ví„÷ÂÚrâ!Òøð‡íTðñçÕù 3kf7dä¹Öàíò~6˜Âˆ£ÍÃ( ð/«E*2в-©ýjÝm‹­#Ê5<ø2`7ªH7»‰õâ•f¦TÅún¨A„L§·ÉýÄnPÌŒpø¾Ý¬Jœ þ?x?˜ªÕ%yž"BØîÓ˜Æ" >©Ðw)3-òš;e>z\‰n/ÉÞJKµ7ª±†;Y˜ÍÞ^5€j€yäñt<ê$#ãóúûÅ’ô;‚z üyTç€,8ŠëÞ]Øß2ØK``G@†]z~-íùEÁò‡„`þv®áʸ^šPσ‚òyàâ0¾Ï12 }‡59éïFÔðñûa3ï3m#Œçil‚¨ˆ£¬¹¯*øúqVHxÓ/Iúúl»+ËD›¨¥L¹ù Õö¢ÐBæpé¢õŸ³rœÃãb”S%/Íçm_‚S€û±–6Aà]Îy Ÿw÷»U{ö&dn¬îu&¡íîcH˨Ɨcp†ZÈTÍ,2lF$bº=¸‹Â5Ò|UYíÙ*9žds£*‘BmΚ49&'ùÖíBª¬j1¤Âü…Ð!2=-ú$%î-W§õ ~PdÿEÛärI…{_ß&´:^Ð2N óÁ;Í3³q°[¤šœYÔá|H˜¬XOpùxŒjj‘+âÏT‰½¨“OëFl`3¹ˆ>¦>'[³~ütÎÂã²Fõ©½ œ¿)¾e¥tVJÑÓ‰ xÇejqÈ]á¯|¢òSÔê!“Ÿ}jÂDxj2Ê]GQ„5Ʊޡ§]éþ[|b‚¥ª“ù™¿& nGWJsVJúeÁDjÞpÈÒóL­Gµ}©?lõ´„èXê‡93^f[—>~ñð••O º6×­³ ÑÉn¶Ý>ÝF„§ø‹šæÄ£ýáD2wɱ:Ë•0¼ÞÇQÁ$²ÊÄ:/—"NœŸÛŸq›i…Ý~›K¢x\Q>‰+Õ?vãì2š`KÈIñFÎ$ý©Ýô•¿÷¥>‡•QY”JúÑ櫓j„´³[Î=©!„€þ Òµ%ˆÝ Ø8æl/”FJª~„d]R¥«ÙuªXr^¤ ¢îoý/”‚²5åôµþç%þ*ý™oyA<íùÙÃô³‚²yy²Š£¸””u£{>p,ïÓgžó¼zQëÀ¦©^ï­80uíÙf5üÚ_Èk `rÎ1â¢Îßo^žî†9¡|Ór@¾A¦Ý£a\?‹ãp¨q¶A¨R‹ÑcM|Šê«ÆÖØAùÓã«›4˃mPj+TÏ iÿÇvM~ñšúo‹‘ñÊUú¨j±œ©‰#¸Åu¬KEå„Gï8ÿ4®÷E¯Ðô°ùPumu0—œÛ+a(™A 4d&vqÕ€ð]»º„ìm’êþªâ ·Ï„—bЯ“мŠ~÷ÃŒüiáF0?…‰Õ¼Yug‹Ù?ýîÒ…!á‡â±I‘ñÍ(hÇ-l4ö#…SLîöcx†ë4Ó„ì¡ÙI¸kl÷‡vâTâ}˜%+Å$^Z¯º"™(ÁÝŠS&PÐ)žg®ÓÐüžtâ >:üÅŒ¡FäjD“o´Š"s㇂«5H6Ìž—˜½îÊâÆ*‰ÀeH$†æØr -VÞÐPD“Q3|㬕>~*Uc¨êå_æ„Ä!dE!½9]¿{Q?ÈûƒùÌ lVŸTK@8ItRm¿j· ç‚j%'â(’©}àA˼b?ŸÊçIì÷“Ù¥÷$ê8&}e`BüÓl;ÐÝ4¥.øèÇýi\ ø‰9ÜÌGjØ|Z «%>tèSð,d¿[o÷!(ó,†žœžwíþó£ãgÿóøajO?5lºG¼Q#òzõ2§Bè@êfÕžÙ=œÃ,ÿHå†hùÄ£Ç-ú‡4‰—§û§§çÃ}è5˜„~@HüúýzÀ§»÷ï(,?ÈVò &#?mÏßïO»1äSþ*)\‡9—¼T<¬oHÐr¬ÐV\y‡ßw§ÕÿVçG¶Ñ f\}„„VS½…ðG¸Ø+È;àbH‚-¯6°NËf+ žBOµ>âZÙ”ôø‹BŠ…D²V¢8ÏXÃ} x¤@ªmmr Ì´?§(˜²ä9Å0 ‰LN±9e”Ÿ`ù¿9| Epspø?¨ïÿË–Õ¼ÁhÙq‘If›þ6‰‚·™rõåe#DàŠÂȸ%ãJâÈî˜(9WHÆ•(9×h®Ùì3®‹2|ÎMåP!@2yŠ/A ”®$£°ý!Å éÚ‹\…¢¼1¦6‰Êk‡t–³AC{½4æ„b‰é<–̃ð&LÌkø¿ç,’ANÃ3žD(˜Bå*cŠ„‚)N``ÊftE‘¡¸–œØ¡YÐ?­i}Ù’3ÍKîdƒ_•.¿ö¿â7©gÄvМ/œ¤®8§G–žrÛ&+…NÌÄ÷\þü²Ã$‹3ÕÓ“êO«ýªz²=[>i>]·o¶Û“Þ5«Çú/øh‚bM|nýï[,p<“^ä‹{Ia‹elß Öèiñn Ž×á›—ÙmIhë’~áî2[¿Xãg%#ÁRA£KÉ '¯¢¯ÀoW?Ðô<$ÃÑoW½»ž—g f$ðã Ž!ë`àÐKñH˜‡áKI²1š©þSe}ÕnÞ›Iédeþ@y0 © o6åê)™×H ^Iå\‰’syÁ›ÜM%BÆ£8XžÉ½TOɹQø5ãJ”œ Àúœ+Qr®Ñª39d\×ô‰øÞ1ܬô‰Á|=¾÷Rëì³É>Ûì³Ë>{ülñþ2s˜Ÿ)ê,GàEpî>nâ˜G€VCÏ™<¸&¸.cŠ”Œ 2EÙ(™1%JΤ•h¬É™"%gŠÓ̘²‰_×­JÀE‚b/â ÄŽe0žK -)~ƒ´¾‰øMÐ7Ypª‘GIr¼3ü œÊefDÏ%„C0O¯:+ôÔ<:’ˆð„q¹JsŒþ&qõfWŽe­‚ÅéÄeÁ8=áÒ¼—ì¹’q–7Ä[é"“ôݨ1LÔ½Päêm¸ä2X3醬`†?¹#LJïïØ[z9ÄŽð2ri@2j*T­0zôcõþ`tG˜ˆîèXfÖØ(z¸`ÌHÔ åF‰êl2ܪO. 2“´Ÿ2 …Ê}5 ,NcÍãN)Ö^ð%©4F`dö_¯JüŒb1wÊÜ)%Xl ÜëÎNb¼¿u×_-¸˜8ø=<ôq§z# ‚„ôÙ~q øo ~\⛑ò«¤‡ÓHu¿Ç5%«R™ß”¢xc!é O"]™bB`ˆ‹6¤Ü7¥`Âf>€›/M ¡  .WÜÁb6 ® 0›æ7¦(ÆÅ"‡¯¾È+S°Ò‰.š tÕ7§Äm•k¤»2/HAX„z|ž‚¯í ˜³1‹6HA_‘Ѭs´ t›˜‡c‚dç @(ÅècŠà²%¤°Æð;¥€'Óˆ@)°(að 6RXÜã/J¤£ sᛇ÷K0™‰Òø•) ßÍCЉÃ×G±U ˆo‰âB0ÿß¼@cmH(”þ(YªäøW@±fxJ`¾e ä‚ ×ß ExtÄC™è÷DÁGâ7F)Ë ÷J1 _ûBH2/!`ß|! À%)®KŸî—‰ ÐÅXü”SÞrq1Å ¡Å®;+›|àŸŽXvðOÏbҚ׿†Šó¨ ¹¾"%®î«Y·¥¤×5)¡xu”²$|—'ïék¬` çî(¡:õkQBå‰(Ž•”ìÑ@¨Ý%Ö´D²oJ U.¢È«SBM‹(þ6”P˜£~yJÿÆEÓ¹B¬iionCé«\†©ëPbMËp‹oÍÜœ«\ˆŒ¼2%Ö½ ØŠRó”T ³Œ…Š{_ ³gÂõ§%ovŠ>ž’«|í:tDµ£“hOfN‚+|Á¢ÞÓ6+êP2>ËH-Œèõ…Ó³ÅyÁâ—‹ÙÑ©gå³³Ó¶^oÏ–ëög:ÛÊÆg סç—rª~3ì}ê¦,x¥lØiA­±—É…GľO'°Eý¬oYb¢4[Ÿv;Ãã•öR]“Ø3æÇòª1_q,)+šâܦ}0žJ22ï9vÊRØìÜOU3qÔcnÎý‹»qS‹§.Xê€UÜ»èæSëû÷smÇðHŸd½¿zBw¥^!ñÌ“äYs4Û(jxVôh›mЫ£…-z´õ=âœ:Ø#®þÃlCVe­T•‚»ópÎj+ïÝ&ᇡö3CQLrÉ7¤áåÔ%`SÁ}µ,îw Å0Ø›+» ¡–cÌ~9=áŸÚ{qzd/“~;kŠnKz0Ûµ´Ím:µJ|˜$P¨ðÌ»vé|8â_([° 6ç“ö”4¬ulÄá«<6¾ßžZŒWÅôY!?vO–~@üKè4,d¶wèaËÁ£‰L$ËÙhÈÁ†f|Wèm˜†µHTÔR,kا0Oô<Ò2O;÷ÈöÂÆäƒ:a‡Ž Sw Ú âRc¸ñJ K²£^xŠ)êoGaz,C­6F—:«ag@HÑÑû«¶&o§ªzÞçmic3ÉrñYO»óŸ³»ñœA’6ìò’Ú þËl?Åëv³ì{`_·›eýý¼KUÏ=…%ýen¬%f¿šë¤Ü—´·¾¬ æÁþÖÓ6˜©¿õåm0EoW³}0±ªe©­èìý|cr“Çt ÿ¥k†»ÝuÿKÌ'xoÚñ¯jHr’…:§>¹’zS¢ò"v·`™Ú© Üý²Oc>ÓÅ3nRQ’5úˆ˜ëüŸÒPÖþS3reb7V6x’œ•uq»i£Òd1Ëœ÷¯fÿ‚€4ŠÍ7«ÐÔ\–I<þ ›Éwyó¹Ì_• ¸M® ÿ4ƶLÝsé4¡¼ƒ¨wZÞAl!F±“ÿö}ÇÑ×âIŽ^æb,5ÜDº ÆÈú‡Ù¸Å0ûì5~Ò”Rj€ãe‹dª2ð<“h»wYª¹M—¶ª¦\ŽKLÖ%ªlè÷9ŒyæŸw²K½Þü(4ÔòÉqˆqØ"/;Ûûÿƒço;endstream endobj 474 0 obj << /Filter /FlateDecode /Length 5533 >> stream xœ­\KoIrö™Gcí“a4öââB][ùÎ{ð3Þ1<0ְĶDRdÍt³5Ý­‘fþíŽGfuFV5E‰‚ª®ÊGddäÏäO«®U«ÿ¥ÿ¯·Ýêîâ§ EoWé¿ëíê÷//~ûß6›¶ïzµzùæ‚»¨UT«àBÛ·z¹½hâåË mТ-4pš¿¼¹xÕlÇÇÝåZǶS¾ov›ÃåÚÝö½mÞ\vmçLP|ا÷14ßCŸwôÍõ6Æf‹ß,ün¾Ç±ŒeMss¹†Y½6º¹…Ö=tס þüò?f+X'²ÖƵÑ{&îå=Íb£î{c­½j;k›k¹s½é\lÞmŽoiúÞÁœ»ñá—TlŽ©o§šámÑþm±Âýn¸¾Ôè„¥ßc ÎõÍxÈûlC9×M¢v%sÁ)ä‚QðÜ™Ç9çKnG!:i¥ 8:¥§F‰FUr7HÉÍDšf+›JšäÐËÌRѶÆéÄ­ý·\«µË¼z3k_4O_ZFßFëûŒ4ÿŠŠ²ÓpþØýµÈàู$¯¦Þ¼c|txöaê1RÙ^Fæ.xéÙĹ‚SxÉrAu–¨B tE=§P·ž‡2áÇ}¦@Ÿï°ëÃk»ŽºæÇî †üè‡ã …ñˆvâºÊpi/#pœï‰yÖZ0„vl º½O- Û}:b/?3-¸Fž:<æ!pãì‰p) ‡XR JW.{©uÊø˜²›VºȲW6¹üDFÄíò“iÇ M“†@žJ’EÃãßàUà¿A^êa—"‚Æè~·ý.1àZÀ+ß ¸Bç\ Še`¾5ÑMžÿ-J8œ}0êƒú™íBëc_R‰ xÏÏ[½Ut®Ä¸à¬ÙbäOð28ÉOrÕ"Ù9$:&m­ýØLíà„Œ9 â‚¿§qÞÒýjþо¿Ñã Ú¾Œ3MáŒ3xöþÏ"|åŽscÆxK–%Y™øì¤fá4¸B÷©…5dªÑ3ºd²ü|‰A¶q#Bx0°iä¼&[ˆƒô=4 ÷Ü”·çtßÝ"3µ6­É‘¬æþvóöªùõÄÌ__].ñ³-Ì<á:çä8D¹å¼@{ùÑ='¿7Erd84©[“ü¹ˆ@n‚!nD|d5<ÀÔD`Ú8mQA¸æääc¡'‰Ââ*Ÿ%k-C€š€Þ$Š]Á•±Ë4•(™l=çe¼pÉ9fd:@f]Çîy£‰”NèÝÌjB ;0…Oœ9’r#({ÀXvŠ+ æ‹äsâˆaS‰fquh“ç±§;5¨· ŒOQÚþåP.ï§4Y“·£‘wèõkrÃ÷„¾«ÎGj’îáFY÷Ì  ñ1ä0êb4¶6:•ƒ¤}·uw­S:GIA/ERmkÀÞ~ú8¯æ¹‹îxå"-¢\’¤ñµºgjO ¿öÙâýO‰ÂÞI‘:¼çˆ¯#yS•JÞ¹!?ji=Á‚j/çKGŸä  tp"Çý©t êÈ êõœ•”ºYHX`CиŒâ ¹oX´¹˜]µïú!TS™~ ðEoèúþ˜~¡7äKy'LúÜÆž7`¹Á\,è}R±/-º¡^õ°) Ô3ÞNÌÖ?•cëÞOá`Aþ&7¯^Äi&‹ÝKGâ”Ý“}qb²¯NA*Bù0w¾b†º,=¹ó)&˜B$Ú‡ä.h®Û& xÊhNû~F߉wlÑPp ÷-prÏ\C…ýUéb±ØJÏÝ$ÊL`! ÅÒŒðXŽ2ì+/XlɰO°³ZiŽS'4(\¿dBRïSV=‡é÷ Ø’¶ï˜Y㟈,'É~ 2Ýi½Ÿ«ÙHrМ0ŠB&Ãfƒ?4ÅlÅ®ÒRAåoQ3*ü²,VÇ4loæ®;Îà}>Œü~Ñ%®ùÎj;ƒh©£äÉ9—¸pŸ¥n(%?d5Š!Š~i¶ÃþÇ™±KDƒ«ÀÖðtR-e–Œȶ7h”È£Ý}Õ²¿¢þOTAípJm ”—sºo»hJ§4qcrJË8€tJ×¶ó4Š´œÉ9õžM±ÍÏrP8’°s+‡&Xë_ÊAU0ž×bØgú§ ~kb9$:¨x˜¦:‘ ŽÔMjçõüH9”Î:)³j…²š¥00HcƒÎÛ±•Q>éIAM”ô³ ³Ií•]8< @Ï ŸxÕj°076¿4ÜmÆ+2˜þÛ}‘¥J¶ÿùÀŽ,}ݤ÷ΟùñP³l«‘×éªj³]¶ˆ ÊâãÀqÌßvÑßï£ SYÌ׈”qiÌb=¢îZ ÄV•[3 Z"<Ó‚¶/\Ghêg$™Æž#I7µßNU˜'Ï]÷t¼Ÿ›öþ"ZX«Ø@ƒÏnÜg††)¼lËÐ0W|Ù/Ö6ÂJ¿éDÃ>Sûš.¶¾’§xzhã;'½Ã-˜²´e–¢í»2Û¹Bã“=e«2?ᆠ-KD€ûûz*\ü…sßè(Èü«'P÷?g‹wifPP"¡±Kå˜k BÜšÉU“dCÚË£ €oÜÒ‘ÈëÊœ§â L™Q†¨èÇî9+¨2ejún«L„LД¡†³U ó0 -àsVxDnÂ<ó‹ tef¥Í“3#fXpïS¥ ýAðäѤlE:9dž}ìÇ£±ä|Í$'›äPÃJ-c‘ɃÓ ¥ÄF"_ˆFQ¶óK²¡Bà@¦¦­kîÆŸk'£,çà©~wJ:¤`h•ˆ mðXƒ€x€'Ô#ÿ·TZºÖ­µ>†Õs81ÕÎ}KÓZFy¾[E¡ãºW<~Žè!£ÑXÒR¶5+óʆŒŽ5-¯>$5üai0ß‚é™Ã· ºHéúC*ÁÙô½Š@¨‰J»S™+&hÀÌò~õðóß/4lr ž“«í…Žtw?½Ù\üÏY” ˸ Ö„Â1 êoMÀ½}È…¿%5p¾ïôA·wZõ Û:ß?¤üªÇóáÙVÿÌ+Ú:ðøcÏ|ùß$|„`aóºÖX«¬‚^0|°œ®Óžø’@P@:æªã¯ÕÂ@*<Ú¶Ñk%ê ©®U‹‰Ô¾óO$0 /¤UƒýÒóY Œ&ßM¡ýLkµE ©{EN¨¡†oÖäZKÒ¾xà Ç–FÃãA([~·T ž´S}Îê½ùx÷‡²ü¯Qhƒaÿ²4_;‹hÙòW‹<Áâó釥±Ä±Åz†öS•ûW‹ù› VÀÇ™L® …5é$Ä%øùnU¨aôr¹Á;_¤*[Y xI¹y€D<»î9®Õ÷ºb8D-ªz‹¡A(ǪA™¡‡ûsêìÚóUG½Š@åÁÉn–ÀÈc9 }Pª„t¹¸Ø:€µ*~š‹£Q(uºDöñ˜‰©ÎZ„@IÍ>óÒÎïŒÛ©âXÞ¤áFà`nÆ/ó8 ë2½™Í5A6p%¿Á0Lµ¹¥½)÷»ãÊ0š^?bɤÌYÐS§ðÁý«­e%襩ý–ýh‹™ôý<)Ï̼ß;¾(”Ýð©>å¶GŠuÄXFÛ?߀Ä1Û"‹Öù¾S—âë‹÷"èð6ÑîMňÒ]çûDÕó¬/­·ûˆ7tjVÞ}À¼wX á=®ç•ðÇY6ŠŠ]5§‰zŠ;-ŨY˜…º/áHw ª I³ëkÁtSM #,8“‹r¸ÛŽ]"|ë說ý$ ñ…¦Ä¡:eýÉ ¯þÜæ ë5¯Ô`¦Øò"já¦ñ9- 3˜úTãŽc.•Îã2‚Ïl©éÌlÉØ’2á¹¾¯®º”×R‡ýP Ë*›å«l olœ.¡ýí"(+Ýi­.wEhPÙüÒk*¯ ÚÒZÛ9*Ë’•Ìu<ê°K¨‡ÓUc³XS¼PêYä\ ‘ÜQ÷R(Ôð5 ÑY$Ê«ëKTžG:0³nl®'F¶ñí®È×64¢‚¯Š?ôÖ«Ò‘íŒV´N÷nèÓÜ¡9lÝû «Ž[ù(ŽÒpÊÌ ”çÞëÀW +ãÀ¿ ψ¢Í.¢ƒžÔ?Ý~­ù¼È Ñxc®$ò‹ XÊZ1îs#ƒË(ÉOr¯c|Ò]±¡>:$uÑÛî0 ˜‘]d³}é2À·KRÏ zËÒzâ˜2\§ÏC¾¤ª›b‰âšhÓ£{~áE®3 –ëL eS¿‚V f‚F¾cãA§œ¹B®Œ«]g ¾~4fcÛðTøîÁ«àû|Œ7½vñüÄ;3!’µü¤‘¤'Afb6»Ó.ãOü3sNå¸sàIäÓûzÔq/3˜•ÖaÊÌg\ÌHi“5úŒ0ke°G‹á:´êPäѤ&Ý[”›UO¦ÏÁÿÔ#÷<Ÿk¾ïê?Ø!]Ϫ\å}™ç„© ¬RçQõçìÕ!ou}×èIüÍSÇÒýº> iÂ2μ|ìÖ ™.`B5NqûmumSˆÛp<1#êÀð©ä\ÀéoŸ,ý Í ¼àÏ¿ªôBQ×¶\u*k"¥ÓÁÉÚg>¢f‰Žg*pцɎý*p½Ytlk Ça&KH,ên·Lž ½¨A¼+>-…Í{Õª>>N=fâØ`ß—J.+¹Õ˜)I6(?Ï\Ü8o?O´µY8Q8_§‚Ì<9þ=¡YE²>%Ȝÿ]QÑb°²”r…ƒ¾§²ßyŠƸìB¥ŒÅˆ> stream xœµ[K#Éq†¯}4䓃Ǣm–óýXC— ¯ A¬œiÎliÈf/ÉÕLû×;"2³*£*ÙݳӞ94Y•ÈÈx|ñàO+ÑË•Àÿùï»ÃX}¸ùéFÒÓUþóî°úööæ?þd<飈ruûþ&M‘« WÞú>j»º=ÜtR¬oÿƒ½bƒêc00áöîæMw>_Žë ½.vÇýy½Ñ†DÓ½_‹^Xí¥€§ü<øî{˜óózkZŒéNkÙ áEèv8Èô~_­zW-´Ã‰Â\è`·ÿ¹ý/ ÑúšÆM!r£mœK¤^~Ü]¶z½‘ ²ÃMá߈õÆ*‹DtðJ %D|fà Ÿio´v8ÙDxÖ©>D£änã‘ uoMT«Ûÿ¾¹ý×¼—yÁ^R ”eŒ©ÉDÉÄHëÞ¦5¥ë‰'ßÝÞüñ&!5»:})BSÀmmãÊxÕ A˜ö¦û–²–ƒ-mAH¶^Ðð²¾€¸ÝqW²øÛ}µ@_Óü¥Ä‚{·&kb»:Ä”_ÇíBo„aë*!â¶Zú‹×Œ¶wÞqÆþ°.ª³œ DtÛüî‡ÄzðÝNyÆz.yÛýð¿õÈ-Y¦´Œ±Ýñ=~=4 í"cÉÀWÁ›Øh°äHçfÄ›xçKÖãèQ,ñ¸¦ [phgPÔ™i˜ð¶‰J¯³‰’H¿î¾[O‚þ}^,*Óï´ÐßrÇ*x 5°½ò Yy4Y ާ«Fú ¦ß>Ûî·Œ-µBÿ=Yà»=6†Šäηõ}ß峂Uþó:`ô¡õ|ÄéøHü\h>Ö„mp@¥ž‚-žKÇ/”}`ÈTÍÌWQSô Q*¶.¨©ÿ -µ ý^sJ×=.¸Œ†¯6#ò»#‘@m¢°Ó6«¹ R¿K_„í†ÃC5jÏ®å0³¶Å¼/ýn Ê=ÜsчÃñ€Ú»ÞAÈݨÁùP@ÍnyÎ#zDLó»>Åìˆù$ºCÂ|%}¯%˜ Àc`–GÔ' îqþîûd¡œvQu„›ˆÞŒ7–ô‹#‰uˆõœLq¾‰BJ™â|+ñ$´b~sùù´«&‘ͣπuî'D© $Ø(aãwïw#ðŒ²K#ó’ÃeØUß[ÜQ¢Ö‘Ào ¬S–+°.Ý3³yëÀ"FàÈs—Ÿ{ÝV‘}•±O«i«cÎ eœ†·°.¨¿Š3#u—öžCŽô0X>ø§šìì‹ hNÔUÿë 4„Æ=„æàVg$-¿Æ=IJ®^ï ©þÆ9Kîç÷ï L…îÊm!v>ŸëSÊeÙŽù, ¬hŠôüÅxñ–¿ây•0¤ÒVp“’ŽÅ½9iåáäBöFM²îMÍ- !=Ú¾d þ’,A+XÊ {Ñl€ Ñä  …C6Œó¾WTß© ×7]È ù1&£:³^ˆZÙ[1Ñwk‹ ÷w &ÀÑ ÈqcW#ÓG4 ’(Œ¾Û=¬­@9—ݾÝ_Ö-[ 0(º²¸r„¨ˆü{¦he 4<iÐc9¥Ê®ÃÊ[/òùIj¬›ifš\Tz>yÄ™c”÷s¡¼OVQéb~ÒóaŒˆ³Xî˲#@JbZÇN{'±U˜Q3g›Õ+‰êÛês>«ht¬ý*‹p³RîÚir#ôìË…u è,Foøe ³/y!@Ù´Úp±0º7Vfµù—œôv•Ú€1K*ã%¹ÎdË–*=иª¾áœ<ë3¨^µèÇ0'Âèbê¼ ëp…®TàtalSøòž‘xÀ>eIjâ! Ïãe·$œÙ!§{RôŒÒ1pâ›vÈanzÎTLÿ$éài‹Ó–®]ˆðk1GMˆIäB²é¨þ ']¯s.ë’.y,ü#„ë,g¼ŽûDèì…‚H`›²_í>Áxb&º^¯’€Y&c;ÙÒvØ's'õ6i¡ "n†àõÄüÂ'Šöä¾ÀbpÇß´•ÑÚÞJò@²LHµûEÈT" Ð4°÷ðOÓÀÌÀ†‘¤yULÎ\pM¯ ¸½Ñç™á[hŸ‡ã’;¯j!æè^ܪ˜ùï)£ð›ucy¥z€;q%h“Pµ~ÃRàú€0÷h½V 9£È¥®¿ä R·(‡—p£À>˜¦Ü›´úߦO÷45éòo²á›ÝP¨á#ü•™¿ÿÔ´VÚ©9¿hOUBÔ”¥VžŸZÅ’ b‘ú¬Ý_;ÁÚZ˜ ®ª—H>ŽüØ8žó"ÇàéÙãvJô½oìj{pqB1‰|Ü ƒÓó±Ü2“ Ê%Àà¦t†«Ò ÂÙâ0(m’Èi±ácK$ ËÙ¶ëkÛÊ"ÿÙ²ÑÒ…ÎC~è\ZhA¨J› >5-H ø|BQ.""^àÞôÜfWµÄ5àp”ž–ÅBi•‰ßâ¸YiJÉ{¼œðÄåüCÛ ²C‚1Û\_&ATŸ¤çÓ@¹ ‡9&ŸÂlä ÄŽŸxÖaŒK£ëXøó¶öj³ó¡Jð]ÎD¥a£ý¾l‹ùŒ³ºí˜½z<ç—òeÞôx¡¼> œ*­ëךñ–@0¢öc$IE )_sÞè°Eȹø•V.glbùRÂR® !aIlgcR‰XÃu¿ã$8 J°ò=„SÕ§8æÇp½œeå¹k´i%µˆh›ŽÆ*çgrÕž¹h_nÏÈZN“žP™Ñ°\Õ©ì“z@7ÂNdñdÝ™8´„»ø0Pùµ~½= ûÇü´"sül^(âgÌPñÀ?]Ò<´ÜÒÅJâë!£Xˆ,§ápÉeQ@)CÏÚPKl#Ï•¤÷3“QLµah–D¢gK!“ÀI£ô-K¹2Ë߆eDæ¹ÓŠQë ¼ (JhE)–B"ò›BU™rµWªÙdíÖ˜¶ øwÊsB¼’6ŸÕ‹'4w2Åóü>m/K/?Ü,— òù­².G=Q}V¤ˆ/†™Î3KD|(7篗©7­Ö‰:`¿RRÔ±õDsvј¨Áø°Cƒœ‹´Ì,‰ž*YV±BV-CNd¦‹çWЧŠÕ¢fš†#¿(ŽDêá9à„+FªB »g…åQ¸Éó–Ólëq½ƒ&§Ë^”ípëv¹ŒÖ“Œ®myê²eJçcÉ“ýco3 hV_Ö„@Z§SˆÒ}²}¨a-§ã6]’á—”êÆ GAšQ”nç˜ÎcÐøD’¬zÛd‘p.‹ûô9:ž’ü©NF•j+æ ­}]A¼nÙnd ÑÝW„èJÄ>W¯— ÐtRÀ<ûý15‡€€|¢B †AjÙe‰ì©ßæ¹’ã£áŸMó´™Xw™vf³Ï¬ALØÌlÆ¿ÑýIô~ÅE|4&•éðñÝz¬€ù>Âzžõ˜ï›èŽKûXÛ$@7Ïjm$ð"ŒÙù’ædدTy¢“ÿÙ Þ3ùCiŽ"˜c0›É3ß+«K6òj{¥(ŽÖúzò 󈟪o  ´NÝŽÔ0i ‘é›^Xò½Ãût–h—É4šl_îÈ*nBT Dë—BT¯Í—CÔ<驨NÆg£ºàžÃ¨ xÁ¨3 _ÊG ¬JwË y¶¸€%“«Ü¿+·¨»gäˆÙ”"‘ÛYZAYÚ*l‘üܧÑ]ùðž7¦$°+o¿(C—"†5;7KYžw3¯µÑØP(ÂoŒè.¹m¹mƒfÈ…Mð_V|sØŒ©žQÛ—å¼}‘“4<ç½Måe4È…HÐó\ÃÑÑ~ÒTÖ¤2Q£Vµ¬íi õ*å­«“ŽËå-,Àæ“ÉîªËÉ'ƒˆ¤Õ¢É¼éÑÞe¹)Ç¢ëå~nYy—TxÆ&±Büiô~Ÿ°Ñ&(LÖÍ‹hsŒ4¹q0ØIÒ—eªŒž{8+fg¦Dõ”Ì ·Ÿ/ıÊÒ6[؇ˆ5ÞHU+æù‰8Míñu²ŒºW¯d T|5@–1ôõêõ2@FÊá0â Þ<½]ÂÆ"X,b¦T®BJrÊF.…ëÞ¥&Gí¡wSÔµ›DlO->åo¸z2Çó妼è…ZzB|î^¥%ïá 8­º5æ&¢7þ9/7Åž§£=þ†JlŒ•ŸÓÙ†]ïÈO WÁ[9*¬‰“ A©Qa/SÐ u¥<çÃÒvK¶Ô®—ù0r­†QÄ4»-ê–uœ=w#Ÿ‡ó¥ÙØ­”†¡æÛºgæHÝ5R‚uýxnvÈhÙÛ §¦t'ðL/¥ ÅÞÛ—H´­¸"ý¦ºwtÌçcÿK½zJŒZ\{îcYœ6ùùeQiîç™wVWg©Õ“ÿª<Ü3é¹’Œ¾×£^½mè•é]PB³d|‹G¸B«ôŠeí_^!²ÝÒÜ¤ç ˆíKøKx[€+Ì¡¢ì/„”èw̶jòf·uùyr»4CÅ /YR\M^‡Íjã(î¤Vtm–:–0Fî¿kü‘ª²tˆe„\ëvî}Ÿ9Vû¯6‚Nð:í¿€ýB\I ¶È˯†~˜KÐÆÖëeèG,¯™tJðËpÛ(Ûo ù+gç¿î¸Ës_üVk¡CÒa¿ÈjƒnRÙðtoÌa*ôloÒ¼Zúj½I³Fßë½Ic£ï—ô&…Ü^óÿÔ›¤_¯5I=Ý›¤Õ¬1zÑ›”¯üjs&k^Øœ„©)jNÊ E¯Òœäã/.æ¿Í×,µ]Y˜å]ÊDYA}T²7 lÜÌY 9Yé^­^¯‹©(Åõ.¦Ò<5ªÏÕ.¦)“ûM»IõAŽ™ÜΧ•ÈhýñæÿͯËendstream endobj 476 0 obj << /Filter /FlateDecode /Length 3387 >> stream xœ½ZYoÇ~ç{ž ä¥7ñŽû>¤8@d;°ƒøÁ  dH.©‰÷ vW´õÿžªêé™î9(J´ Örúª®ã«¯ºûÍ‚WbÁñ¿öß«í_Üž½9ôuÑþsµ]¼8?ûô;'áKx‹ó›³8D,„ •±bጫ‚2‹óíÙ+v¾ôªâ\[VŸšz·ä7ÚËX½\)%«à{±^®°!(n<+:Ýnšúì ³Ǿh®©U9ÁkÚq^xëÙ!v A²Ï_g½ê·Ù÷KéA¡X1¶è“ÖãŠ}QS! »‡¥ãV°ïªVúÀ¾ŠCMÐeÇîZyv*e£95Îľˆ-VZ+H šôÚ•òüÐ.Êùj0xØ>r‡ÝƒQ zß.¿?ÿ;ØEûÜ.ÊËJ«¶9¿>cÂ,Ïÿ }„Py§•Öb±R¦òÖb¿WìOË•0NãÖþGó Uäâügç¤v# í$¶ãÇ¿ô¿ùúå—øÎ`ØŸWíoØ 4|úrjÈÝ¡Ù.ØñM Ÿ¹+Æß ¶_,/–í~Ë·n'Z¬`´¦-¿Øì¯~8â¶W© ÷bâ>?ßoïö»õît¤A³‚‰ø“Éö_E  Ð!Ž+Çñ¢—Æ:'µ3¡ß8~³œÑ–ßœ6ÒóN ²˜Åjg•6Å+Œæ’—ß,‹ˆI³¯:q“"^±.=F ^·¾­%»ÊƒB3:´1¬ˆÆŸêm³ËünÝ:²6ìô:‹Ô|Дuç•âªõÆÝÝ—ßD,…—d·"özUzüé.û£hH±hÙMöù°ß&DpIÖl ãئ>fÃEæëmš«/NÍ~×ήb.—+‰¨ç-Û/ñ—w¬‰Z…àÇB³)Ї*@)žì B*ݺ_>Ç·Ûm}xwÁê™ÈˆŽÃWñäJWûËãúpO›9~’&TàöÝÜWûýáºÙÕ§u×ÛÞktHaÔµKð¦ë~Õw¾¤ˆ¬HHÐ>‰õͺÞÅ@dÙpðØãéºêÿº^ß7Q^Øk·ÞÍþЯ·®¯^÷:ùžE0•6F´±Œ¨†Ê$¤ˆ«ÿA<„ðBü¼Û}?¡èçQ¡@ðáE¯¥ U$ š|@õSaÈ&­ÕVÅœÎä²É÷È&Dzu{á¸K­P†a>Ë%à¥H½G õ€@NÞæêU'¢1ü/ ”å}çâÔÃàà€ž0›  Òo½9îÛ¿dÔO©¡„„=¦%,¹àþƒ¨V"Ø`r–Þ‘/^ ËñÔlëÄ"{¸NâV  ¸pÄc Ûиïɇ * Œr v=ß;¢SÉ¥âÆ 8Å£I…p§+B<­{ÝnÈÊe¡)ß‚-¸g±³Hþ!®q‘P·%D%În6í”^”^wF1¬Iv4eŸæØßAMÞi«0½6-v†¤Íùo1žìD¸Ï‘²E¿t…_‚' LÆ1íýg*çù :H™r^á¡ûœ ›#yœñ¦…#lÞaƒ#®D®H$“<,é ‹RãHpvÔ\M»B¯¹ ¦¶$”2õà–4fqÒ–0¨Ij`Ôå¿vkãl=gÀûÐ'…k幃°œa^ÈŽYÜŒ¸D"ðý÷Â)á÷m˜’„§`8R Ü„’‰c¾ñÍi¼sH‡ #€! V\VR—üµ>t4†Ý6÷ä‡ÔR‘£è6Hç@ùò·æ6ç0$o_žŸ}{ B³8Ì‚¥Š»BrÄÆBy^9í°dT}´Ó~ð|0ø1_5]Í„€=eË•Œq%tœ(i½€ì¬WRÉd+í;ª¤+fâŠÿWP%qŶ{Ò½‹yëv½[êMûb»T Rš½Cß/-È¢![Ö‡†¢+”l·ßÝÕ‡z»>]Æá@ŠÖ` RÛ;¥©”'y¥¹KÂ~ æÕ¸¬=sb <\áÓþGô S.ü1ÒXMùKƒr'ØïJþ­…¤­×é§h•Di_¤¡æ÷ÅÊe`´Â†A¶|N“°€}?6˜|i Ƚyá»Úvñ2ˆËmw ð¹Ðhà¸5˶ÍO§aüÄ*ÌáHê$˜nMØËQñ»þk̵H¬kãP”ý¢@â‰Ìu™¨KB°Í6 ÁlS¡‘Î@þÄ7ÄŠç•á »·:Õͦpëv.¨’ ëÁ]/GðÙºB‰’G‘M³:oHsk]ÎýÛòÔd‚Þ@õŒw ÕÁ€. Y öãZ¶ûÖœ{‰ˆK-\+CŒ÷¾8ËgÈ 9Có@@!‡¼ºÉ¿Îã¿Ù4'ô@@FËÞEÂ"A Ž«AÅ—§¥ýæ:§¶Ï1 =Õø&ëÏ žÈM$¦ø°–Ó‰ REe†$ïí|$®‰@…&UŠý»ÿmé<Km‚«€úgÒ€13ªô‘»”*n«Šy%°ï'0)Uš(‡ÄžÔZ#Úú˜û OkF!LµÄHi4(÷å0mRÉòº+ÖT %éê):Bª-¡i #LXþ‚oÓÀ °)ÑfsÀÜ[2Óµ£‘6˜§b*Yà˜šr[kEŒl!ËC=}{(Îlïbáo¼fƒ5 CBìCÉèMM v’ô~²º<•@”[ ½˜„h²ÇÜÏg9é Dó \¥þ¨û‰ähEWïÏ«VT¸”X/£ÈÎ.`6ÇÛâÙzIØYYUi¼¾™ÚŒ¡Ê7ïøY;ã •UÖh÷¡‹ÊÙEÁå·hgœ¹E…4å¢ê‘‹f¶dÓ7!Ñ”.™òCr¿PGõ¡ Ó¿‚ÂF‹š¹E9N?­°iß®¢§3ˆ[ÖR1ñb“N¸ìÊÐy pËW6ñ¼ä¸åB¡Nù.ÈJ"t°·cZ”¼(g-È…´ ô´O¿éŠñé’­ß•› =¤,t–æ ¥"Ïö&+‰q1E'ŠÍÈ B38ž!~ÅAêx‚à#M}™—ToG{߸¥™J9Ife¨|H¾5yBæaûÖwáò„šo÷\e ©—€–{禫4n óE Àø”oKL‹xÈ“÷¼Hh5(c* E~rÆçSÓáaUwþÊ8pš å€S®ÂGb‰óúܸà“hb ÑÈ÷mÜóÄ/üôÆ ¾¢#qâéPCÎ)Ðé 4ŽËktqc‹¤ÝÁúxõ’óÐéXÁG/>h”bÍ’’:LÜ™R51dÃk¥ l±!«ªrÇÞÆªF+v9¢11êèɉ¥£5 …õÛ|[´F¢+Uûþ" 'Õ®¼Î.®ŠæØÔ‘ôÔÄÎ[hN5aÒëÎã”%$ONåâ!þbvÚ*öVVƒr´»0Û‘ÚU LÄÒ²½DŸ I‰Éhr‰Ĕî–Páñ®:Êh–<3q,‡GsE~X§ŸÓ‡„\£õÉÆÔM?hºþ|2ûArWìí!®ì*åEÊÝcDuÒ=XÄ ¢êJÀ®»;¢OšÖ–Fâ¥"éªu8úí-^;æÀ+ÊùwI~ä™d[ÞDåúkÊ[Ïm¿ä‡Y$‡.^„ 'z—Ÿ &IÔJò@'ùÏ«å ¯ŒÓŒOfY¨)•¼Ï8‰{1ñýÌ•¤7Â÷wÖOŽ 2_érÈ9’…M3Jex·cøødÖ:™'(KÇí?ÃÕ|«Ê–EªÁ}zsûº?vë{·—Ùã4¤Ý¦<ÿ›‰¢ÁVÊ‚ì±h°JÍד`v.•^d㡦Â;„9ŸƒªÁöGÅϦ&Æg/Xèñ¼J*c艈x¤qN‡·Ãаßy>¥YR§o¯OÛQ³û®„¤Y&2:Ïð<[Љî RÀ/| ¼b!² Og[ö)W°JUVˆb¾*¾¬”ÐÀ±†·•Á ƒvÚ?ûݧg¾fxg?‡ñm%½/䢿ÑpªM÷wxy{)ï+l¥¥îª[ô”Ä$Äîæ8:Ž> stream xœ¤½MÏ&;r%¶¯_ñî\ð}&ùäÂY‚lÁIŒÁ,­–F²ºÝnþ¾y"Îa&³K=ÓªçT2“É$Œ8ñû¯ë“¾.üÇ?ýÛo××?~ûý·äèÿøõo¿þì—oÿéo,/ä3¯™¾~ù‡oÑ$}¥2?­§/kö™¥}ýòÛoÿùû/?ò¹®Ú¿ÿêÿô«ßýt}®VGžóû¯~ú¹”ü™£|ÿ³ßüô3þa–«ïÇEÿø/ÿô«ÿW®»$ûþçÿô÷þ¯ÅÒ5¿ÿÛ4úøþ‡¸lÎüýÿ¯«~õ¯ÿý§y~¥~ÕOn_)¥ü±öõ‡ß|ýÝ×ï¾µOj}Áÿ¶¾õ_­ÿÿóšùí÷_ésùÃbêÌûÇš?)š}õVí³& ³ü þ©ýDìÙŠÈ('2>-ŸÈüäôFæŒëÓÆ‰¬w¶72Ïî¬1|·*?´Zßçìò¨Ÿ^O¤}Êù£®üF^7¶Oy½Äš]ã¼ÆtÌw«¹¦½;_t¦O=_bæOªodœ]žÓç@ÖzãÕöi¯îôOîodœ/:mí.'20W_È|uy~ú1îùº>%Èûç§ÏÉŸ2Ndmýô×5õSìDÚ­–Ù¬ñêðZùŒWŸ×Š8ùI㌳;k¯¨ç‹®]àÕj!ïVkEœÏJkEÔ72Ï—HkEœ/‘ÖŠxóÕþÓdïFKÖ¼.ŸþêñZç°gì£oÄÎ;çµ Î¯½2¥7r><—O}!õ“ìØùž¹ýЪÿÐj-ˆW—ׂ8‡}Éž\ÞÈ|½ÄZP.ìü/ä5¦%½åOodž=^ò«¿Z­q¾CY+¢¼;{\ÖŠ8‡½¬ñìÕñ9Çf)'×|#¯FõzI£\ÓKçëZç;Ôò’F@·×úi/¤½‡t!¯KúKåõ·S™¯wX âõó%Œr»^ˆïÐÒkH[~ # goZyÉ¢ÜêêK‚åÖ^²(·þ’E@Æëì¥ä6>?ãÕù`¹_¯F x5êé%ÀrÏ/äT r//¥ ÷µ^ÏZë!½‘×£ú[~½¶»noùÕÇ[~õù–D yI"[«á쯭ÕPÞÈKY~I"+Ÿ4ßÈ»Q}7joA´— Zºã©ä¥)æöF^‚héŽ/A´4Å×€ŽëõóÝdé‰å ¼d×R_²k©‰/}`©‰/1´;Ç|)Ž/}`©‰/}`!¯GÙ[v-5ñ%»òj4ßRhi‰/)´qŽùÒ_êÀÒ_Rh!/)´ôÆ~vzcy#ïVí%† 7Î7ò’]Ko|-¥%¾ÄÐÒ¯úFN} ,½ñÓ²ÅôìuI~É®²ôÄ€S •¥8V;‘µú9Õ²ÇöêñZùÌ×ÓÇ­Þ¦cËRÛ I/áä”Ce)Ž[Í@ÖŠ¨'Ro}`#[y˜RD¦ÔFÞ­ìózÔÔڈÑšäŽÌ­Yz¢‚‘ ’¶ ’÷˜®íˆˆZ )»•mJÝ@H¢?ÕþìÔöÏ@ÆŸ#Ft#ƒC9 ^™Ê'¢Vë€,ý°äI[] }Áv SXŽZ¥O$¬ÒñáK,±ò%Ö.ãH£&àû8‘ÁîôøÐyÅ€ÆÈYÈ`—[цš˜‚LJ®õ§€0J'  Kc ä2Ä‘D4Ñ"a”ºªáH¦Q:±")»'c• 5± :B ºZ¼ÕR]r5¨,ôøÅ1¯´ŸÒˆXÈ …ôaL¶â8`ÔЗ¥ï]¼í ´C³®v° qɵN$íV#Þr©‡Ñ*ë ZPë—°IÂ./õ0ñÛˆ«ëZvp)Œ.„’ã%–zè6éBšÏXLQè‹ÞÈ¥°#´ŸšëeD\-„ž!¸0£7K=ô6 ›-AÐb£3K_t´ÁF9LRèµ1'–vèº@sA ±œNûiõœ úb ¤f!ÑÊ´–Âè‚«Á3HØOÍÕBn’.„›u¡ ¬÷Õ£f( áôZˆË ŒI<Ê®0I×p YŠ!Å(™oµN~£…ã}JH®ž´Ÿ,Ä%†2̪+ à¼5P=k–.ÄmÒžµò–Îè6éB,^}iˆ>¦½hN. ÑeÐB8)T/ûá3$×BFÜg\lUagq„¯waA- Å[-%ÑÒ^5)Gm`!“7.!ƒÖ‡M¼q ´²7JÒ¢ËPÙŠ«j#[ â2h!œËƒ&Ôš2Ÿ>Br-„Ó{!“>C Á0‰÷\Z¢K¢˜yD\­–Þcz#ùnµ‘ùº†6Ô©!ÂH öxzØPöF÷K,-ñÇ{.Äì‹¥7VvçŠi°´ÄT1…ÞxŒ{…ÞÈqï¤Ý(>—`û×+‡YŠõÝ)® ôÊ-ÀàÜéDj˜¥{ÂÕ¥%ºYº´‘Ùž·^4£0¹-šQ ©&g{ÊŒ`k öVÖZÜ&]ÏŸ~†YÚ]1t$…YŠ5}I9„ÑBb©qáÈÅV4£Ön{U…ÒØŸ{ ã“ Õ&5‚šhE-¤&!®ì-¯.±qWŒÏ²4ÄE>ˆ„,ÜÈkš1žk棠3nÒSH´2jY5ÓŒ‚[#€LÖ±$‰LʃÄk 5‚†ÍÑ‘*aÔ‹7L!žøìF¥ q×¥)†RP5g—¦xQ4Ö.¤óNQèŽ=ª>ÙªhFfZQêÑŸB+j!œ‘KStË´ùb'BÏ ¹tÇJ¤)Fîw!â–éÖ-*tÇñÔ?*tG Ä’A]§é!ÂÂÉ´4ÅL=F]6jÒêÒ%ª.UÑ-S¨EMȤ2B¤.å±S ]§VšQ ᤄòÈk¸" <òY!ëRC- X+­(hiEˆºc]ºcX¦“B·.mQ@`ãDŒ–é Z¦OD­%+j_ÓdE=‘QO$Ñ2½YQ»Ë˜3Ç[AݛǛ¯ «!Íæ9~vÔ=ƦÔý >²§ ¬v|ÏFkêþæÖÞ. 1ªìÜ×ÅùzCÅVÇyË­s!fǜ촦ZÒn ýes»—ÝŠó¿Óšº×H§5Í| q¥k-€:–#olÜ.0汄—úCº—ùR¹îË¢QÑ+@{¤^oDRÈ/ì1CÈlÇ>´´GW  ´)aŸJi¯VÃ<…á„Ø±Zã€J¯KU¼xMÝHŸÇî å‘{)¥²ÉœêT¶X;¶m›až¶®+ÌSlö a$å¿.å‘· e­Žæé¶€ š0Ìë( |‡Q·,j]ˆdQç5í-Á–¦˜yŸ)`Òʘ|¶QmA¸ÅB3#ñÚ™/0)‰ç:iKÉ00牤݈"xi‰ÅND¶Ô ëôF*5‚iÔîgµÏ8Nëôî±Qzí·ZÈ8ÞzÊ”Ú#3eJíÑ›“Ò‹Ü–ÖØÚó´‹–Ô6쀄Ò·lW¦uªïÝ––Xž3ÀÏYÓ®0¤öÄjW£ìÒÜ4?ÛÒCvi·‹†Ôžçí4N_ˆ•çziKm¬ù¹¦ZºÂ8Õ²`ÇÒlKq¬é¹|ÛRÀ¥ö€¶ÔÆJ¦ð.5D¶’ŒöTiZj!„°%éašÊ±À-Óí{hKmä¦u Õ2•n ó©â4hó©â´¥#æñTq€Lª8ìp¦Õed[Jb©O1Ж’x•§¨2Hâ¤--±>%N[Jâ5Ÿ ®PqÚRëSÚµLjë3@ì£miõ¾m鈩=E6Qžb½-­1|£ÒÚÒ¥ „n„Î:ã%y7j1ê%l¨íˆ0؈#±”ÆFí¥ðšF·ªœ~@&µ—ÄV>Rz ÛÒ •—p„´¥!ʱ:»º?9 KC”_•ÈÒåW ýˆ@Ú~UnKA”_õFäWR¶_UHÝ~Õ‘_UHãaéôíW½‘ñêrXQ`Яz¿ç cõFhEÝÃ…søg]‡:F¾Çr|8Óñ9¥Sò{7šP÷œÀ‘ŽiÓä™ÍüÉ“=)¸¾ J-ŽîcwÕ4`œå¡cºà)ÇjYºa¢¶Ø‡q.:h‹‡1ËX®X¾S§ý$O,ŒðÊÕš [òãØJà EÅF•Hjœò©rS€çˆÛcao:Õ€½avÛNU=ʶSµ²ÕØ^ÕÁw˜Û«:È«Wص%åÍÒ åTíqߥ^”¢agÙîÑèÍÒå夺HeŸê"Ýܵ¬±ÕÔ¬¶0ŸúE8£ÃƒÛØRëáðh6BèYo!áÍšKK]lô¾PX,å0Ó×Èa_È”)º3h>m×T[Úa¦_Œ¢v!áT5 ñ¥/º'E§?mÐ|ZeøB©ºÄÒÝ"µ‹‡4m©‡® ˜ŽÚR] YÖ “Ô¶˜#d|½D&[U ÎAû)BḬŸ¬ktf Ùe[-Zˆ+64á–ÎèbȦ´Œ¥!º—vŠ…¸I:ä„nKgô1…æM„1®kÜ(¼&í'œíóÎ4 FÕkM á5í% è2<²1^“Ô0i4s†BÀ§W Fû[õë u`^|ó¾TD—CÝéH943E2^ë} ‘ÂV5v/DG£Æ—bL4 fg‡ûÕC˜Æ}ˆ«Sß¡/¥ÑåМ\çýò©×ñ.) Áˆ‰™Ü¡46 ‰‹¸CiôV™ª:H/¼KLåžÜÇãHl¦})‰~IåNú^&>yOn:r¨/%6)^¦™éÝ1Ú¤}©½ÂÁHaAáeÂdÖ@&Ÿn.¾ðzׄ …—¹xŸ?+äG/ŽÄòìKI„IŠ·ågßáø-ÂÈß?½ÔF˜¤@¸蹰U¡! $Zq g`ªG(‘á¯Piô¥7¶*oc.Œ€èáæÂ?ÕÒ›w§}x—šÕ2 ³{i/aD áÞ¡6V"CˆZÅqT_zcÏÄ׋Q'0'‘èßÒû8ïÆÑª»4:«çÃÍeسƒc·ÒK„$v×^Šz¼zõåóž…Œç.űrÔ9³«ok1êYÈèÇ—YŠc;¿^­»U©B¯áÒƒâèïÉŸÝåf k!33©º€b f z#_9Ï)Šu‹i÷…ºÕŽyÝ|¥8Â=zR¤Ä£ZÞ­8g[Q@®X>VÔ™H˜ÍK;øhS€qq†S¿ã¸×)¼ÆÜ,u$ ‰ñôÐGŠz"aEõˆà&2ê,Õ¤•£U+êDæÑœçÌc?YzHÇkõâ’ÈÇ"€ê‚è1\=¬¨ÇöÆFY›¶1€=Ì(|ḽ‡åûòbÜ`.^3?1Ù¨Žô¥˜\ÇÜ_€Ù±î,qD»f±e62É<èŽHw 3 ûtçÃŒÂÆÜ¸ô¾^ª ôæŽt—C9kˆàr(x1×z;2bD×vö—Ck÷¤h‡êè× õª#ÞQßYˆ·BÄN¼ùH!½JQ——ÂË{W²º0êkã^±<ªì¡îíØx¥ї¾ËÛ _t!°L±epA@uÄ‹V¹šú[ ËÝ6â’¨I³îK)rùÕŠÍÒŠ`™ú’+B\5…-uèI èò`ô¥&¹€íòåeê³5^bæD]ÖAŸaLù2!.¿ÖÇ×}j´ŠUGZ0|‘$ÄEÑӼϰ¦0(™ˆ…F0¤¸vßg–¸Xº• ¢©è>g¢r$ñeWæd·ËMÎ…4šmv¹9¹Éão\ Ad)ó[ø²$åÈ.?è[Èä¶Ë;µv2•;í^<æ©•‹Æ‹]nÓ-¤Ð­#jlƔՋú“]aLY•´ùe; ¯ùe-ó`ÝRSÖšž•˜2 G—“G¬eYø0h´¶,¾DºcšL–Ü^[ˆÌ\K>"g1o527Œ¥·ú~–˜2ÄYðsÕ ± €F`ÅàÈp`\ø$ €ÂÀ>× ikÂŽ”)¸-{ˆëHRó˜_2à Áw…È|‰™“}ú.Dê0°Ä^–Ô(ûSe÷î.d|ª§ZI¼Óš1¸ïR&Û˜K¢Q'÷ x¥½ ôFGŒ»¤AqD£~i€sR£ïU°ƒð€„µñ$*ô¶´DhÃÚn”] “÷ Óp,ÃF´¾ÕÏyéIÍÛÄ…aF)#äмt†ˆUé5aɰÕp}`^C£WÂŒB¦'çyñ µÆ@'¬%èQ UÈêð̲m©D3ï)QÝŠšY;H¯Y2ƒÖˆF¥S?Å…ôšeR}94«ÌP«aEMœCÇ’Zƒ>0á+ޱ¨.R¨ÎÁ[ßý.‡f¿¸\ˆxÍ.mõ®mW4²K+Âר~Ró‘\H׃ó ï€`°xTsós!{F.†é}ß§ºa:‡<*Ø‹pÉÔy*Ò©xAknEÍ)²®×˜¬\®$ Kv-DQaÖÜŠZˆ‚g±Ç-)´vû´Ÿ=a—.Dg)†H½Ä´|Ÿ“‚‰¸óºÝú)ŸÇú‰u½Ó6ÛK4)Õ4ëxJ‘fgÝ-¨…t}ÛîÖÌB&ul·ú_³6Ðîsc!²Øm錽 {Á‘¹²ÄŒ4j  •Ýèk 0šTØÇ½Q(ÍDп.Ì ïñ’èß«25v xÛâÏÜ‚ZH×& -c B¯0ò~vûø-¤Vs¿dR0q ;ldØÒB-‡ÜA›¹7(s j }F«‘é‚2pÍÐky¯g‚Bॠ®KTÀº¡á?ôô‘=DÔüœÃÉolÈ#»âj8k­|TÃ~n8ÞŒ™ ²ËSfð³óÃùxÏì”y¾‡+™÷ð4áÈà“'LRÃÙEì›Pd!‡pè2äŽbWÅÏ> G!ÆZ… {°Šk†‡=ß»¸µèLñÉjð³·*$š·Ñ±æÂz2ÜãákÅ÷nƒ{œŸ©¸õdp}7öÅG ¾ïØŸ¡xg¿OçQˆ!÷kóšébH(Wc2ÔÁz±Õ ò2jb«½}à‹˜Öœ?.q>G."Χà7æ‚©íHšB¬F¹ÃTçSð×â¼®ÆVûE«›Oæn¾„›O><…Ètñåg#IˆwPNôÑÜ|òqçÜÇ)­ßG°˜9sðüj4çSðÚyÏEÃQ 7׿”Ov¹¹¦o~H¯Ñ[emÀÍUtóßBœŒÆt 'Ì¢ŒÉ>æî *ø$åôo>Þ†Ã)#2]áüŠ£Ü]Öθ8 º*øôç†Òè­dKŒî6”á„; ò2r,#.òîv¥ù)(‘úq€ç`øm¾5™`³´0j³ÖæÚÃÜ> g ‘ia-ó›/õöijE3ê£Ûá¦OS˜Ju¯èÆT*òAÏêápîàÓ×. eI E)Ѫ8> ‡_¼z‘»1ÆF0¤×Tà¬îÜ]È¥Á©aK]C= æÎã’®=Ùµ;ìrÕ®^i ‚ëˆKº†)S¨Y³zWíŠ4"paÔâÙÍéé"GÜl®.ؕ۾&L©+ -ò–£URX¡Þêj‹ôtp†x˜-èéà_äÓ‚SNIn -8Ü•™…ÐÿÉ'ýª¦]´¥Âì2õ€¸«ºíoÁN‡A )«Ý±ZåoâŽÕ²wþìtXNœK=Øé°Ü)ez°ÓùÅk‚;*eAwJ…ñìܱzÉn›=Øé C3ù^Ø!öÛFp*E%l Î÷ 7q0z°ÓÝG3|ªgáÓƒª1Ù‚º{hñÓÏÚE§Þúé?c;<§; /nÙæG+2fðÅp¸7ŠàÓ‚šö2?‚5 z=7¨éFв9Ôt#ò6 j:w¶$!Ù2ÕþiN«7Sâ%AM¯e—M?Rñg¨ÿ~Ð9‚™žFöx3¼œœ²#˜éàaåjÁLï.'ÉZøù½GÐ*Àe½NLgm ¦Ät¶S°Lü¸´%Í£áÄt8kèð“½ÚhÛÌÄt~^ÂÛ1b¨½Ì ¦ÃOà'{Eal3¬9?-å¶0ƒ—‡_- ñ#Ö½íÏà¥Ãi]x7ç„åµáP@:Žù½gÐÒá’Rh-;9·fÐÒá\• s-Îg¹ΠUÀ9/eÎ Z«ÇNK‡SgW+óu-Ϊ}R8‚Aû‚ZˆÓÒá”üb£ ¥Ãi{àÑ>“ÖÙB‚•û> V©wÞ&XéUàÚŠ#ƃx=;XéÁÀ;©‚G=˜¢ãüŒc) zc¤tˆ¸¸Š—ÿLÁH‡@ŽÏMÁHçáñ@£ý”! <ÐÇé»`¤C쉻1™äèK F:Ä,t^ÒØˆ”Žø%%¬ü#¾R F:Ë4â>–5)ø0a1x)é<„"Þ*#BuæâãiLü^ˆó)(ñ¨œw#ŽgvF:„Y<;# Å·ÍÁH$U!èÓGl2Ø}dz/$é€ä*Ä#}:³º2N¿<Ò§›fVvF:yð0ÕÞCh-$ézïZ åúðÎŒt½G,|†Òàq>)R B:DbYâq>™“goçÓ‹¾x B: üâ%éVø“Rh×çu‘"¶‹ šÂÁG×S,2´ñidìÉ8âóŸfñ2ãÓ5šõbŒ½ I;ÆçªB"Ƨîkœ!}3ú[K„¨¶Ê#ÑèÒ;Uç£ëŠ+È8^ôŸ:B¬9â!>ÕB/$ˆ¹¤Þ‘‚D ðŸZBfå+hŒ<$Š_%RUÉM7G(Ð9]ä¦ÛS%]䦛ƒ{{Î/ø "w…'K !7Ýž•@<‡rò¤d!u箸Ëh!dS˜“¯žÄï#u>œÜt3è@jº9ùž‰ôÞ÷BJAïí91#€ ¦¢— n: ¡¡¤Üt@,Þ3¼ -H$¡Ð£šAüI(‰*  ™½Ô¸»·“áZR«A$ˆé<Ï©°¿9ˆé€T"A¥po¿Úb°¿9ˆéz0¿;Ät;ÅÈ—`ñ…ØnÕãÙȘB\]ô‘,$¨é€Ä;gS؉J„(êTtRIE<¾ñ%3-¤pHMý+e 0®2{ûÁpŒE„Š»Ø‹­H0¦@-¤S€I•HÁìígÇI€Qžr…— S©_‚NÁe®€DS«·^L@¹´VkbšÅ¥µZÓ,$Ì™½=»*ºSƒ˜n'U82™BÁîÔúéO%!‘Ù{§Š8¢$.»ÚwJ÷¬v§®lD|í¨Th¤¼tž£H»˜¹ÂGìÐtR0{來/ÝÎàqĘ-TˆfL0(#¼*1ï‡=&µ70¿Rk»'rëlÕ´öHí­tÐŽJ-œ® L\iZŸm|˜‘¥ZºÒ/æ <‘ÙO$íV¼qÏ»Njï»döÞ©TQd‘¸"ý2õÆÄ•ª=3˜½ã'´‘*Ç'sPª~Æpî/×PŠvÑ>#Çâžaûú´áG°‹­öd³Ä´•,éfÁI·³|2Ng:ïlΧðX0| ef•ù“Z›áppàjBd4¤.†¸äDbo ”êf\][‡ .yƒ‰½=55®±÷c¿AIw«Ë(ã–é-PÂYó”Sdö†¬ãx’ÙûÖŽqàrõCbzkÑ=1{ßZ‡˜½·Ê“Ù¶:Šš0Tö8ƒœt³I0 rÒÍ*ñ1Ȧ0‹Ó$'Ý,Zu“œt3kö‰Ú[ÉÃ`œ`^šÄ“¤tcoµ“Œ C.«4ƒ”n í´“¤tà €” ÊÎi’Ralñ&fo [¤¤rX¡ü‹Œý=')éFÙ/EJºÁŒ™œEì=x —óEJ:e~;2"9¼óRÒ éh8™óT~¥”;â&%%a*Ñ ¯!%ÉnÉbö6iÔ( Óž)îa¡N`<¥uÄ t žQ¦ Û’ÎäâCjòY¢$Lg~4±·ÑSëˆçÿ+o?£"LäÿgÎ7©Fþ?Œr±·ñXÏ‘ÈÿO\Ž8ÿtZKÜQ&±¿L"%1@3£Œóúص5˜ÿÏHsG‚T•ö9‹Ø»ONí,bïÎàhG‚T•ÔG¶Á© ¿U±wúè9(éºÜ³( ã–i7*Ý(œ ¦Ù–Æ*Qéb9‹Ý[GŽˆS•S'ÛæTm¼ÏØì¨™=ž›õBŒ\£œ¦%(zÓ|+¤¤e©#öu3–æ,~o×fÔ¹HeË)YÈHj‘hBõªI*zïÎ+Géx9m ºÜШÿB 6EAŽ*¿´<“ŸÔØ¿`¤9°Ñ(‡íçúdç`g* éº<×@& JC;F=˜à¨M6"]¿´ª* éÄìIM ïB>R˜.À©M„Ÿ$£›qŸQù%Èè¦v­Íí=¨ØåÍí=4õªÈèHr–sOì¤qŸ–6¯\|þv“ÑqÞ·¼ì8ï[ƒŸ½©½»¦Õ¦öîûÙ"£#eXFå— £kšå›Û»i–7Ų̂ï#6º½ûßVÕ’k“MäÏbö.šÑ]ltE3º‹Ž§9w±ÑMéÍì]4‹ºØè²úÒÅF—5¥{Û\éÜ›{-jâmú¦õá¼êb£K»ƒ&. NòMì8É7¯wÒ~ÞEF··]Ý¥i/^o±_:2É^Ä…`b£Û[³‘ŽT_L{ÅÃIë-r¥ŒÂ/YÄ^SÈ$W‘N,N9‹Ö[LO…_.²EQºÙèêÞòltd”Ê(ýB.¨Ð’Ø“£+#½¡> ¯2J¿¯G³<•#GéÉ\Dé}#ù:+M92Ïîät–žÌ(úRÒ™¯kDHw#õ‡V¯G·³ÔT.bô~ vürÄ^÷g©©ŒÚ/)¿;_³\ïV%½[‘Ñûä³ôdFyv¹µ³ødF˜òêŽÅ'é¯kÆ]¢ŠÈü¡Õr±·È¿aI^‘w{)wÙ¢rឨ"öÞ.Œ*bïíæ­ä A5¬Çp‰Ø[…ïr±·è–¿z¸Qû…üêáå@æÙ%gÎFìÁ¿œ«ˆ½Uw#£ò‹MáZª"öÞî§*bïí¢2èØbkc&=fÔ~¡3,Né :ÌÂÇŠb01¢r¡ÕX+AºoBÔj™,òÑèF¦^¦‡/¼w@&=|•Hb‘F¼¢òK¡ƒ/ŽæQú墿1mD% b(¢DHß5•2J¿\¼&|’@:¯a[§_ÕèK¬›Ý[Îκé½ÁŒ(SU™ï0éWU4pÝôÞ¦EÝ/ùU£MOÛ­^ QãCÞÙÚ³ªTqoro…&×Mî=´€{¥[Un_~ɼO‰ÔÍî}#b÷ÀHþ9ñúùy#s×ë¸Uù b×Yå#£ðËQå#×Mî½_Áò®òÁ×´²«|p(¬î*.«*Øqñ’F¿êtë»jJ8ÀŒãˉÛûþºâö¾g€]åƒ³Äæ.óÁ™$noÕçp$«r¤£LçT9üª{|ìˆÞÙ{»Ú‘ž«*iQ#ŽÄh»p%W™˜½s3 ¿¨ÊGDQ•¾ø»ÊGa§ª|p›sWùà¾0/Vù¨z*¨Ê‡ñ’¼Ë|ăfÙU>"Ú¯FÞQ߃r¯·jƒdT~ÉùØífc™ L?£"ÃŒ#óØEçø´2w£™ý‰4ñz?Ä27’Yæã‰Xzvµ_ê T–ùÐ;Q£xqÏŽM¯÷¿&^ï- P ¦öÇg@å—Ôž¢¡‘ÖûþšÈMoù),À“Ÿ…^á,‰“–Ùº¥G Vï]@ÆÁFq`„b0!º(NZ„Üôû”©‘Ôû^ ¤Þ÷‚ñ„ûò”0-Èbû®âêÈ!`Pú¥äÇâE"¿׬Bì¹´ m"åDÁezËlt»Pg@åæZ$*¿¤úÜÇ€¸Aº÷:pð4•mŠ1Ï퓟{h#§÷½Ï¶àô¾7çä-ˆG‚œÞ»ÎBn$õÞ™ÜÒÃð#Pç–&BE“º ;Òy?‘¢ëi´XKŸ”>7B«©1ç8ƒéáêo$t"ûõ×ßþúÛï¿ Ÿ½ù«X$`.öú*ýº¾þ𛯿ûúÝ7Ìå¾Þûß¾¥¯¿Zÿÿço××_~ûý´Ðkm:þûÌûǯû-!lÊWÔåA\¿}tàbX:ð§Þe#µ3 ã?p—]&ißEÈŸròÕ<î"äO¸Ë9´ÇEÈŸr—×X>ã.××?®œü_üã׿ýú³_¾ý§¿ñ€gLç_þá"ü’/µ–ÞÓ×ÿå·ßþó÷ŸÓõÓÏ3uöï?·Ÿ~®€ž¿/¸ÂW1ÇwG}{ù¾®þ/¿üÕ·¿øåÛ¿ÿ}óõô£ÝˆuÃüGfÉw¹Lçƒö'ß™¡KÏxÜ…ÈŸtPñ¬ï𸠑?å.vÅtßEÈŸt¸{Ž‹?é.pª¯íæq"Ò]¼¢Úó&üI÷àÜxÜäœ-ÿ?3ÇkkÂãæ£à_?ãþH4X Ó—G®íß§ý²×Ï–lý5Å_ûúk¾Ñò?0Õï% zÆÇ~HÀ@$Éézáü×ç®ýµìákÝh8½‰O­r¥~üÝ/A;läÿÞvÀÁ9wƒîìšP§¹üŸ¿ûãoþñ?Á&Z ø÷_ýñ7ÿõ·¿ÿ×_ýaýùøÃûÃ×?ü„t¼Ëú÷õã§ŸÊ VÊïÿàƒÏò'!D²/ÝçgO ùûoßSúé—>ûƒ…¶ °û¢¯ÿí Hó¾V[ÙÏHç¼–ùñsò¢æ þúWòé(¸¥D40/,‰çåbV󔢜óÿ”Ü;?Ùo£ÀØu|V!0¯‚—@­6ÁÿÉ{€à×ö…ä¡õm0]þæßïÉ»êÁk (‘à.$Ëý’ÿ‘—‹[zÀYÞ’Èÿ°Ôñ”Ñl1Ïþø‡Ÿ~†–;—Hù×ßøÔÖŽqøåÿúöýþékæýô¿ÄgýŸ)iQ—ˆ*«,¢¾UPˆÝ­¦U2¨þßÈÜÄ™0®í ’¶/ðFäA šžÃRN¢#³H¥Õp#m— Òw™àQLVŒÅ°]ðWÈØoÄ^­æ»Õ¼h7<ë'’h7¨$qR²àŒ|"…vÃD²àŒy"ÞÀéôªÀ]Š Å172h8<‘YOdÒp‚Èï’N„?ƒ 4G‚Ûd:o„GRÒ_×Tš7Òv« X;€¾+ý°»ÐŸ€‘`|Î[Lº­ÄÕ/FÝHÔ’:ôn‰K’é·º‘Ââ€*ù–™%øD*M±iŸòæ<‘¾GSˆ©Q‡˜ãDW72Yp#L<;ï5Zú]<’M!–72N ìK!uÇXÞˆÍi»U°× À[­nDåê…Ø.W/dìrõ7¢rõÆ×šŸ~a™¾©ôn”éºz"“=î5„|÷~"•Äi»BíX>‘Ng JXæH<'2tì"`î²¶7¢FÁöƒ ïÚO$Q=‘QO$Ó…x#…rHDf@æ Tzo¤í!½‘×%bHœÞüÎöFT)XÈ  ñF&ÅÐFÚE1¤¢ ™©‚O$}ê ܇R7b'PöIVT!Ìû8þrDÇ_BÚ.V/¤ïbõ¹ Q±z!¶«Õ ŸU«2)ºD$HïüÔHH¢èº‘LÑŪ™‰‚ PØ@¥3pÎÀ cÁØ'z§Ðº‘×F¡u#ƒB‹Ñå !ÞW#ÖÄ.ž`ÝHâ $éDxu…žÀ'²E­îFÚ®O{#ªO+¤S PÚÌ4Á™åDeÐÌ= AÔ–‘&xüÜM„¤Oy“/Œz™Y‚O¤P ¸‘J ôD”ÄrYY‚¤ïÌ€'`[ªÔ‹ï[OdœÀ¤RAVx'{#q‚u#L| ™H• €Ì|"…'X7RhUw«àKCäw?N±õD&_"³;L| ƒèF&ϰžˆ±;Á×_”&ø@xõŒ—[¿k:‘òù0ö¸Py„µÆ#¬ :õú.SÚ‚¾w™ú¨N½±[…¦P.ÙNOd@"ÑÊ.ð\”"x ³Ÿ‰VZ!Å)‚¾K=¦ˆ¥‘í$vf„x_ù¨• Zi…Þ„x_ã(’BS•þ“ŠRD‘BÒ>Ê’%E)‚2ʉ”Ý*d&‚¾Æó¨.å>¾ã/ndòØ-d³ôÖaŽàaŽ Îüéõ@ ‰V‰Vt.舓‰Vv-ðRH´ò@˜%¨#ÜT”%x #Ÿ‰Vx™ãÊ éh?ñŒ2!Â;Í72ž'Î 1ß­ŸH¢z"“} ˜ï^N¤ìVA_ d–©;GMHÛim“Ïꯟ”Cv­$[鉤òí–)Y*Re®`W‘"Áš’4¹*¹VzÒìª#LS±_8¢V­Äµ’èB|w"gF°¥{µrfD©×ª\Áž4sš¸VÄædÀ‰Óĵ¢rÊU¹‚=Ó=$hSHGòÝxMœÎ ä;“øcjĉ¢TÁ.¢{D|×JÖ´hâZ!¶#F’°§+S{¦©Œø¢‹½ ß7coÂkïÂ÷ä´èe·â$è"[Q$Ä|ÛJ¡yˆï`[Qy¼Úo¶•ðjÖ~³­°Ç›l…Ÿ¼ßd+üäÊ R]G¦u Fa!æ»±Ãá CÌw°­:¶ªE“ª{Õ6Ñ­ð>!Â;èVTÒ¡2QÊt¼·ƒˆÃ‘–)Éj輄ßÎȸ"†›„oD½Rbìñ`+2®ˆ)'!ÂÛ-ÓÞè2ÈÉö?b¾[üRƒŒ+½Q±2ž,= AßlTÙˆ†Tg-/ÒD"~e v©ÊA#“-1ßýI+”ª²{§1Xã{«"¾]Á¡™aDum0Ù¨ñ’´……ˆïBb$ù¤Õ»†|’p¥«NEU’`7)FJì*¹Zg®ˆƒ)!â»’§‰C>I¸"æ&G؈úˤ%¶§T'­(çf!ÂK•KšR×B ¥ß™ÜS— 1¤ÒBtêd£ m¹1EPôT„b”[BÄw ó®t¦š9¢F3&Š+!à;„Yßâ»Ý,íL#sÄ•Î4²Ô” (®„øî@¨SÜ,UZBÄwå5Æk²…J@4a¬T6M+‘pEÄaŽóÚEñ¶ãZƒÿÆ®ð™$)ì`$ е,!ä;“Ø, ˜ñ›C“Ni:OGÈw¯é,ºeZP–¨e äÛe©fB¾Ý&µD ¢)MPÄkޏ ²L]!ß5€Ì‡7R¨é ˆuv§«QHlx»²Lù ÄDÇþ1KÐäåoÊtj .L…#ñíÈä¹nJ ¢r"óë&®K¦F•âaßBú$Ä Y×”$h*cÙ”$hòqdòÜ!2ØE5½¦²ƒ$Ýf šppô³Q$nöé…trV+*ˆ8«{cä¬6j ^Æ&bl5ƒ;ó¶“œÕäÌO¨ŽœÕª"×s"û´Š»ñº I«Uv*ñÃŽB<Þ*©^'h•(uQ¾ÇK'DÝGÂlÚ\âŽxù ÒÔ/À““>¦@j £ ñÊ ©Rxt&n¢ø…Dr`OMšY)5J%”)ŠÚ?ZA(eäõR×/‰­T.¯3E°G½ GÜnÀï[‚ZÃÏeÇ$A Æk"I$óš Véáï%âÕ(²j²÷Ô*@8ìe°U¦¶$ê)í™]&ë)j&¨õ”ª†¹^QO)æZM,¦Ô¸ezÍ)ïoç ÄKQDI GJ h6 h­l5(±½¼U Äøä XÁâƒ_ÅËHM!^¿¢¨2*iáÙª=•PlËk)•LùÄ X¨bUò]èM)š¢-øUv+G¼Újßô*ø`à–ÙH%´{ » Ÿ'œÐ@,blô*ø<­œ^¥;U{Ù„zifµ`WñïÝ‚](¯‚†ÞTU’F¥4/›P uï…Šá´iÁ®¢jc %ؼ|EÝ_¼‡Ý„ÁÑ C\YÅ,¡Ð›—¬,kZp^½¢ª&¯šPåÔGM9/DÑöÇìa7ùPoÄ[µL ÚE+Õ4F]ø#Uâî^Rö2m3ÈUP}•;ä rK²4xõÚ”9¹Ð+oµÄoø°Ð«h¥¢Âv…ýdAƒE’ËR”éHè8tË,ö‘Ðsè†gxPf홄°^Ø7³˜J»yaßÜ)çxaß̺ /ì…h‹´J»Â|2”EB ºP(w²Up«X„†Ia>R‡/D[&ÇÜRp«X•ÂÀ¡Q°¸PißÌF…¥}M¯•‚]Ūô Þj'a´½ÕŽ^ÅhC ¡ÒpÌKÁ®bµñŠÀûˆ_Ä+ï#7TõÅ;ìÓ^Üw»ðñÕ|L9ÙcYÍ.M€Ö“m jCr™êG$|WH.”`¾Lˆ—¶Ý¹æ 7‡Ÿßæ¨ã5˜£6äæÇlÀ‡ü˨m )dSY@@fT‘æÍÁ­bS~.Ë“ä!4.yL0§ „ÆUyøg%¸UPÔ:Ì'Ì2è#Jˆx]å˜wh¤@ n•‘Œ» )jlë6έ2²\&¨û|ù%}÷&ì§‘¥ÝcöBx¢ZÎV‚\e–Prbhi´>Ã3ª„'nVƒ\eT•²‚oe‹bè.?îÅ«n/ »FëZe5ÈUF—Îc5ØUFW¤4H!”B7¶ j˜4D«Á®2LªEZïBúg À}‡ö¨¿ !4†2 $× ô‚FSGáÖ‚]ßù¥Z°«Œ©s ^’þÊ»U°«x-ùxT v•yÉ[$JÒKüZ«,I¯#_ëHÌ•7€—¤Ï²s¬¹5óܽ v•Y ƒ:€@rMlm|RP³j3na?ͪ‚î@`ΦÊñÖƒ\e¢›ñ¨ »XÈ ÑjR³ºfQ7éìÆPl;ÞÄ”dø²Óàf=L'/êÎç†é„RëÜŸzð« zÝô€9(jÝ Jö99bÝ AjzóS¢†s2÷Ó×JX@’˜Å¦çÒÔÁY¨ ª¾€yíCóâÌñlsÉc(™Ìǹ‡¡{uèÁ€jÂÜ¢ÌË ÚÕ¶È\ÈÒÌ«êòQ®­ Ûr›…+@×:5ʆâ®ñJæ_ÝPL•* -`dzLôwP¯ÇÝÑÝYôœá¥ð욬™°i/-ÀPÆ’›¶ñuc— цþæãQÃKYÊ[tÀß `H¦®½ßzymÀp2ÔéËC€H#vG:&»¡]á5.n µßš€þöªí}¸if(yæ–-Å0ã Ì´= ·ÌËxE+(&Õ@ˆŒK¦”x kÙ›'Çmà‹0´N·œ 9­y#«¹å¼…áôzÈæY›ñRëK0äI²ÇÐ=W‘uX7²¶Mó/D ÿfÈ££DŸ#Za7!†k¦r–“!ý*6¬qùîk^Ôb 1¼Ä”H]ž¬º½Œél^ø`#”&×à¦0à‚[ÝAG¬ —¸«;Ί_„ \“eõŒË¯¶RV©ì­jæšB®”ÁÛ¸ñdˆö6ÞÆ'C8uB&˜<Œå‹„{ÇK˜|qœèΨêNòysòâ!cêÜÀ1`É_ÇŒÉAM%Ø(’ | `p¡AmX+Üž•7ö%gÎ~š…Zxäf¼!–«ð®µºÓE`Lk»[yh¥ÕJ2ÒŒV&C Èp¡;gv3Œðšìd*NÊ7 ¼„ªú.${BUcL³GŽõ¯)d©æ'ëlUƒÉ&Ëý1²¿ ùñq2qM©”‰P™:¸3ªÎóGvóÉü˜2¾–£'ÿò¶N¯k­)XZVÁ5]Ùl£¸c0‘…:lò!âJ©ùÉbÌöâj‚áÌ$–,È!epe·ŸÌ¢ÃÅí'óúÁYZ¹/>>+2ŽFqÊàLå,-n@™;8yc?Ž5ø¯ñ£Uó íE$‘;UÙA?5øÖ¸¬«; .°°ñx«š(ë¡`z+äªÄ+yRLª¤f}³>Œê” Öw¾´Ò‚—Øè£zt”õ Äœ®H{£:i‚õ£eÖ[íÐ æ×ȸÕÕ<ƒo…3£úQ™õî4ù)\'vDçõ–ºl»ËÍÃ0¬›£9q‚#º¦¸<êûŒ¤<)q$1šë*Ž„º f4oÅÏDiø©y‚t‚Ç¿ÌÑãΙp<ħÔÑ÷¦<;Ûý¤çùBýŠÑ¼_:Îs`ºÛOÏÁë~hóßî6Ðó¬o˜ŽÏÔÝ~z~Êî%“ŸŸJR?¦Dï1š÷´é~æúœZÝ ¨çôë~zúœ¢}F«{G,Ñs¦#äçX –‚>ë^0æ¤ ÏEe.Éž Þºsqš—Ý}.`«Ñê^äïvlæºÓs³° Fzì'ÌHÇžƒ‹c[2÷.=·.L;¶·árô¹gMxn“Ãë"=·Òá6Ôs»nC=·äQ¢Õ½m7Nžû:Nù­¸ õÃiž"d¸™û3ÃÞ¢hŒE·¸‚úØ‘õ±bo’lêëo`é9½ÒîSÂÎìJÁ-„g ¥àÔÓ?ÛS˜O×2ž¶·R0Ý”z*ÓM©§rý± Ίˡ¤Ì0¥zÌtSêVuæå–äC2ÆSešqÌûP«`TçCõv«gúcªp38Åj£[„qatk‹órú„‡F91¢·Ê9/w>ÔÒyù•ÿ™ü3>  ÑÛˆ˜Éë"= 8%’= £? –™F´ÚFÍLaP݆H£Û6šÙyøöüåib€@º­°™êáa©Í줇5Ä[m‹oæ­dÂytÛ3{jâöâfí¶?g¶ÓBy¸…ºmXn¡n3×4ãi Ïr……ºÍe b·I=‹çN<ÌîY<5áašÛÖ;w;è1ËpZz;ñ§^þiA=wŸL ê¹û´`ZPÏÝ' @àY½O0ÁáY½O&¦ûÜ}xd¤çÇ4çO¸Ï@¦Ý}LdaâG{ûnÎÄ£½øÚ3Èçîc< ãyÒ7gṞç¬~´·Ï øaà>Sľèö¹ãœÁ=wŸMñ£½}~9gpÏÝgœswÂ} ÄX÷Y)våþ8NÍ×uñ¨”'®Žøy NeâÜsûàvÁ=·w™ö8^HpÏíCâ áç«:H^HpÏíÃfG,?¤ÜsûÐz!Nž°Ïµ°tŸ|/À©çöÙx†Àºæ}|ê„=_)˜çö)üB‚ynŸÔ;2êã4!Áœ°OüÌs;*À‘ùÈ.Pç#²`!ªÆ<µhñ ëwÏ톅ñÜspă| ±àMØáÒ݃|R±ÔÄ žÛaŽxB3â¼ ;zc™.u';ñÜŽY@aHŠJ»@×ð0Å’8âa> 7Y@ðÎ툔…ïÜŽZqÄ£|Ù²àMØÑ/<âù 〇§*†&».”q6ù*W4âúvÀCƒ®³Ä  Þ…dù0ìÇ‘#4h!…A> ÊPÍ<ÈG!F äˆ="•äs;˜)_ñ¨h'üŒðTED-$ÈçvÔT†–è>ЬrÄC|}•¯äs;Bk!A>·£¸ñŸ¨7vUgžÛa` (šªH1G¢EÓŽPk4bÀÙ‚yn¥9âá= \[H0&ìà¶…c€sÄ£L$·`žÛt ÆÅÚ9LÓ¾]lĈ½…8÷ÜêsÀCS÷·€ žÛ¡ Æ„>¸ žÛ!†ŽxdªÂ³Û媸`LØáŒŽxd*#Ôs;&r!A=·ã&ÐÊõÜ¿ÌWäñß!šŽxl*£8” ;Ðs!™Q¦Ôç‰(Ó¬ý(R’ï Ò…T¶Úò§×36u!-bS©fØP›ÊW<4UA° Æ„(» žÛÁ´ â¹pëH„úv-T»껿¸¥ˆMÍM?=0U‘¿ Ú¹¼§ÛÄxdª‚Œ¼s;y!A<·ƒ•Ï€æ…õÜzÎ0@³GSOžYD¦*xz!A=·¬óEÚîƒíˆG\3L;_‘=u‡r/$v¸·#.€ža!÷gØøB‚zn‡–/$vø¹#Aëü0¤íÞaì »Iî#ß9^Ùçv¸|¾ÈÚ½Cêq¤°û…aÂÍÏ× Â„¾ïHdH0Ä!Á<·Ó’™!1$Vgf+¦d¸¢•I k÷NIp 2$˜¶° LØ© „þàÈ‘"±cŠDdQ, v¢…#шÉN‘hD/rNWÏ휎…ñÜÎûpÄ{ÃÔdfª0}${¿F³ˆ§* e!õLUÉðÚÄF6‹.¹”ð²àÛI1 !ñófðÜ>eÖ,$˜ç”|³2Ï1?ÇÏ’T O†O©õGšOF‘üÈrÀ“$•,”Q€Á“$•P´òÎ)éÈ‘Y‰I !ïœr—BÞ9å7e/<° rm·’¤2Š×x¢¤©B¶æZ9`Ït¬…vN)[9‰¶[i]ŽX}¤~e”ÕˆVLËpÒyª¤2ÈÊ0[¿È9§´…*AijŽx¢¤RÙBÎ9¥»-„œsJ‰sdôGÚÜBl·ºxrÎ)ýΑ™z !眲ør*A— D?"Urèá…œsJ\9ç”T¸Ò%(ñБþLNÌI¤ÝJ`\HÛ©’sQªdÈÚTú‘*¹Sªdl?©ØN•¼ˆ.AI™ !]‚7ÏäÎ ¿m¤J2t!)Òû•$êH´b"éBH:Ç\ÓsNÙ¨ŽD¦dÑ4®Á— ¤ÖsN‰¯Žx¦$sc3Íž(©ôÙ…/aì-JœÝJÃ])çÆÞ´*)ç˜Í›S#ãœ~1æ sꓲ[iÃŽpO•Tj±#yÃñ“tsJN^éæ”Àìˆ1í9Äajm· 395Î)YÚ‘ÁìPL’»•qá¸ÏÌÁ®™_wâöH8§Ìîœ: ç˜üíÀdy˜‡©'6bùBònªTc·rÑB¾9å«g5f½ÇKuÒÍ)éÝûºóâ@º9åÎ/Dl ¶_Al {kîãÌÓ_ÈÜÙýz‡¹³û߂õâöm¤›o€#ƒd\«Fº9Ú/„| 4Œñ;èTi1ùælïúF¾9Q!82H©À·o·(ro·h‰ì~R3dz‰ì~•ªLâíÃCNÎÛ- ü ±DduqÂ1Idu¹HHªLq7 )ro·8+2jº¨ßrnζo·ø1ro·b$Õ DdK GFM—DRT„¸¡GÆZ#1¥æ$ãœmi6¯ÝŠrTÄÝ"ɨé’IRLÈ$yeíeBâ4ƒpNd'8gøP2ý:ÙX‹µkô‰WÅ‘Ék¸K‰·[ü,%] ‰U¸LΉçÅqÌDuÈ,ÞnÑÅdTuI"ÉBÆ×Í:“qrY‰„ðGQ— íQ t b¦‰ÁA™µJ¼F”st0;2ÈìÃG‰qN•ÝQ×ET?= ÕOã5C¬=•—ÌÍÚj±öÄp¡Ö ÅheQw‹fÈ‘)n"^#¹`+ʨëT?$4ÊYÌÝ"=rÄH¦TyøæÈ”QØ…@l¾ŒLI¾$Â9ùtPØå"#ÔLBŒŒPƒ×ˆpNŠHs·X£d„âˆfÎu ©˜»EPåÈ“Ã*£ÔK#û: »dv'ô+ äé Ý>‹¸[^üœEÜ-Î-G&Y¸:¯á\Pwå,Þn±{å,Þn€9bäã¨òÍIuBY—‹½IY;•„³h»ÅX–QÖå"ó½ˆn®jÐEÛ-v´œEÛ­p-G‚n.HÖ2ê¼4’·…³ e]ð#ÑÍÉg‡:/Mün|…©F× F±e£Î‹èæÂ/‰ÐÑÍ!d’1ߥŠn®è»TÑÍI!DY— ›#ž#|Te#ÑÍ©Þøàv(òÒùïüLU\s$ïËY¬Ý"øsÄÈI8y¸æ¤x¢¤K"KaXó@9 CL¢È oÃ×Ä5—õá¢ôEßÔ†9·¢FÄ5'·ti·Xsn"› ¢Åœ›¸æ¿çÈd‡Cüæ&®¹¬¯ÛÄ5—õuÛ“?Ù„Ad9“°[ô’L6 »¸æHS™sל¿YŒÝ:nsÄHeÉÝÅ5' 0NY¹=£ÌK-'R©<‘qÆétŽ(KÍ;òdG݈ì¨'òëF&õ$é/öî™ùDmÓÉŸòæ8RI*è_OD„4Н‘!u#FÓT1Á@¬œÈ Jp#ó“ހ͙¥×¤Ý( °q"™ÒëF ¥×íDÈßý@mS¦92Ó‰t ©£z"ó…×Ìݨ˜ÙŸH}÷I4Mo$S!x"–N¤|Ô(~WZ¦`7  ½ZȈzf`ÔOgPÓ%µ72ʉLÊŸ¤‹šÀ™'v£Ð®Z¢õÆ<‘B©u#•bë‰Ìv"2èF:²?dÔt¹ò±\72)¸žÈÙ(_\7’(¸; ÖO$S¸‘B=à‰Œ|"•Fé´O~!·ÎÑ2-¨0Ê­'rëFdA݈,¨'6éFÊE›” U]J:‘üúI©u#å‡&õõ“òçFd<)b]®þF¬=¿ýúëoýí÷ßJ‰x½†\þµç:IþzÓ”¢nå~óõw_¿ûÏ Âõÿí[úú«õÿþv}ýå·ßá«_kë¹ðßgÞ?~ýÛo%5:|ªWLÒYY=ÂÂå7b‘Õú@F¤>‘HÌ| 3o10ã]•5¨F1ãB‹ï9™ºV¬ &ø\ýIHΤú‰¯îbg´Ì±@Ö²î)f­€Œã^;#Ä ²ª«#WA°Éæ|@¼sŽ ±Ë€$ã^Q‚Þ{Ü9v+¤²×LCƒH0&z™Îh5IHhLß(HÇw¾?#]G«"õjdOINWWƒ@v2¸:ÉoSœ†£ã\BJp™m†¥¾8sÄ"4§€ ëZbŠG·àºr…/žÔI%…°ÂxTŸäw!ú ¨ œË/“¥€?Â'JΜL`sò‰\A“}*ÆxFUEk™ì?æˆf;¨3zªø`ªqÎ,èF”ŒTžØáÀæ­ÂX¢n“ ¶blVQH'Õ•Ÿ%•éÌ7Ö”:YÀs¡)Æãl% ý*¤œ) nðA¯I÷-½ò(¤€kÀ½J^!—¿› oP‘*ô]Wéé>æá·ùß>ægBéÔ>æyéÊ>æÖb«ªHöAWêŠ,\ôц¬Hs5•ùAEÒ(ø×šòÈ+²2ݬ±Çऋß5š Ï&{6‰Äß_⦧Cy_|fU$œ9—cçR¨ÈèÊ>4ÙX‘1uÕø,5ewB˜6Ñ({Ƈ¯Ÿ×ÄÕVåd®HZñ•™,‚€*²BœÃÊÈU¡8:é.ãÎÝ£Ú ±?1 HÀ #ÆÑghE`>=Ù-Q‚¾¨2âºBq0{8ûÿGÞ»ôl’#×Áûúµs÷¢ËÉ;¹ðÆ€`XðFR^^ÒŒlákÓ˜ÿþ—ç|2Y€gÚ²W– t½GOd2™LÆ…'Ä¿S\†V‘ ?´ú IB³üèHì™Èr2cE’,iºÕÏHQZ"¨B¸ÛU$~’¾c8ÆR‘WYMè¿ta9¤:èòbX™O=Xa8NWŠ]g(·©³>‰€û­¤5ÝÐä29CEúµUôAW˜ŽÓ•@ú x”úî ‰Š ™ê>¬~ÒãàÒÕÛ–#}°ê} â0–~NõYËô¹V^o8;,2³ã1—Ofª3Ë+,Ç5Æy…å8æÃ€¯8½iáað^8)ë8ìüAŠ»á>TXŽs¾G&?HsàïƒtÅÕ€ÂV`8*ôA¦£.ı²;ØH»ì›?û¾$Ù¿ $üËÉÃþüµ€³äÞ%îÕq}½ßäõƳ¼X©üËc—k—1€ßz•T±ÆÿEW±­ý¸J ¿å*¶W ä7\%¶ÀǼò[®rÌåy]åúúO÷ N¼ÄWÿç~ùúïþòoÿ–Õ´pxþýèVþä+òƽÑ5z¶ëëÏ¿|ù/?ütŸ?þT2KL~¸?íûæ×ôÿaôü!ùÿƒLàûöãýù¯¿üÕÏ_þük¾®{®×,dÀ¦ç&ö—,–ﮬ­cÍÿ…WáQz]ÅÈoº «Òó*F~ËUj¢Öó*ü¦«àh½þÍß@»êŸû6=]ÏOn2¸)‘ZçOó?þË÷O¿þˆ#°{Sûáïÿø»üúwøÓßÿzÿ÷¯~ýõüúõ÷?">vþÃýÇ?!ܲæ?üžÓ¥{ñNðÂo{é~+÷vt#ÿøå‡”üùŸßãA9z»½ÎϾþ»¯à!XýóÛØW~Â¯Ûæø)±ÙÝ ÀŸðC¾§ÿëáÍ÷KûÁùÅŸÛ¶§l“þó½¢W ¶ÕĠб}IÄýn°`þöϤ›¡œõC¿ PHŸ"}>Ÿ‡üKN—dEJ^ÒÈÿ¶ @ y*aÐ7­³?þzg(»¼òú—j0?ÿ§/?üþ¿ÿñ^y?þ½ÖÝLý¿’ò Iù„¤ýD:ðŸ~ ŽO?×¥ǧˆãÓOÄ¥ËÄñéâøôqNöq€úD€úÌ#RºÔ$Ôd½#¥ þ ~ 눔îõ‰õ‰õéG¤ô¡ÞÈŽPˆPodG¨wœö¡d+å¡òŒP™Ç¼ÿ?¡N`EiékMÿÇC ŽãmÌVÀÐÝ$r;—ü@XDúBÆSÊÈíà½Ö|¿¿Èz“Ü/„zñ@Ö{83'U¾“" É !IÊ áaè !mÞfžÉ ¡â>cNE;øD)–d¼TT‰/„ 2ßC^ìÜðB õ`ÃaDá…t9È|?èâÉõ !õÛ¬cÈlÝð@À)UÒ9ÿ„Šz! x¼V½H?~Ãî /¤}'E Ò´¯Âî 21Ã4{ŒÈÈ|Gµ/$R)}'Åö /„lž²Þ!ÒãñÖ1œ~Î)xHO`?a7€Âö OD<¤2ÞWqò ¡u{ ï›g¾½*¯ïçÌí;©þ|_[8¼†²Ž‡@Ôí ølòs ¯ú °…ì÷ˆ [8¼2‘¾¶p8ñqaXð…à¨ÿÆ1ôpxìáp ‡P½mÄ‹v"ó}e1‘¾rh# ï›W6qx!íœRP‘¾~(#0K½•u< ÿ²e„é[eq‘¾tL©¢&ò˜ø_HýN¨ ÌRo]”Õà@æñ ã° `žÌc8ëP`à’Ê'põt(0K½Xé )‡Qg¡÷"=À·ê§þ:¶»>NýÕç©¿ú:5Q_§& š¿ÒWÈ¡‰{Ì:S¨žBíTDj«ñBúadq‘È¡ˆÆ<‘¸HŸÈ¼Ž?Op‘žÀ¡»DEúBÊiÌzª¡É¼ºÒN{@\¤rÜjœºkÎSw! ì ¬S ­ëÔB‹G"/$æÀʧZùÔB‹ S/¤~'U¿“j‡ZýÔ]â"}!ã´Ö<ÕÐb+‡yÛE\¤/$½Õ€qü$º«°%ϼÕN‡êx#LA;·9v©vŒ˜ÍdwŸßI®×$µ+z!éP^@ÞzÁ‰·¿T©o¤ö·¿T9~sºR@N©ñí¸ÕéJy+¢"6Ò'"6Òy+"ðK½QéœRå;©Ã•ðÖDEt¤/¤u yš¨ˆô…¬sNó:¥Êuè/0J½õW!!é ȇIF©kœÈÛ=-"$}!í0 Šú‰½~¨0¤z¼Uy ùp¦KëDÞî)8¦ÞÚSomäíž‚cêíž‚cê”:)pL½Žyß:¬ë¶ž®¦Þꨈ”ô@Æ1˜u¨#0J½Õ·ÇÔ)•¿“:|)„ßîi+é¼­pL½õ8¦r=‘cFÛøNêô¥€¬cÈëÐb…̤ðÖGà˜zë#pL½ýÓ"fÒ9ôQ?)¤—¼µSªŸZ¬Î€·ZÄMúBÖa9Ò¸ÿ´ˆ›ô@N©Ó›BÐøPc£œjŒä¤/àô¦€¼Ô¢N°/dœsмür"‡ëTcó:¥æéNfêʇ‡ZÄOúBÊ©f=Ò¬‡‡ š©Sª'uúSÄ Iü¤r y i]§B?é I眮üÔéP!»äPH«žjL¥r\¸Ÿ I¥r˜kž i­S!­u¨1\¼¥ªúÈ[hêí¤Vr”ÀÛ4ÑÔÛIÑTî'²ŽáœNNVr;‘u yjŒ °ï!§ëøóðRA5õöRA,õVHUÇ/äôªpðsJÕï¤N¯ ÄRo…TÅQúBÆ·ã2óPH@æ1œuÎh¾N)µd{!§[…2Ô·«â(}!å0 @5UNàí©V±”¾~Îi‡BÒßÌCXê”:Ý*PM½ˆ¥Þ®j%Oé ȇB±Ô[!y»ªÈ;¥ÚwR§_ª©·«â)=u<ÄüvÜ|®jOéOé 9ý* ëøM>Ô¨¦Þj ÄRo…d¼‡\ÛÇW]Bú·ï€­ŒŒ¯jd~|ÕœR¿JH{øUÙjÌHú˜F~ÕFÖ(_ÕHýÌéFÖ1œ‡_eäáWm$¤X•ª˜J_Èǯ äãW}0 Œ©ô¤­>H(¤@>~U eK±Ž‹HHòñ«ùøU$Lƒ@ú6 RH3þ’6òŸÓ³é?×ë·ëõÛqYm¹-bJjë‰Hm}lSàƒû¦&H(~–oúDÆhžC·]I ”ºÆ‰ôã7ÊË5u ÕâW?‘á!ßkÙ7Ýȼì›Nwû2ÓIß|™ªùšÙ¾é™¹ç8¦ÚGÊÌD¦Ÿ³ky‹›ô…t[îvCdyÄÓ×Ö@dÚpUâx¼ËYÖ?&íH`˜*Rü-µÜšS!£Öä ˜’ÎrŸ:)iH‘cºÜC¾Š™”H³T³`Â"¾U×ì­nÇtÅÖ¹†UÖŠo̤–bj¸€3¡hžÊg\¢ B•µ{È7“ÖÝH)`ŠÊÑù•ü-"Y~©èÚˆ”oÒ[iÊ-¬»÷SÅïm2£Š)j¬a^'"2qUj"&­»UB?uÏp1z7ÝÒaÞ6"´¢ Vjâ&­l•%ܤJ €néÈñ˜)Ia E&TcX-ªžèÿ•@3E…5L_šÀ:@…ňЦŒMHæêæ½MH©¡W:LæK„^é0)Ej¤&%ã³5ÌMd È~î%}5L¾Ào@}5LN„šg˜ó¦¼¦® "ìïPÁ¡!û…½m1榲åÄðþ»_qï)§©÷Êm²½C›˜•Ðd{‡Úå/!+i“”¿ÄÉö7²lô#ÚÇæÁ¤E\Y_ã§Z’5öŠ)§©wæKØè(äΆ »tWaí5Ñ’VÐay.¾µÙÃb{‡©¡  è+Jy<í¢%½‘ŸãR®k_[-9M}¥X_KNS_[É,OÝHÛW/é ŒXÜK®j„¼;,¶w¸ý¤m¹‰—ôF²oÕÅKz#ñØ ¡‡†N‰‰°ßÚL1xöÉ­¹yº •ÌëÆü`J%÷â#‚á¨P€œ(PÈI v‘“Þˆ[dA0ĨN„nÄͶQ袑ݦœæ¥NÕ×Y–ZV¯ØX)U’ZC9”ö/lµÐ`£ˆH(uÒ“VPѤ À em„Öáí2&ï‹Øzá—ŽûCÿ 0F­~5]ô¤7Ò7"' tzž¯Ä4ùÛ÷¼¼”±?C |ÖFäD¡8Kw‡î-öÝt"3Ì·»zÙÎÀm4zì@ F¯aƒ‡ÙÎÅR+Þx.’Ú®6yh£1Šx¬x¡ÆhÞuºèIodÄk =é ¸•Y‚€6B阌~ ÐF ô"=éÄ7ÓEOz#a?63|8èè°±Â+þ€+l| ”Z-&L ¥7I/ô£æ¥>tüžé¼ÂÚì¢(½‘+R:çFÜ®4Aç@¹´Í<Ó™ÂAtØL%¦½LI%ó6šiì{Éš :©$œ«SD´F0À\â WÚI7ŠÊ Úhf·¨%×t–0'¡ß0¥³¸mrBÁ=¥Ê`•#5Ëþ`+{<ÜÈŠi¯ìñPQçI–V¼‘jeÝ+©Y»õ0Ô$|ÓY§ý±®ÕÙR¬ÑQÝH±šë=*ÊúäƒYüI”+”Øì—-"(WJõ;J“+5UjJlöÞØã¡ÎqŘQ~ x'u4‡ÉÞt4œÓ k@óÕØã¡ÎyÅNÞ†ætºFB­jåo>Ñ/5§{ØCÝ¡÷‡Î<^Ö]¾Ô\a)Á,¯æPýßȺL“ºfåFjì” ëFzÌ`'¥`÷§P0 Ä–i< P(¹qít ¥±/#_jeÓÈ݈|©•Ë-ÇqW±K£XñPƒ-ê*Ùº´Ñ*a«öAëFö͇’]W½lÜ¡T-Žwñ‹ÞH·ÃƒÚhÕ½Ü[<Ô…TYK±Åô˜åõ–Þˆ[<Ôþ #ìñPQ‚i`jFrì@­‘â#ìòp#5Üd›‡ö÷€Pj^ñeMRÊßHõ?ɯXAgÍ<Ùæ¡®u…Ο`\¼«}²ÍÄ-Ø'k­Úu…å×µ‚o$ì<]·kà„!Ó§jWJ±1NþFj¨„I+úFÔ"1‘à¶Ü@vW"÷Ho¤Æ$/ty¸)ÀÓíÖ²í*áÓ˜ÃhŠi ª¹FSöòZt©ÚU÷ ^t©êJ½ ®*©^ LÀŒ»6«E—êFöÞ¹èRµ«§}/¶y¸sÞn@¯/ËRµv¬&Š †dÁ`F-f±ÍØ”%Á´¤Ô,ÞPÆ•$…ð®Cª]+œ “¾š7q±ÍÃ,ïŠC»DKW @&€nÃf\¬¥k)Ū€ÍŠMÉ «‰`FSš{€\U-刮MøMvD"÷,µTÜööF¸!ÝHõ&MÛ·‰È8…!×ì`êHìóp#Ý{òà6ÖÒý:}«Ä"ÿ‰`*ø;†Ó¦w˜ÐÚÃlB©ÞýÁª¦Ôm4]ª‰½ŠTÍHèB 㙡jF¢"o¨(ó›H®·ÍI``8Ë$‰ œÓeÞÉsýB­“t,€[…5T$i™ ‡4Ç™¡×†ò™$@î7ÛP—ãÅ”éP5”ÏxF3ù“Š\ô=Y¸y1ƒdÓ.\". ¿ c4eÅŒfl åÓ2ìóÐP&á ÍKBѯ„h³r´pLC+¦¡Z@Ï]€lÈéŸF¨M;§@ŒH¸‡†Tv/ŠÂ> )è½ ŪN „æ°…2 ½©†Ìk¿…Boª!?ZŽ<™ŠGXË&ú(löБ¼j ·&jHŽñ±Ü´1¿W÷yhC®t`~óß Š¨!éÕ«Eäš-E2ÙŽA+&¡bÞ·—é^u­ˆÍÇÈ€kkŒJgª!ý1ùʬ†mÈe )²`4fŽ@pá†<¯‚á´ý‰WözhHÄÛdz‹oµ]’éË:p4Rj7ä«yö-솴²l„ñ±†1 ±V·!Ë/ª‘££!ýÊ+¿±ÓCC–”?^òØK–F³Âýƒ#xßéEqkvzhÈ ò–ÔØé¡!Ãg¡+ÕŠ“ЕjHªi¹—Kc2ŒN‘Æ,# (7dŸxABM!‹ÄóÛ™kl4¦'èE"¥Ø x³Èµð¼tºQ ºüºQ é^œf|«â82K ozS TP>G72©‚jôï$S Fïæ_—‰ŽîiŒKB½ÆcG0â™afá!Ç#Æa~3Â:½U÷1 Ñ¡@n…FÒ¹Zß¡O «ñ2.<Ío}…ï;+OˆHõ\J_+: ÑÉ5"þ‰LðHøû­dW¸½&Eñ§·ÕYiÞÜÑ-Bç›×ô„×a‘Ë[<áßè\ñÅêÁ&_‡1zÄÈ ½y6ùMt¾5|t'B|™Æ=3îí¦‘WA/EO€·åõâš<'¼mLX‹U+Ÿ!”WÍÜÈÊZYÃ='D<üš@‡¹´ýR‰¸d=¡Ä \èu¢624½ª¾?C'¯‚¾)ÿ&Y*òT×°.ûP=;ž„‹b?°ùʸQ‹°òBcŒ¶…ù¼pxN§4l0ö7£Sš¼E¡Sг=fº$UÔ•( ªrÛ´Š3¤ŠpTBO6GØg¥"§Ç5)÷]{ÐB܆a€eã,tJ¯S“š&ôJ^6 Cˆ[¬ï)ɇB "®Ì4󆂯ìßLIêJ€|(Vºµ@ ‰Pg§3'žå Ú1öûÅó)Ò²âo("T.êsY™*Ã5~îÌdN†t·B©vx1)Õ’?²•åC!z䕤P %·!Õ©¿…ò+ÏÔØŒTuKMh"³60ðЇ"·B+âõR.ÍèXþ"eŸà Öè™`3â)S¶ª2Ô ·ayPê]Fx–ÂÀß €ÔYM«4RW·•»‡aˆ±XŸY 1^± m˜LF¦¤3©3üDtb uDŽÎÓŠƒ¢ÚÑWMФŽýzÕØª£Ä_"²­Ä0áIÝYËa4û´d©V Œ¿ * ‘^Ed0”ÚÂÆaž¤"®³*)êC:ˆ>Ÿ<(pÅ…i¶\#¹F\"Ùv52Ô1 í}¬1ÕH®Ô™” ÊQ°Z‘Tn±‹6yPŒ¯ ’+/œFVåýy4²*4°p­0´_o[ѯN0_wjBSd§/w40”yúÚ’ÐÕãývƒ50¦)º Š ÌkÞ]:7‘–wˆ‡¡°@úæïE') äqŸ®„Î["xrìñî}#%ž‡ÃÓ½j½éáPañøÄ«¢“Ÿ®×ϯ³Ë‡Â¡KÜJ>TR8ÌÈâQͲ®]‘Þø»ä§C[‹Ð#é¼G¾Îsᔦ±÷âA~ºI±ýñø§ÇÞÒîÚÀîoU<äAá¨ÉO=HNw#‘½Š+õbÃn 9Q8²º<¶¡½~í[ó¤¥9¯ìË`x‘Œ¥ó¼¹´‹rž–ùsž—±”$ËD ž¶ð#×”•êŒÙUœýFFŒn’LgwÞ€&Én¤úàfQÝ@±!þ(ŽýmÌ® ­açá,œç†ËÆ!æ•ý]N9P©Dæ÷šL[k`╉ôË'’Þ–<¨´ÏJÖJ:Ì+)öºEfºÇÉ&‡Fø|­âÒÈYäÑ<€a‹Osø›k5 U¿ºÕ}¨Zó„ƒWï}‹¼t Ä~½kêP5-;©@x¨š"PÊgÌDrúf¾ô¡ßˆÓ¦ˆ@qí˜û÷$ 9*rŸR².&²xTlôFx$Âfšé‡ßr!Ýôož•B.ºiò£o„+‰I!µõukŒ t褒,ÍU!]±¹f³0ÒÒÐʫԌf¬T…˜¢ããlMáOªª«9ž#Sù<Í32g˜ÏÓRL^‘Ä쯸z)Ÿ§.Õo$)¡'Îñ‰0¡§Zofdàà2µÅtV9Lø¯¿óZ,”c®@ÌÀqÄLñ© ¿Ê*‡éRŒ”HwPߣÊç)->‰:”ÏS©»‘©|žâжŒçã„Ç€‰P*¯ØdÚ%©bÏÌHäOâ#2˜Çìƒù 3Žù½—«”3L=Nèe?€Š#ær'Ã>¬L½žúS ts9=†ÈdÞµÓr7B¼Ëw¢Àm‚bIÄŽ5U°gÓÀ—_ Iý®jMÜ&":„Ä—‘b)»ùDVQʹ¶ßd:ï9÷L$1Ð!Ò?}/ f¬˜<“yóü@œÄ@‡3†ä[‹7aŽr.‡C2<šàDê0™ÊÇ$›úÁW®xl9YÊç7ÞJr¾þÚF×éâ`Ê{ÉËbMà±ÒFPž‚£§bDôss›ZÈ?E¡ δÒFXK!V"¢ŸÃ‰šW‰©¼qè67ªåÿýNó‡ÃZé c©ø#žAÌ 8ö*(bN˜‘bM„E5é\/'¥ V@ëV::aé‰WzM.OYñ"ÌåÃnYNˆ@wሗ€XˆÄsH:õƒ/Ï!1ÕËx‰AÙ¬ñ*?:™Ïˆ?óy#sÖo|‰xÙµ6æ–ˆç“k=c>o¦íò:Ù|ÞÈõ•§€Æ/(•d¥ëFXBk§ŒóˆJÄ µÐE£‡9 ËÃHµTýæë6 ™ €Èd%®Ïî3ŽGZUµ®6*YÀ&@¾uÝÈʪñm¾yç¶=<>ñÎ!Ù[fNiÞËpZÓ\äE!­\ ôsшvùêú€Ñõúkˆ¸—ˆ¼($·À1e²¼±Îvňùƒ?7M´K¦3º¾Tcxw°—k#’ŠÀ]6›7êä!e³y»úÀȬ*ê–'ƒ#2˜¨b6ÍfóFéƒßC&ëj#üàY¬s¬¨ÐͳPuáW…Ê3wßI^Ô(ae“y£D›Öú—0P!ÃZÿbêœMæÍÿF¤s([=ÁøËF>N«*éµO¢Ð†UûyÆ'#.ï‘Çþ‰Ü(TâÄOŠ…šU'•úWïÙ\Þ¨’ù–Íå=rØB,êa©Šg(¢O@URü†œs›U€«öñêLú§á=¥A”ÙS\–eZü¤ŠÕXþMk¸R ¬ôOaæà¤Wä IUEG…÷º¼á¡é üR”yT‘'\3VR5yÂ5bµqÉ^Ýaô€¡öºÂ~Á14µ×U½…gy²~ ºr¬ó*ö¹ÉVçÛ‰ ˜BÖ™ê 5Rd¹0a^F×d o[-[ˆF‘"¡FfÓx#‹Ñߪi¼‘Å訉}YŒ—¥DœÀüØIg‚t#£ Ig¦/+Ö$â.?ÀÒŸ—Ÿpù÷áüfx³45°(d毌„ÿDÊ|F¯ÿÌÛ‘ ¼ÄoÄ=‡´G¿‹4U¹~i!­:¹çÄœ<qÏ!3Ò¯ ‹{®«eŠ‘ù KÉÙüÝȕ̾·<(¦T¯@à”²ò™ÀeBW¨:Ów³¢zB¶™$mÁ§P‡ƒ” ȸibr{7R0§¯+ê9–’o„´?Ý…£í_HûÓÃhËfïf»QÏ!q3F,ÊÔÃ{¢L@j»÷ØIê9Ú÷HQÓzhÌ)ê¹Mª“Ñï…@ ½aònh4Ê"¯}»ÞYìbäï±®›bL`Gj_§™¿'ÂY™æ•t=ò÷ÔÔ’÷*ùO@¼$EÞÝkĂІHíñÊ—¸ç@Û`åbòn$¨ÊyË&ï6ýqÏ¡VÁ¾Ä˜€$VïÕKäs½Æ ú½T~{æîaE€2e›‹ÜsÌ„õOä>±ë÷djÄL,ñ%ñþ³Ä—ÐÕjÌé{JqèÿBúž¢ŠûŒn/œÐR-DB¡Øt%¡8î*bîFyH]@~dú'âž#EI"ºäî*D\Ìܽ‰±22¾:I¹œ$•Ñí¥±iiºÐí…3šmBDR¡!™KfR.í×(½ÈÊÕí!GXó÷€n/P[@<Iüs¬žéÀ#Rüñ%ô(ùʨ3MUˆÖ$Éá„1ƒþ/- ñœ&ñÏ!IY«´˜»{s–å"în°âtßJüs]lÜF&ÉÐTY”‹©»xº²èçÀÇ#kµdÓÏ¥8E%,éçÒˆiϦŸ ž"T]©;¼WLÝ D ·d3Ð%³•Üomî\LÜ݃&w÷¶Z½.x∈®ØwCóqÉ™z)— t{Ùæ%õÀÍ_$•ã•—´y뤾J1]œé” tqPPJ0Ð]Þ€ÐØa4i&ÍÓÑZ½îr"Î(Î}¯.©+cÅÄÝ›ŽuÑe‹½_¨¿®ˆ¡ÕK {¦˜·%iþ`ÍÛ D·®& »Fܺš€.؉PË@ƒ©& »â•ÎÔ_W…Së–ò;¯& »Z,%Ñvð']M@wµX[ÕtW³ÍˆV/´‚ïUÑUc¡TÐ]Õ[)Z½hFÃVRÕˆ è`Ÿ 0ÿ\-¡þºÌ*–Ñü…ètÎ\ÌÚM$BºË©Ã5ÞÝRRƒèôB“à*ñäÍtW„,‹Y»{½f¤S]{jkK娊6 Înü-o}^H?w…M dÌ7bú¹bú¹+Û”Bú¹R-õAL?÷¸ŽéçˆéçˆéçcýÜ0ýÜç1Å>÷˜š.ö¹2®sB‡Øç“n o Í¿‘õxy£l)¿à!ö¹Ç"…÷c˜Âû±”†Øçˆ¬@h\ÈFBzõª-~±Ïõ(g BýõYëcm)óÚRþf¦Øçúat¤Ã·`Õx&éçøyÆßÓß«'gŠ}îñMO±Ï=>ûY=¥=žÜÞ@¬¿LáýØPf7}êÞtæ0}jD—‹)¼(X4¼m!L±Ï=ö»%ö9 €ùmÚ$G £½6Ò%ö9– é¡ä‘UDR3,(“x÷+ЋI¼IX¡AðÙúY˜LÀF–|X"6 –Øç:eMϨ2Z¼äàsM„ú’éQMâ D:¥Êë&¢P7Ý@Ó¡«H¼7Q,õÒ¦húÒ­q™„œQç!“ t0 ¨Š’ˉP%NÔs›6W•mÉ#ñÒþÕÞ@¤¶Á+AÏtÛ @¦}­èùB=”Š}à*ªI™Ð1 îÛŒò–ÒÇŠ/!ÔR ³=m´|¡òJfXÊà´È¶{<IÌs@¦GLæ9Kþ‰˜çººÌ¡=€Aø–ç³j×WÕPŠ8#5Þˆˆç>–ú»„”çØÞo„®éñ_™Äso`Ì7"â¹'"â¹7rJÙ‘zÜÜŽÔ ¡úú ¹Šw®ï3D cø{нMâýøˆjÞRJ:Rž?óx?>XóxÇ]E:÷øä«HçH…j„¤s]]˜ Lï.rÐ쥽lu­äñÚ¶ê´ÔÞÚªXç€èD“õsý뇛Èòn<$›‘øˆÖ.tL¯åX(z»\ÞÔ½#¶òm<÷}ïÉÝ@ÞÿF*H_O­ƒÖ.¡½¦/<¶öj%Ð^Ù×™Ö^Ý¡B´vI¡JS ÓªTy¡höò$Ï`IÖþ¾yOrL·=€¢Åö4!jyoã‘·ú€©V^6ÄÑØ%Û~¹r ëerÕàñÞÆ)ol6úËz8èh÷HµÈ23zö· C·ŠZ_¯õª¨›´=Wu™ âU,Þ×ËX­ˆ(ÆN²"Ä«vTuôPHÇÈà%:š:zD ®j­ðaž'bÀëÑ$Þ@dAT“x“Å9ÂŽûLe«ì豆 šjo0¥È—­&ñnægÈèú†ˬ–ì@Eüú^j3«7G0îç*o^糪¡GPC‘;Tdp ±¡Çr²_5…w ‚‰Œâ\öóX‘„ý<ÖÞçT? ªÈèò’ÔXÀª.õóX‘ýŒ6/Õ¿±Xê°ý °Ÿ‡bŽD²úy¬;±îI$ÀvkoR&ð&g¸a5µóXÛj 0;,(ÐYù:Ø’ZC9‚5Èpù™¦Úy̹ï½,ök5w›®ÊÍüÝ(a×’@“¶ó˜Qƒ&/ìç,#DØšcÆa xœê£ÕDnòˆh;"¡ðÝ x4Ów³«Å„ý<°Z ·óˆÒœ¦x ­›föîÔ)RêÌU“ÑLÄ£®yôáÈèúÒܽCŽO{÷nÞA ÚyT#Åí<"9¼ÉÖ`WµµópAxnfïnAÅ•Q¯vN>¡Õåæ"× d¨!É40ÝÍ#ÒÐÑãårÓ’º i®ò¥fóŠÑå¤~3ö¾¦„*"²Sšú1Ñ·2-öó˜±a?)ðhúÂ~Ã-52Èò£[ éŸxÀâîÞ-^2Z¼°G n¨—ǘ{¸rZ°|äfâîÝJ†Èr/QMïOšŒþ.Å]ktaN¬fÒn²^é>¥l  ­¸ËÇnÎn¶Æ1"¯©IFk—Ë=w<üÒÕÒ+Zþîëß|ù›/ø‚ôËë^ó‡ëØpK¾¾–[!}ýõw_ÿó×ù‚`M¿Ÿü~I_ÿúþ¿þr}ý_þð£ëþP/üï·õùã~ùòi±.‚ª_>ÁÔ”UÀo½ÊF cèDþW ’ìÏUù-WqÕâã*ü†«œ³ð@^W¹¾þÓýj/ñÕÿù‡_¾þûŸ¿üÛ¿E¦2ã"?ÿþ >@þä+2H×ýù&­¯?ÿòå¿üpýøS-Ìdú¡ÝÿdÂrú!Ýp!AÒú!µÿëÏýå¯~þòg'™Ê¶„4F\ÎÁ4~Ö·={Mþ†«ªh>¯bä·\…å«·Vù\%ßt¶WíÏ«ùMWñ\>®òžÝÿÅ¢À‘ѽ&pñYð?_Âõ‘E_¡±áwÜ«^+ãÛu¯¤(âŸÿœ÷?ÓM4_¿}•ìË&?¾{mĹíçÙùoÏ݉;Ó}!ü³5~"å³Äãßü ä°aý¹ÇóôøvxFFŽÛPð·óÿå¿û§_„å/ªþþ¿ûǯ÷‡?ýý¯÷ÿê×_ÿǯ_ÿ#Ž3¯Ñ¸ÿøñ'Ì4ê¿çdé^¼>I$yü£ïFþñË9ýøó?¿ÇƒTüÛ¤ÿúùÑ×÷7H߯‡ÿò°®[Aÿ”Hï?(ð'üo‰+‰^Е¬¬¸/ÜE4“’úÿkö÷ã•ý¢–Y×ëµB‹1=_ôFô¢áj'Žéí+*dîwƒåò·~$4nȈ•¥"®f’>g”àŸ‡üKN—lJ«}\ÒÈÿþ|b”F#;·iýñׂ-·®üß~Ç¥ëóðóúòÃïÿûï•÷ã¿Ñký×ÍÔhÏ6êFÞ“¸^_È8š¯y7_G^ó»ùzr9ÜyuN²_H:Ú¨'—Ã=‘üTùNª“löÒŽæëÉåpoä¸ð8š¯'—ý‘cNç:¥Öå>­OäÝ|™ÍïæëÉõpoäÝ|=É©}!õ[>y §ÍבȜû‰Ì÷ƒ*JðBæÑ|È:†¼ŽæëHm~7_Ï×ùçÑ|‰ÍïæëYáéÇoêÑ(<ë˜ë@ÞÍ׳b_/dÍ׳kâžÈüv\fmÔ³¢‡O$]nÕúAÒ)•ÒwRùh¾žÕ=wóõ울'Ò¾•XÇpú9§H9uüd}‘Úü]÷F޽בÚüî½ýöU÷ÊÑE‰Ìï.ê@Æû9sûNª'ÕÞëÈm~÷^Ï®‹{#ëxˆõ퇽‘cNQ÷òÑz,Lï—r´^Ï.‹{"íh½ž•SöBú§õº‘ñí;`ÙßÞsS–‚;/äª×¡ÊüÖF@æûÊ.‹{"åÐF@Þ7¯õ텤첸7rü¤Ê(+=ñ@Öñ s7^dÊÙÌoe”]÷DÒ1¥-ÊÈ{4­ºÙ̧P=4ò›ßº(+•ô@æñ ã° âü0á¬C!§9ŸÀ!ÔÓ¡ÀäüV`ÙEqO¤F’œËq¯öíÐFªŠ{ýÔ_Çv×Ç©¿ú<õW_§&êëÔDÊm~!É=ØŸÈ¡‰F>4Ñ(îÁþDN¡z µSv*"—Ä=‘q@E4橈\÷@P÷úóAðäÝå’¸'RN{`ÖS Íê&ì¤ö€KâÞÈq«qê®9OÝ…’¸7°N-´®S ­KG6$æÀʧZùÔBKÌ"O¤~'U¿“j‡ZýÔ].‰{"ã´Ö<ÕгÈyÛÅ%qO$½Õ€qü$º Íßo5TDðÿBÄ,òFÞæ@QóÒ"f‘7²Ž»Ïï¤NW Èk’Ùç@Ò¡¼€¼õ™9ßCNby"õ°€¼õRœËñ›Ó•rJoÇ­NW È[Å=Ž‘·"BŽó[Ž‘Sª|'u¸R%Ÿ®TqUÜé‡EdC‡&*®Š{"ëœÓ¼N©rú 9ÍoýUT÷òa §ù'òvO‹ËâžH;L óN?Tršß* È<†|8SE\âòvOÙ‰é=äšmäíž"Ïùíž"Ïù”:)ä9¿òœß:¬ë¶ž®²œß꨸2îŒc0ëPGE„íòVbl8uHåï¤_ª¨Rö…ÔÃ*(®{"íÐGHsÎõDŽmã;©Ó—*íô¥çüÖbEroà­èüÖGEEÌ/¤†CõÓ™BZó[‹±G×!ÕO-Ög ÀÛ?-.‘{"ë° € I=J^H:çt¤ï¤No ™Î‡åTc*’{§7äí V¾qÎ阧B§;…LçCÍ딚§;Eâï7µ¸JS!Íz*$¥¼öTÿNêô§Ê<ý©â*¹7r y i]§Br•ÜIçœ*Íå@5¶N‡ ‡‡s™Ü9.ÜO…ä:¹7r˜kž IôòVcUÍS^H:¤€¼Õ²ßNjU¡Üx›U©m/¤Nju¡Ü9*$<çv"ëò<ÔNÿÞ ©¦ëøóðR«’+_H>RÕQÒ 9½ªª¤×9¥N¯ª¦Ó«ª.“{"ãÛq™y($ óÎ:gTEurHåÓ­BÂó[U×É=‘rHx.'ðöT«+åžH?ç4C!Õ|ºUHx.ǃ®ï¤N· Ïo…„ôæ·«ZU)÷ò¡ªjHäíª"ãù”jßI~2žßj¬ºRî¬ã!æ·ãæëpU«KåˆKåžÈéWU•¿|¨1¤<¿Õrœß ©ŠBì…´ÃW­ª•{ãÎ8|Uä8§~"§ÔéW!Çù­€¼ÕXu­Ü9ý* ïYnåðU«‹åÞÈ:†súUµ~UUÁû ‡CÖs9†|úUÕÕrDårO  È[!!ëù­Æªèä”:ý*d9 ÉårO¤¦òž¿…är¹'²N¡u ëÔb#ZÌårO$–2Ÿß®*òœß®jU¹Üh產\nœÈ¡ÇÆ8õØ8+ ‡FëpU‘èüvUi¦C#‰sò@Þ®*rŸCh xøUÙ ÉHû¨1#ýcld+$#㣌Ìa`d~Ô‘õqª6°ÞB+}'”?:ÌÈéÚÈvTÔ]`¤m»@-&€Ì7з£ÈØ*ìƒBŸ*OõAB… i®–{"ŸJH€„2 $o?5ò­œ@(£@¶K@³›ñ§$üg·îòŸáIùÏi×4æ5×È=‘eK`#é’þyrMͱ“ð\ÓÉß¾¤~¢×ž¥´>HµÒz"2Lo–ðÜÊéöLŸÈòÝ‹ï>¾õ7NTô|²Þ@¤(Neà'¤<çy"ËVãk¤:?Qn|ô~m-97Þ4ô ­¨•齤[ófüéäøhœÛZµˆ ûo¤éOuhC3k%Ç×=6ûN#:¨7Wǵݯ¹:H÷uÄ2dù:bA}nh6RŸÐHQRÑ ´õd©»_—ï4¢[ëN WZ•ÇíÂ"Tÿ#šý¡‹cs9‚ÕAËH+v6×ÇíZ‰Ô\·+,Ô ÕUÔeYþ¿ .šV€XŠ4#Méy¨|fŽO~Øwš9VßÏ ]¨BnÇ®ºQǬ†êª›å߈f¤‰jʈ¤z¼âÑ,Õã…¹NsÄÛ¢i»{c‹¹Ý§¾E‰ÜtÉ&j¡¹· !š‘]•Ú.‘‹~Žm—ÈEïpÌœjºöW5³kºŠ?z¡²–ÍkÔÈÕ˜®iÏiµø‚¦hFP{W-$š‘]—Ú.’›n¡Èæ£Írw% Ãeˆ –‘k?B°ŒD“+NJzW&NÊ£@3a.^x—ZÁ3]¥0'µ?êP ó‚{a#ÓÜ þ>]%·¹ f%µ‘Ỷ ß]íu]Þí7£29y!/óŒ¤hóÎRLV G˲æ29°1iv—Éõݺ3'Ê«l͉™åU±D”WfäH¬m¥T$Z»"–$XZœÞ¯d×Rï@Rç·ëòæÚ]'Gn¯ˆ¸ÇŠ·Ì7KµK³–&±9ÌâÑ» åÀa6|eÔèÝ‹wB©jVy"$©Å›k»I±Öl?uUÊñMû™™H§æb¬q'IÝåÝEøO’:"¬ÖVùÔ])><Ïr2ÓZrÖ@–Éø1ÓHÏÞwø¶IX½+w–Bw]%¾|"®+Kxù¬Õnç•@úÅZí v°V{˜?9a°V[Ä/DÌ4²{“– RAë˜@]Æââʲg3Ì=B×Ê¡•¶Lú®Z9WVfY±Ks‘ÓU˜©»\\›¾·ªåP¼âEš—X˜¯èýµHîæËÝI!WÅ8*£…R4ë.˜ß© 6kªŸR=‹È½êgrÉ܈ ©»dnäè¥ 6=²0ç£aëÒÐV ‰jt¶ÅÕÈEi„ÔÍõй)r£HÒ«ù«¢a©D dŠEX¯·ŠiTÄ~QUL# 4™]\ÉžP4ri"aN¾N5us4æ"êfH&~pUôÓþ†ª¨F@u]Z ¤n3–[¥µ¹¹˜IÝ<›­! ¤nžá_ñÉ*êDVH '8Ò‰»y­ø8]­7£WRÂÇÍÞAú“z“özOi׈ò½Y4qÌ ºKà¿L"û÷–ÓÚn#à÷ÙÄ5‚†ÞºÚpg†½˜Ôä‚=¼69Rèçà÷×äI¡S„·Ò&®¶  ÐE5‚ÖÞ‘»)ôÌðSu:RhTï­µ‹kdöè ÒQ¶sè3îÔÅ5‚®#ÖE]íÐTÝ«©Ë“ÚQˆP*Øe7¶¦ž-Ÿ)´~©¾Œ©¹FYn'ªáèšR9yxP­”ÊfÛN ÌV;Öä·dT5q;NQSÜÎ ˜¸Ù·FËr S½j5C=Bº£hs€Îf‡Ûn– "ìpÛC£’œ~///0‡³!ë0µ#‘É>ÄfKPþì‹;ÍMœ@IΆ¬È~]°!ër7¸¡³uòrb°ã»4ËÀ€7º0‘ƒ-¢=@õfe_i0UIewmMæ^o(Üð &:T Ò 0FКUc2ØuÛ¼ ¼ï•]·g<:ºY«›w. Ç-Òä¥aÓTö Ïqáœ(Ôݯ˜ôóÙV³#÷ú² £2luîÉÉdiÈ\öòÊô§ò‰µçÁVBovdýj‚·HÅõÍaÊ53 é{¾{å`sF[øê&Ç0¸ÚR'ùddI&mhÇʬHN½ƒ’µ-ú†ôA™Yè(€¶¸ÌòË )k©á£„ÚµBΑ†´5U¥ªÓ} —°¯]CÂWöUèK5äeõ 5+2£.#$iLiòeH:Òx4r hÍŠÜŸ"éH#C¡~£V| ©5 ØÁˆ×Œ©¨ìÔƒ"›í P‰‹C€ø{²B=ÅÚ«E2XÝFÈ9Ò/1j èÌŠ¬ß¹©ž7˜¾JÊ‘FJ4ÿÆUÀŬõDpÝbN4Ô¶°á˜|ùN D4œfÏ„Z²JF  Ád@Α†ã[YsCí·NYeÍÁžF\†&_†œ#­î-´ºÅ飿ÔF›­áЯEn`fïñ8¡³m!øQ §g~qœ#­©¨.žWYˆ~” ¤Ð‘j$Ç™ -;xd÷£¡ Ú²·´7ÑN[¦µ`Ž»‘Œ?G|b­~N-äÌ5·l¤\1‚»äK±Ó‰j­DO{xÐ@ˆÔ7ß— ·1æ¾,Ü_Žž° F{¯A¿íNÕÝž¾6K¡æ¸;\£†˜±zÚ£7…Z !¼Bq@j«õýnçÆoz € 6ž¡G­zH5Ð#ŽŠv>hÌÎxå †ÃÌþ ¿›F"_§«ŠÜM µõOhã5é1±Ä˜“‹ô#iš¿A'ªµ•㣛ô5Â[ 9àVØ;@ ~H4æßÐËhýʱ°&·‹ÆàQ d1éˆËRhÅcÒ ¤p’@g!4ãäÞÍ ³v‰ë²‡b#éx úƒhB…Æìˆ†²h ÒáMAͬPÙË ¯ DÑ+ó'v­@g!´à9G @‰©Yô Â^I‹­bÞtÑ„œRÓ[ꢳÜàîÛO‹ñÖߨb[‰GÝóý†Ð–½+ƒœÈ´TßáÕèrûÊð Üi½t3ƒÖ‚ó¬´œça„T£«<…Ðhm½¹á;ôe‡Ü}åB3~°&Ù €àãjó›²±DÓÌäI_#“. }kúÛ˸Èy»Œ{Ëyêû <[÷ ð½É®ÀUÒk «¼VRaÐL«M7‡¹X…ø:õ²Tx’èCÚ½Ôe‘¡Wi `-}Úƒ¦œt~C!İ(‘ì›7ê!|yž@„Tª¾×a©®)í-&£KµX¤UÎ)]´$å4=w‹º¤½H6j`jËñ‡×ä;aWò¶$=Ô–@f׿&›ѸÆMÒœmiÊ?ã–Ø6Bí¥>PDª´W«ö4À³&©8ÿBíÕâðq¾®=Ûûzã¡wzYO@` ¸E~ªo]mIm‚xáU¥fdÜá”Ö°ÝÐàWRÙ±4–*ŠC# T`%üc´¦+Ó¶"‘IªÒ+¥Ëê%¼Bö$R¹^"Âû%Â9-î˜Ð혪(‡ñ'˜ÈžP¡êNÀ²P(XôU¦.ÂJ dÉÒð»ä–5¢{,“ (½ˆP¥8†C›gê¢1A´‚†OJÂðˆ¤RlV0!uÅA!‚²ÔEWÄ©Ñsšºè ¿Ȱ­æ9/áׇ9‡fÖÔE×µŸœÝòÎ/­& Ù\õ “ ´%}+ a5À)/ŠD^–’…`oö³HjŽXî·íزŒÝêëЋb>@ ʈ‰Fhpµ¦æD{£¡í·cÃá²£…8—áLF¬ñœ#"c@–­|Oà9òüÕ€¥ìûDGsø¥­G¢ aC“¼¸#5dx¿Xì›Ù‰âÝa±Exc:‹‘¦)mûã[v¥Ú›Á²+§Ø{6äþøãLŸÎU õ¸Â•J±r—\©7úÁÃ3ýxmìO_¯ú2ß7zvèD_yz¦9B;@èK‰…H‘TŽO‰ƒ¬!nÕ@èKåË: ]íå®N[‹8+?Ûìó.Îhrcuü)ç4E´j1¿ÙëZšÑ+b\@8£—›%AH*’V’/—¼ldT¹íZ tçˆz¬õ,gÿLź/ÃVk )¹ÙI’}µÁŒ’@YCNìÔêpbÆJò¥ê6ˆ€@‡!€ã›ÊÞ¶yŒRöˆ?¡ŠêVÔ+3©­!]œ•‘ÖHæ€*BÀÅ )ÓìhÈ»—7ˆÃ¸¦Ìè¯Hj%WIU·&¾ùRµF,oe†¹ák P`¨¶È¾g€%ù™+£¿oc}H Î)*Oü2I*Xd­riB³›î«¹ÇƒžŽ7¶/°[N·ºÝU P`ˆŸùýùR(d–"G]cKˆÜSD暥@²ÐPÒå·‰`>Ã{Ý›¸§õŠpÏ*<k¬fÓ Â|œ ÆcÉ›B^<–¼)òé¼qÕKQUðLH ªÎi£ƒª³Å…Ñ|@ŽëÞ»ƒªÓ¤úDT…Ó3Ôêøh‹QåL±u¨jðØR$·¡FÖ_gŠªöº¯,g e½R`«Ê™BH×˽.EU[(B Œ‡É‰Ã¿Æ8p²±¸ùêj°ý‘7ySŸójYR5²W+–JóY f‡;ŠcÅÎ`¶{jßO¤*ñ‹ÇC’…V´: Eɽ›5ÆšY <œ©9ýl¿mjNó›m[’JQ °:3)˜¼LuîÓÀ!á/½“¯îé_|uýj ðPA¨W&_]/G\$ -/Çkð7¦”D"z†.6Fð‘Äu;Î*äº‡Š—i—CÅÍN—C˜¸2éêx.âϺÓ*k`©‘%¸éêØnüYþYâ‘éêÉy,BººÚ¿u·>ŸÔ^¹ïïnÈ—"בEhñ,¨ä@ ½ÀÎ$sn ùRŸ$œ"C=ʪ}0æÆc'™9 I¥D~ÿMª:U]!çók’©®çËâL*-ÄäNØHD¦W9åJ±y³¯C¦ºê4EÚ€À›×ù¤åÞØ¶ÚRG{ÙÄá톽8猦ˆ…,¢öŸò¤ÈºçËÈ“r£r"Tú ´€2?×"S]¡Ÿ|É“¡Öâòi`?”OdªhXú Ç)€:®UtZº®Ø·)Jz¡-:<õ¢XMB3r‹pÜÏ#ÖyíñÉ‘"I§Úg dŸ1¾©#ÖQb™¬©#Ö‘lÑ/$äà|7zL ‘ÎiêÑ’©r67¸Dcìë’#•"M‚”WŠ­÷FHTw#Ñ äºÈ­p#ÑE9 ϱ£OÁsl7´™‰–“¨dwœ0ˆxIÞý¨T¢«ñu‘¨îFšÛNòJ%û‘/Ab×’ÜñçJò£RJy pMq^¯îWb&á8Êw#$ªã)ÿÊ0Àe7PEQ†Ûh!5ƒBÉ'!Dø“ìžhW’•"ÃæFäF¥+ÈëÀHW´—¾™nDç°)PBHfÐôe:'íZ˽逌gúÀW᪠û¯œ-”ÍyÉ+Z_YNÔ5g¼¹Lšº‰.®@ ¸®Yö…åD]3í 3ÒÀ¥]6ci1bÚ¼7ÒöˆASÇÜO—ç!³jåv$f,PŠˆ^Ä ¶®ýc¯ÂÔ¦¥$#$©»‘+^œöÊvµèÉrFûn$ZÔ#ƒ^)R`ÔUä* ßH´G‚[Õhw9PWõésgôýgtÔ¼ Ã[̽ÑÂ+Si>5Ú\Eþÿ;ašO‰VW½œæ][(Ï4Ÿh$„i>ÅÇr7’™æ“§'¼Ê{â˪P&×Tɸ¼ ãY˜ä“£ç&ù¤ý Ö®$Ÿ¤HvÆ|0Ç'E7o ÌñIÙ;}ÄŸôïÒl^óPêêññ´KR×þ*(ìnjª `1ÿ*¹ëÈÕDR‡½Ö€Ø°eg_Wuk99“U©A,%6fƒ ™ôY¯ OuÍ;sGÝ í’™R…²ésy"S™hê=u5qÔÁ PÓF,æÄŒ¶é¶—l˜ ëÄ›O™¬µ§ÀG”S˜J3dœÂšòÒꢨƒIæ=¡‹¢¦]ÜJu4-EŠ:Ø™~Ì.Š:Ø«~¨.Š:Ø´ê!ƒ<1ä©Â6ö¶ÑEQÛ_|EÝÎ$Â)UË-ìœÏ]¯Aߩµ°†"¨ƒ‹2üÔÁÕYþ êVvs¤ 7«i¼CuðÖ¬ ‡êàÑy³"R€gè`ˆ Ž¦¯,‚ºUJ|«ƒ1H%Pú:ÓRWl6æú†sí×7r/Š)‚:8öž¾)"†r È7EÁ:EPÇX„#‚:4ü™M)¬Hÿ&B©´õµ¹¾qQÛ›Ë\ßÜxLÔ!äÕ?‡ÒT׎êkZ0áôê1ËSD jyç]"R@plµ@˜pzE¨k‰ ‘9¯%s}#zçųDP‡( ï¾Š¥ZÜ]\ßAöøYª [jr–xìôƒ¯îÄß Nq­Š¸ªúMA™³ÝÆÜ¦Á‚ºñœÓR9VÁZ–ò.”.ÑÓ!­[Á@’*‚×j«£a>¤K4 ˆ“7 ‰žn*•×Èx&8߈hÉO–F 83Ð{@JfåoºeºDOÇ‹*&pªqù:¤§ÃÙˆ6³t‰ž'*9‚"Ê©œo ê8Xqz#2)tYq£—d±ËI³¦‡E×™"›AJÅR6V’©¾q’Õ|±ÓáüËÃIb§Ã)Z ‡ÙêcEìt8œÓ^Kss(}øF"QÀA §&‰DaÖ°Òa¶BͪðQN&úÆA¥¶@ Ð^8Ìô›Ê"§ã¡¨¥DNÇ“ÔÆW¢+gÊ"§Ã ­N‰NzµõAÝ Nƒãæ"§cv¿o%r:D¯Ô«µG§<,åÈÉ<ß8÷t™ç‡é^IYÜt8p×÷› ipH¯†RÉ<ß8È×GЧÿ^lEÜtSdHDD£€LON)–r[¼džod0x|EÔtÈ„ð§XDM7“O22’†¡Àænj™Äó=w»y(¢œ—Ë*3ü&ór-æˆFY"+Âz‰«Ä3TQÓMU»Iª²¸R¬Éš,uY%}Ý1UQÓ1‰¦‚*ʱû¦Jäëxí›è{쾂@TƒRbJ«¨éÆÊ{8Õ+±‹'3}uÅÇi¦oä)ùƒ¨¢¦Cv“÷®&jº1G ÙLßȤòÅôì+Ï`5´62¦ räó¡1Le‰Ž³Ê3üéÄá\1˦úfN™¯#j:äÉá„_N©ê ™ê m^¹¦ú‘zr#bU@¦œ y”ýQÓ!O ²ÉóP)’ì. œSS’„"QçFÄL7‚®ÈbÓØ¿3²ã7b¦Û•Q‰ë° çèŠê™‘~„.fºÑsl ]¬ H¸”Ù„SÚ¯X;]Ìt£íIîô XºåÑÅL7T‰d\–ê±á1Ó1×4‚*J$¨ªëcb¦C«45B:YÀµÈ…•Ù†˜é/k1ÄLÇ$ÛL—¨UßJÌtÈÞõ'aºo$ø¶@ƒ ±3R‡ã±ÄLÇìbM3è¾ñ§<ÅL‡eESÌtLkÖeÕ™§"õÙïÊ|ߣFkßd¾oäTû;Ÿb¦cÞõFFb%l¾oäo'#r¦ã]€IÀ¼p´ H·âž"¦C¾¹ßÝ1Ý(¾†H¢î‡\—Eœ*@D"Ñ?6™ì ò)’êçFXB™§ÝNÄYB™£©+ZÂð'ÈK«º„2ú³2rÉÊj—aTB]®“¹¾QLàÚ\ß(Ah¾¹HéX¦àë,^¦ØÍõbíëÙ\ß#E@MaXC ›#€©2PmšY™DdX % «!S´3Î:0«cû ¨‘TµbDìWRÕ£l®ï‘"þ‡&1¬¡L.ËȈ!³†29E<;ªÌZÖâ{‘“n¤ð¤²ÒjY»Î赬.­†Ì5c"Ìôjmü@¨½®aŒ 7µ×yцÚë2s@ÎfúFñü pNdßKŒt("j¾iPg¤U€zq^"¤C¹Róh¦”×um¡i¡ýÂMôB(-õl¢ï(1&@ €í"¡C )ßöoÄG×#¿…ÈýñÑõåî°¬ôa½³O¾‰,Å?‘…*2©Öl–o W„+úJ㣻´zú™äEõåNªÙ$߬{› hkwäé‰/£"2:”ØÉÐÍâøî3Úfs|£.OŠ µJŠž¡@Xþ?÷"1Ç7kȇb™à dºÆ\úÝaȨ0KLy!O_ŠýÕ•©âÿ™ã[-KB)VZYrr\æq|ÅgXEE‡ªJ9ñ@Xü?\ˆ˜Ñ†Åÿ#z㜋­ÚÇ^HUTtHí=!À3ZM¨0œÔs#]^þxè˜ë ×þ‡—Mð ÄSc‚ï>°CoÕþ—ø ›xè\îj„UüÃÙC½ax™°ý²’ ‰x†[¶PXƒ86l’ï$ŠYŸ)–þ÷åM?+ç‘^²Íd ÈÎ €}Úû°@köiïÎÇÍ<ÖL"Oð·ÛÌ¥pypË"-&\ÜÞ|.ºÍÇц}Ú{÷ÖEC‡ÄQ… ²¹½(ü„}Ú{ŽÙë¦Rè{}vS)tÓ-™üºhèoêeÞECÄﲓ† ¨ŠîgS{)¾·ü§Þ"ØœÅvEDÖ,ZÃ4òWŒÐZ¦öÒR Ð?@¬‘”“þáÁÈ8Å.¬nF±P‹½EÌÞ²":¤ºÎÈšBª…DF‡äWkg3{ñ?DIÄïjˆK ²~WC\ ½í…>II‡”Y/ öÎBäUd5®þ„dô‚1ÐâorдˬfÜÕŒDÄHÄïnŠJ©¸Ó×#ïùSŒt@¼k©½9iMºG3,1þl^o$ðz¯w暉 Íˆßæ%ø`Èæõâ ›×›yÀºð%¿‡%*rG¤@¨ƒjÙW&%]¯-9O=ŠºˆH(ÇǸú· у›Ö»«…—ê šbå,1)±ÊYbRèõŠW³ÄIGÂJ¡ •JH”¾DD¥D»×,¯%$¡Hj:ðTDë  Õ¨…v´ ¹,´Šs³«_‰ÔµP°æd4‡¡R[n"âRè%\T´‚áœgý‘T|ȶ¡îŸ ñÑÂÂá˜ÿ&£ŒÈ€"z†4žK¿‰?á2?[÷IÅL@N4È(àÓ¨‰Ó§ä}#qÒ1«[O™ÄIäP çîä"Vohù2â¤ëÅ5D&'ý² ,fõîÅ5 MTC%ŽuŠ˜—H‹¤Í¢d‘Ò±:L7¿`³zƒãfYJYot÷\-5mVÞ:ÛÒÅœÞ],ÝDä>)¾µxéz”\¡5{¬­,^ºMþ”цŠ(G¨È0e”RÄ$Õ¬ÇÑFR±5qz÷~O4&âEPÄKGb¡ÍìÚŒ¾0ÔD¹ì›‹—nsZÑŒ–}óRúSÎxâÖržÈ„¤-"¥·&)ÒøWüM5”SÜØ|Þ=Çö‚$¼Ò…Hã¡Ìeš.Æ@¨†røiEÙÕD¼áT‘Òñ×PEJ‡/Ñ*Rº®¥J„Þ¯š*R: 2#цö@2½VF˜d®1¯Y) "Ù)]W7N M¤t@<MˆfÔtÞ¼!JÍŠèl#Ô^©ÇpIéXáëÚJ=FÓDJ×#{;£º¾w!^ØM¤t=ÅÉm‘B¤Ðý“Ié´ó1)]°·æsóî&6o2aц¤tÉ…¥Dh¤È±@ò(õPÅåÒMJ—",„iŠT$¡J*ÛÙ@IED¤ôƒ”.—¤t{“ìAJ—öMJ—ì¡”¤t)vè¤ti0H霖ÑFszŇIéRÄÍŠé¼x7·y݈˜”îZÖÿèCíu­Ø×Eç @–F1w¿" `h\ql „ÁµwßaRºË‘4€Iæ”s[äÛñ‡5Ö’\dIøÎ§9鮽GOsÒ]®5ÉÈiöOòh\Ãá5´„¡[zEò Àä'¡!N)âFìE]—(fófÍÏF¨¾®æÉ4%Ýá«b6o ¶X4ºÈóA?˜nDáLRKpÎ÷οLIwÕø:—)é®ÈÈ+Ë”t×Ö«l)oã«l)°¦óî×Ö¦óÞ‘Dh Èä+‹’î*ñ/SÒ]%>áeJº+ï‡0%Ý!9tÑŒæø¨×ÚRzˆj>o Š ƒžê Ê,ó^ê+G;ÚQ4’«è¼HóT±ÞÑ! ÚÁÐ"¸’?{4¡Ep….B†?uÑe&"Ô`W$9‘Ó£ é¾ùÜRÒ•ÕÜÞ}Us{“@H)] ê "S€ü:²…‘‡ö/$H]qœ „éky³@C˜Ê¾UÝR×F¦)I§oÞL«:½} jB´ªæÀ%"ZUóräjro5"' V:r¦@ÈT»Æ~N±Ò‘-Aóž/3¤m1–âçÌiÓª*tƒî/!$õYƒÜ{E ˆhUã4’$IˆlR´1ÐGäK_Ý ¿*POÄžEJ×V(ݪšH"ÉÃ1»÷j6 jÐ{ï³P lò±"ð~0bªãåôÞË…|D–m^¨¦iFd”¢ûKPÕj/¨J2úÐÙæüÞû ¶¿÷ uNKUG¬tM½¦ˆ˜ß{E^m ~ïàÒ%BÆôùG(ªäÍ£û ÓW‰¹¨¢¥kû\¸Á÷ ³õH!U!ÏEð{¯â­½Á÷ Ë¡ªR—ˆL´ƒ!eúÊÞ)ÑýÅ@«2}ŸR£‚JSj6¨Œæ/šRè„禊”õÚLÑû…=>‚À˜yÖWdW€š‡<ë+ý(ñ*¦=–M‡æ/¤L߇æ@|+…“ªÈ(>ìÉ ?—#{|¬8A@ïöøX‘½Pƒå{]±YË÷Št2tƒ©OîæŒZ6r¦¯+æ+X¾÷©>ºÁø2Þ¦{gú2á(’¦ÏwWæàÎ5H¾çŠ ’ïù(¾#Óú “©Šù‚ˆ¬¼$ß3"Üu“|GÖÊúH›<Ö7b¢kob"`‰5}F”¼ŠPŸˆçs\[H–"¿„”·ÉMñ=CŒ¬súì­`Èš¾s"ªHˆxBA´#²n‰5=è»3¿$ÿfà¿­7ÁwœÕMðê¯i’¨´$ÓúŒ ÃßÓ,RDÄ™çh#ÎôHf §€8ÓÃP¬&øF.¢þ®Ò^AcN$d<çbœ"R=<ó{ϪI¹%D¼Aϱ)Ó­¬æÜ”éVVX-R¢LÄ4~¡öš-´×Ræi5¿w f¬\µ; P¤¼f•TmÂDüLïMD^M„é³…Ê[MŒé3l[”èúÂ2ÎÑö…j(èä‰,~‚)Ý5#Õ¥¿!dE`vo Š&6³{‘j@ 1›}e¹=*¡ç?¤ù ×‚ÒäË£I=’ö@ç ]’…ÊúÕ¡ ªýÜäÓIB¦¬§šÍÜÞDü›%%4Ã8é­‡á@Ö×MóŸQ“2RÐMÌÞôæš™½Hc³´Û w‰0Ùpõ@¨ƒfýÍÌÞ»é@FÚ ñ²föÛâN~™¢q'â—©€Œˆ…¤øQ¿NÅ-2À\þM €­>f¶‹ÔÏ"â×›‹L`V&2=¿ß\Õë#ú/dØ ˜+€éŸL ui äˆ3Êô©¶¦ Z‰Hm¥xß&öf¿?沊Ä< ìõ¡s åR¯©hSÒñx¥T›y½‰([B>^+¾‰ß¾I½wŸŠÜLêív DºŒ€YÝMw"TÄ÷õo¾üÍ—?|)E¯¶2w}%‡þý )©Å寿ûúŸ¿þËDoú ÿÏ/éë_ßÿ÷Ï_®¯ÿáËþÿö®¥G’9ûÜØ‹ëË‹ºm–­ìM2È$S‚ð2° é²j?€‘%ÍC5îžž­®±GÿÞü"‚™$;«Ó#aÏÌ¡«XL&$ƒã±‚4$2àÿù´|ùáêŒ`TW$ÓCÉØdc'X‰U©à&W¾.‰¶ÎdF02uÉäë|’C˜XLU.D‚ÑF•i`aëêIØùëäæl¨<ÛîgU¾QÇòå©íÔϾ,±¦NRíàÿ3Ö%äëËî+Ucg$LY"÷Ë’ÑÖÙÁ||Ýrhò…;ؾ›¦¤Éví`¾]¥…v0®r5;–QÔy†Œe«4¾ÎR“%×Át¬Ÿr®Îÿî`Áh›’ØÐ’cMwˆcSºÃJ«¦»lCwHŽ5ÝaÃSÓ]cßT%S•ÜÝÁÈ£9Š©)i²M;=÷ËOuÖj‡;ì*)´ƒä8Õ%êœÆ7œ¾) uŽx‡+ºz¥@rœš’Ь\àøºÄš:W³ÃýCMw€ù5Ý!<Öt<]ÓèoMwNµ]L5Ý]ð Ý]´ Ý]œº>ªé|¦¦»¦†î€*ºg~œ‰‡n(Hõ´<†MšÉáã(—–z_°šHxl+s ¤l–vЊJÛE+¹ä1­d¹ai%—<¢•… ÎtÉ%i¥¡eQRµ2l^¥ 6ÜÄFÿüpµùãÅÙïÿßZ¾Ë¿xy†3š«l`ò¦qCì"3m.®Îžu}ÚŸÛž`<….‰2é †®“_ðeŠÑ_€|¤/~û_>ûêâìþi†RC_J<ü3kÈb¹Õ tê¤xD+°§(ZÑ’Ç´âÉ£·´’KÕŠ•HÃE+Zò¨Vp[áÊF¤àQmè|Ô3tÇbƒ=WZkh<þmz´kBÐÉpÌ5^piÙàLgô¯Õ¿¤þý€¶l˜¢ÜH |ÈÆÌ˘sÉ ,7$†É”àÈ´¼é¼ªúÌuð$é}ÛQ)TîFèÆPºKMwãŸÞ_¼:lqï•øX·;¾x¾ùö¯ïv‡ô÷«Ãáú°y¹…ú3„±K_¶=–)ÆÐ½drÉ»øMœ- û=.ÈRÉó³ÎÚíÅëº?pFOúÊf©´ùrÓÇ¥nf%=º<Œ&µÉÉï?ðyž~vP³ž´+ "¦x™Ø\Â÷%¦œê¹D¦¦e†{«K¿]eš,˜¿Üß“Q¢•|irlP"j‰ì˜eœ4éÅ­´hRK>˜ëÃü#…AŠ÷²ÎއmÏí޽ृ»Ðáâë³îåþ˜VÞöw2­O£Ô' úý·DkIhè¾`ÑsÉŒE/%¡¡ûŒE/%‹.JBCwÅ¢‹Á¢Ë‚ØÐ=cÑE‰bÑeIlèž±èù Ÿ±hÎ2*8®bÑsÈø‹Æ©9^­X4®ÙHK‹ž4Ô‚E{Í;²`ÑÆgäY±hÌ£`÷3í2æ™±hc2¤-XôuÁ¢sh¹‹62€ DÃæ@ÉHtY ÑpŸ‘èACfHô Ø×‚Dû ôÎHt¾ ˜‘èA­a$·wV$zõ`F¢&ý^h;æ>g$zb‹1#Ñ./ðæEk”êŠö¿ž¡è)ø E[µ.ÈP4b³È¢˜¡èI#O-Pt²@ÑaÐ…3CÑ^ã¤.P´"[ h˜ÞmJ$Úª Þ‚DçÌ3 lZî]f$zò=ÏHtÔ<- òÔÌH4î56%8g Ú‡üŒÑ^ãm,@4ò‘ΛèìǵÑÙ{i¢sõˆ¶‚‰gÚ¨ëýCÃ2aS¢Ðfȸ´¢Ð ˜=ƒÐj³0ƒÐ PAh˜nÊ Z¡ `XAèÙ’n¡g«®„f{"-Ñs(ÎÐu¡³ÅÄBç‹÷„š‘y¡ƒš^@è Þä íó»gzÁœ3 M¹ÎŒBkðÅ…Öøì ­V… ­æ€ ­a]zÔ ó =N¹ŒBºzŒ¹å Cj·àÐzmZâÐu^ph#˜ø‚Cˆ® h¶¬ è N/P´–”P´ÀÕ%­%Ÿ èOPô'(º.ùE¯ë¬‰Ö k­ª³¦ Ãþ„i*X]ý×ý«w[„ñKbÉ0u‡ÛÚLºø¹é$.ZbÇv3¥ÖQìo^œ¿yûÕ7iÔïD/ŒÔ|Ö]Ë‹ŸoêŽo‹·–=8¢¸8·ÝË¢øú åƒ ÝñÇ⇹ÃÔùÝÇO¹£º·À»ŽcW•ïŽÕ×çh¦úÔ]ÕõnZÒ,¿ÝèkSwªò÷»«rd—Õ_¤‡pàMãÉ1ïÖx^/¾)~¸Ù÷òãhÇ$üH7ÕÓíå/2³¡š/è¨!I-2³/eJ­)i9‚i%m. ¦=<­“¸Å‘š±^pp7H"fYóïµÉªbÏþ%IMêe&‘œ«¥jú¶¼±0§$üÂ6¦3õ}·-›„“êËšßuvíõð~ŠI$–A±Ö 2–*Ãw۵ŎvÆD©ôÙÚ«`Tµìœ{éëÓöglñ4}±3‹š«ô…Á®ñVßz’®IYùPºšaõ½@§ìÃéOÓ5©C÷ÑuŒ%«±÷-[­ù,ѵç€&Ævÿ¦<±jÆIÊèŸjÒüÝL¡¨‰ÈŠI‹ª©Rµ¿33×0ëDÔ˜XxùÂHûA¤ù£’¦žd¶µ¶z`±œÚ„Ëæ9¹X&›×“È&<×*nƒ®û´Án8äV’ zD¾O‘q$Ñí|ÛÃðl—γž8GËÔí._]öǯÀK9ã_>™†¬•“‰Mfº«ý{f±°^3¦;¾;¼˜2ÝõËüyL‡É+ü†VLbÞ¶+?ï¯ß_…¨õ8¡àd½øúì⟞uÿ’&ŠbtÝÍqWÏ‹#wwxŽzPs§î«â‡o–Çó`‹_¯>K?ê)âDÔÒ vò@ºù¡üvØŸžoçD]{îr[»ýíB:è¾=ÕnÕì1i©8ßg Pî7‡ÓXþº\„à!CÒ¦îû! Gr^h³oI£¨lïYÇ”B_í¶ˆá˜t¬î'¦C÷½H+i¡¼ ¡ŒnÖ‰çºãµÖ7c÷Åõ:Pú&9¸ö%?™ÆíA]¸%SÄŠ×*CLý|¿¿Ú¢c1½ªìÏU^5+{G@5Œ^ŽôeUË ¢ º`»ËýÏÄÐA¦ž¤>]îË'®…@Q>¡>,¼!ó‚óÝM)_JáqW-êçÛ§¯ÜiÒ\s&’¹n¶5ïß·ì(FÍ^Ø•”}_öé±Ah=_v%ñÜbàqœ­ÚEB¥'ì˱ßLMµÄÖe>c|ƒœoÚzJvã”Ý¥S+µûT³;]ÖüÛú?Ålþx·fÀ¹@„áã£oª¼jž¸©˜Yj7Â×z¾^äâgÌ*¡É'|uÍêgX§ÉuÜí/?“žàlÛ—¯ú¡Únïnò¹z䕾r]©é®UÝr¸@¿Y}$)b»åc­lU“7¸õ¼Áñ­èƒˆÑ=™4ˆ<ýmøÝÒú“NÎÃQëÉB™ëͪ$NñT} VtUÄ‚3~™–t¶ÞÒí0CIj(ɵ;ìšñWß¼HÁ¹)ó7oËÓ2ÄÛÜ\R1y \k ,!ðÓÓÊþÁI.J GÅ2„³A’&sòèÚsóÞ­n=n6`;èáïN.µ­túµO[ 7XJí¸SëFD³VøvUFGNiÃ.DŠ^Q-èÜNθZÏ«ÚAhÌgQ|»ÒH?ªúÑ# •£€<¯×„íÑ$bRA{væ$áOÿ³E*ËÒRP~âl\½B!F"øÔ¤°‚•‚‡•S[ 7ålîêÅú\[r4ïù¡:#®+ìlÞäÜ@ô"Hq·\½hþú®ê¸µ¾5`.ž.A ΥƕZO>-g}2Es8YÿáúáêÓÎÛç1iN§Ýåþ¸Í¬ó§mdøÈvų¿,qœÄÉ*hCO ãT{®¥ÍÿžÚ²Ý²>V²Ós'-Ðâáµ->" Î¼5»²5q¡xÿö&?Æö6A¶7 ¨Põõš¾ÍÑÀ rÅܱàjÍqx2Êûþ»«z€ÔÞŒ‚7c„¿¬u±)‡4ïeÅu­¿wì Fƒ,§*=^$q /'ÙåÊÁsi+™ÏwÎzgnŸ„$«ãP=üªþ*Bž´G w‰ÂÛV xÔ—&ë{®ãÒõÓvmñ½[¨—XMP¬±¡žÇØÎ£›øieù,`·:y±<;P5y¯×Œ¡wŸ\=R™WO‰?þa¥£ˆ´K6²ÅÝ~û;ü\½!œ\~6 N°é_­£uc˜B=Þ×ë´»5Þg€û‘ddšb÷›UØN÷T Æ®mZ„"06Í<®S»–L©ØúžáÉž±èÏWy¤0r>) HÆhG{§€`þ~¶¬¯S,Ú‡30?ÄJ>i8®¦‰X®ø¥Ö7ùaLJÎhÍ2 ·™v/"'‹¨ÙO#ø^ÏË8éœÃö)QMìþ9ã¡åÛøpètžFd‚<ôŸºé£¡5ž ;cD$K¯BÄrW­C#´T5ŒBÁ“ `xĉS@ùÕFÂ]?êõeÅqeJ/WwYÒ>L>pV÷BX1m4$352 ¿^=ÿht¿ð ‚]°ø!f;JË;Y‚q?Ï»ò$ ޤ7pÁÞÍ‚a[\VüH,¬“¹–½“§]q''gF5NaÁ1m³[úÍ5繉h©Ç=@f§ãÖö!Ìñ¤hŠì±Þâ¬Þ»qÓé‚(m>Ê•…®n–‚ÙÂLLá-Ò& Èpœ¶v‡9`zo.¹<ûö¤ÈN¨p´O-àe¯þv6qy ¬r –cï,_B<Êwi÷ŠG¹â©½i§ xÇ-£y€|Ä»K>jWüÂÊs:¤—i ~äŇZ¡À3éÚ`Ž0×xžû»u}¯8:Íš„†ÜŸI%HÄ…“BV€:CÒßžƒ–¦ÝÖ#OŽWtø¢QMKsV¸~ †B$<ÝmàoÖiÖÔ„]¥¬éþz}\‰¢~¶ :Š 8Ó€¢7ÚA#7†ÜÁÑÞ‚ÛdÐS÷Í‚l–zŸÔûlÛÃô~š¦ûá ~‘³ÎÀ]q°iï5ól†•ÄË'Ü4´7ÈE{@4æñ¬ËdâÆã†§vä+ûUʤ˜îB”óm9¾oè¾®À‘ã±AÖÕbÌTŠ2x ‹ÐÏ“B!Ûâ?V¶ÇZŸ‚tþ¬'H£Gx¿×‰fF¨°¶¨o÷»W«Öv¸ÿÌ1÷aÃq ? x´N#³Ò>‚„C’¹CðøD¡¤bu|Žž×ëçM©|üb©ðví´@¢ >ÎÚyŒ†Ó¡"Ì›Ó8ZÒ|ÖNœ•> stream xœ]O1ƒ0 Üó ÿ ‰ ±Ð…¡UEûà8(NÂÐß—èÐáN²ïN>Ë~¸ ìÈgôø¢Ö±‰´ú-"ÁD³cQÕ`¦s*Œ‹BöwÞŸ@°ÈóC/$ÇF«ê¡7´5Ï$Z¥ºÖÚN›?é Löt6uW ÔÎÙ)9šK\7·‰SiZšäŽé÷Lð!§`‡ø+ìS*endstream endobj 479 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 306 >> stream xœcd`ab`ddôñ NÌ+64Ð JM/ÍI, ªüfü!ÃôC–¹»ûÇß^¬Ý<ÌÝ<,뿯ú$øÝŸÿ»3#cxz¾s~AeQfzF‰‚‘±®.´THªTpÒSðJLÎÎ//ÎÎTHÌKQðÒóÕSðË/ f*häç)$¥f$æ¤)ä§)„¤F(„»+¸ù‡kê¡; Æg``` b`0f`bdd ù¾†ï?SëU†eß/žø>ã0ãë‡ßoÝaþñWìwÔ÷[ŸVž»Ô}GòÝoÆG¿•å~·þõzøýâw#¶ï¿/²–ÿ˜ êâð›Kî·Ê÷ßUؾsœ p‘ç+]ø#`Î÷ð…³²àºÉ-ÇÅ’ÏùyVôöÑTù}yÀendstream endobj 480 0 obj << /Filter /FlateDecode /Length 501 >> stream xœ]“±nÛ@D{~ÿ@$µ·+Â5vã"Fä¨ãÑ`aŠ å""Å0’³o =<>?=¯Ë­=üܯåw½µó²N{}¿~쥶—úº¬M?´ÓRn_Noy·æðøcÜþüÝj‹Ôùî_Æ·zø•º“>êïCå:Õ÷m,u××Úœ».Ÿç97uþû*¥ûÄeþúiŸ²4tý17çÁ³ÔuxaK–` í”%؉¶f ¶Â‘Ju^Ø>K°=í%Øö˜%Xæ-K°F‹(ØDY‚ Ú‡,Á>ÐŽY‚a ™¦\c®!Ó”kÌ5dšr¹†LS®1×iÊ5æš0µalð‚i ã†Lk×0¬`ZôÆ%K°Z´hjÒØ¤¡ES“Æ& -šš46™ÐbR“‰M&¬Ÿ„ˆ°~B"BÂúI‰t¾ß1çšuÎ:æ\³ÎYÇœkÖ5 t¾ßîÂwâ;Ð]øN|?e öD‹&\m8Ûp »ðøt¾ßîÂwâ;Ð]øN|Ÿ³‹?ñ9ÐD¨`¸`0 àB€AÀ\0€ p!À `. À…ƒ€¸ ^žÖ÷ ñÊx¯ßçÙ–}¯ëMG­£å­.kýw÷ÛuãT 5ŸGéKendstream endobj 481 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6821 >> stream xœ­y tSåºö¡a£B4 {DÊ$*Ce¦Œ–ÉÎ#iÓ´tN35ÓNÞ$ÍÔtR:¦-”NP b-ˆ¢â¨Çá½ç=ú%w÷^ÿ/mQŽëèϹÿ¿X°VCÒ|ïû>Óûm1v Ááp&oÙº39)BôìÂùÓ"¢|/ÎöLçxãyœ›ÊFü—Ìî¸0aìÑÇžpMAh2b&¡à‡ .‡'^›,ÎNMˆ‹O \´páâùóñ¿Ë#³×,Ü%LÎ<,LŒEnZ°uAà¶äLübBàœdQ`dL|Dbl`rlà{víܸ~gðží»æ.øí±~ù™ ˆ¥«Ek’׊ץ¥¾rx}ZúÆŒM™›³"·dGmÞ»=.~g®ÝÂĤyóù >»hñ’ç–._1› fÁÄÄvb±ƒx’ØIÌ&vO»‰9ÄâUâi"„x†ØK¬!æûˆµÄ|b?±ŽX@"^!ÖψÄbb±„xŽØBl%¶‰db1™˜Bø|âQ"€˜FL'ÆËp‡‰±D ç5ÎÏcBÆÜàŽå=ãWË›ËCã“+Éîññãï<°ÿ¬™°â¡ù}91kgRÛÃSþnr㔘)×ý“÷H9ÿÕG_|ôí©U‡k'§˜öÓô%Ó竦ûXÂãó¿I•Ñ»èÿ d/Ïx5OüyÌW{p£ýnÏÁLÎyïC\ï†r~‘ $!Œ½VO…{y—Á,tj‚½=ôI@øKáºx½Â`È cž³¦Á µ”š˜F -EPáTÊHkŒq&pƒÃRè(»Ž¦ ,ž“]á—yX®C–¼ÌmÇÍÐNµÂQ¦Hk!”Óì:¤å³1<´ }ä‡Ï·h¡pyæ»8ÿs幞OÑü¨e ÏÕQ*±xî 3 %Å5µö#tå™4ÈOv»ö/?œ%£Ô§Ã!2Ó$IYQ²møÌʰ. U~­â”ÈZ)$L–NB¿ÌžÑk Z` {nea™­ÂFGK,.k•Å%(: Ʋ†â#Ý7޲˚±5Œ}PE˘<È ÃêãN~Ý‚æZ(|ðþÏ}}Ë…Ž¹9ÞiŸs½ËQ2>ÝгÖ&Ö½w> ¯o¿Ìr(ö2O¢Àí°C…»rÐë¤4;}è¸*A£Z;ïûO”ÒèSš‰Æ¡q?Љè3þó/>Éò(6€w ™GmÐ ôïVÁúDzûÿé•O°c(öa^"˜mVsÑJ_C-~èeÞ×ÖçRè‰?s~~l´µhÌ5Txë±"7ÿ/Û¯.afùìLvö¬7·~ŠF|ü­OQAÇøž>K,Ú½7t?ѱîë}µˆÛt–n»x²ñ§êöãß;æ²™Hw{ç»9èéϸÞÓÞU|c¾Ñ ù$ ” EµeuøÕ¥û@ÀF²B6•³Ë~š…(‚8èÐIü.­F *†ÞË®b'o^äÒÅçÐÌK5èÙÐzð«¯z>òÇ£Ï,IÑ ¡}ušeùÔHYì«n4o5Áos=6tŒÿSð©àýáq "J>Z˜z€Ð€DL³¼¡PU¢Š‰6ò0hÕ­­ýžn‚¿ÓŠá^¨é^°Xmµù¥ôQ4Û–SÙÇÁA¢9h.ÍNb7ðå©áA{Ü¡¼m7Í&;Ý‹vØ[.Ý|Ý;…böAÑfz¢Wn/cfç\o©g=±âï,Ÿb¯Ü/L.ðд % tzY;¶‹ØàçŸÚ¿s]ÄJ gÝDyú­6#η¼o†²S鉞ð_{‡ˆAdäzV³kùwK´™,F+…÷tâ •‰QÄÅ'K(yCJë Y.û;ý|OÐŽ¶Úºz:s•2_P„t› ¤ 3ÏÊØšZÍÐL7cæ74‘^úøªÄm+wyPu¾±ÏÆ—Ÿ k.öôu€ª åÉ’dcÐé5$Zݰv]pßq£¥nÎ%ïK\ïZ|§¬NiyÔ–ŠßÄ.ƇšxOÝWQ½ßg¼A›D¬6äªD4èUŒ¼¬N³©<Ÿ~‰GK+”ƒNL††ÊZ—•¾È¼‹È`oîšÌCDMÒ:±^Ʀ ZC0¤Ü ùÅÆürU‚̵ÈÁP/G Ù2T€*@¥Ë¥ÙiCÍ¿›ç0¯ŒF[É(9Àh2ã#à"9µn¢ ýùf óÜ[\Ô3‰ß¿Éy蕸}éJq&ºâÐÿRÝm vu•Í݈¨‡Ji¼‚‚–”9²jËÝÅÇ|Zfð5º×z|m^Ìõ†xRø÷”xà>Jt‚ùø 3§{ —éÒQˆ‰“ZÉ[ö¢|0å—Ðo"‹ß§¼+Ž\qŽN‚¬Wt£}Åü®°P¾éä-`ø¦,30ÙZ*{$KÄ*ÞeTxw:ãy?¹_9Ìd1i´Aâ÷ë`pG‹>Ǻ÷ÆGhÁ`ù‚shÊ\ÏãèY>|¶ª<Ò‘l³C'y¤jð£º6e´“êTbP’ kΑ²ÚÂΞÈcÙñ‘Ï„¼xEZ¯¡º”ÝJØC Å+g¥ï°œ–P§-Ð…ÇP!+ÊHKÎ Ý6÷zºMìÁßÍõ+ÆÚˆ¤nÏ“£òè@E|»Î’—˜À€ ‡Ps8*d*œPBÛyEPf(2T1vHA‡¡šœ¾H¯HJÞ-rÞò·`àZü1âþ‘.^Dºü‘?÷à 4ó«w{ÚhÇaWœl`²š'Ñ®kµ©  È"'öhÜÃ-ö,p£L,r¸È3êËr0d«¨ìQ/ïR 5¥6(µÕÓï¡>¿Û¼2çèÌWòÚМüb0áAVåX”©Ê ìæÑìb¿çy9w ño-{Ü ÓI@*Ø×ÕÿŸ§G­5À}׸þt±ä×3p÷» †t %Ý•µ%Ȩ+ùîë¨ÃdŘ1 œª’Ì$µH¥§Ö°ÝÚlÐçÉYÉ¢¤0 Cóºš/6ÿ¹f¶WYŠ¡‚ì;ä_ÏÎÑŒðÉTœOÙÝuÒédR+ÅÒh:%(e5„KDgÏ´46¡Ê÷tj*  ªjJÜåí…F(¬4#šþ†g;}YÁ/TAæV°9lù%šîi³7YWAPU0ì&º¨"éH7G‰{:Ì­–,ûzŒyš}l¨Cu(Oµy­°ém>nuÐÐÉÒæÓS¬å£]Zx±øÿ×£ôLà·ÊÝ¢´Ô´4™MmUSGRÌBœ\’²ùì¸=оæ¦Ïê®S–RkÉ}ö ñùÌ`8H.¼,:^èAÿ]KMô¸Ò]W¾óHÝœo¾çzÇxó³êP T(4ãvû¼txÈ…¼2À˜Ò»|Ïõ!\'eɡ؀¬—wí†Hˆ¯Qu˜ & E²ÝÕRS›Y”Ál‡ןºüÍW7¾tÑh¼'ÑVo³wƒ Äé«ûç1E)wòìÅ¢s·/¢µ_p½[§xˆÎ̉LF¾ä>IÇ ‡ñˆ³‹>^°º ŽcÆøP#R‹1jv²YêdCÆ£"qÙ«Að^ÑÙÚ÷ÜŸP¶ Ëý¶kû¤€ì µ‡›’»™2h‚Ö¢ÆÓ%±ÇÅçáœèh|§qðZgÈ{CÚw؉] ôATs§„ê­Êê– ÿÙ•vU:N;÷·e´þ3TÙõY|•pëŠåÀdWMHÔz n0—¸3ŠèKÞv®wFtäQqF¹Mîf§¢¿ -h~uÅàoYvcÊH›Î¢ÎHe Ї3>·FY ‡ÁB µXܲsr%2ölOÀMtÝÞd·¿‰ùà€r§Ú¤Ž‰d šŽ‚HsôÈÿ8a¯iï0Ã1ú8t08™ÚðfQ¤†Ì`wXíM–rºÍB4NÒl“5ôØ…1™h>.=f†6ªï3 Ø§ìØ—ð }®Qú!tqÎÜB}؉s†DK‰ŸÛd¦¸°ÿˆ³ÓÞB· Ç‹ûë^ïj T¥„Ü仾zzG¡h÷¡ýYJ*ýÂ~{*Oía§¦ #Œ¥ºîNÿ1L冊´¨Ãòýy±tÚBɦŒ•Á `à0ä7Ú5PBÖfXe©©‡¢O¤õœlno,£*wžRÔùýi4­ò@±'8hÜHŒãpØhŽIÈ&P×PóÝ(‡IÊ( †š£’È(  ø¤I­d)Ps†h£Œ„ÁÒëßEcÑxô4^ î ·©‡ªnt9Z¶SIeÃñö–v ï ¸?9¼ô.z<ç¹Þ±ÈÀÇQ‹‘˜,5%\Î’ìB_غ'©>æép´Z >AÁˆ‰(@z×°FF˜£îÃëež G,kÙûH€gúg3ÁF¸Ð˾Mùs€Ýdªÿ·žÅ ÿ;e´š~ë½jQTðvü¿šEûHQÃ._¶ÈÒv M6#í¶ÖA)Y%qfSþy´fWHGÂë?|ùýÔŒLµßìÙ×"ns=ñ?ð-*§Jg0(UÔêù‹t9@îIí8S÷Ú“ôÑ+}­ÝX[»õ%‘û4ޱ'qJªëޏÚO…·m¾»äÍ9¿ñsôȧ+ñÅ…{t2oý× \ïGåü»¬°8Uû=Ì,RAÍ>ÂKÙì×C—vyô.=¨€ü«}å‘¡Bé®y¨^ R²}‹@c‹Üx›jÞ¦0Q ÕF9½Ó¤¯…0ƒ5¿ <õFÞÅ¡ïM9 .AXlV§g¼—ƒ_fg ½ùî·aþ¶Óí˜ûm#Ü¿wÛfÅ´é÷Å´Äz„FOxï“;XY®[\‹¾/™Ýño.:×4#rëæz¿ö.‰Œ‡|‘Q æD µ#jê ûõöLljyzµ^ÅŽÚÀ{Ê4¥#êìä_fb; *†QÒlÀPtw¬ìµk&|Oa}cÉ5ê‹A€óµÑR=J/Ÿ37Is¡±l´bZ‰QË»Š´íÿµ›ïk/è¶ÕÑÇxð¶ùdÅÍ&¸6²'öØæ™ì³Ù gO>ÿ—œ†#;»Q¼N´ì{¼)‘ǫо)/rû]ñ‘'ËæXåâ¤ÞB—°Vïõúó;#«#禲&¨© vŒßF_/2ñ KèK¼5Cãå[•‘š *AJÈ2+J-ÅG ’teHRS3ãC;3Ú~è@±GmX5Y¿Oxe£$XÅkBÏÛÛœgŽ‚ÀUú"I’Vz2ÉôreiMMe+õ˺Ú^‹ÞÄÛý£Ÿs½"OÿÖúá; 3÷±Üÿ‘«ùÖ§bú"2ú¡?ñÐ4ýïh<½¸Ž™¹scÂâ£÷ecàMá ¢ºÑ»¢;¼k§S6oüX7»<3}‚yñÀ>âx6å—à$‘?œ$äi*‘Ž’6ˆëñnÂŽeDZsØÏ÷®¿qº³£°ÎX*ß§ÉHNDŒÂN‰ vVÚ «°ëåU¤d'J££Ú²oýãý·Þ¯ $(‡Œm«0ú÷èßwžlDã«zéš³]ݸ¤ Ž¥*š‘úý–¯·‡ïþšîÿîoC||R"õ.ê¾O ³s†>3è üV…#·¢ª¨Ìi¦:ÑêÑ‹?ÇQ£©¼©²©óÍkÿ׋¿SˆtôêwOñd#NËŸ§ú—yã¾âÛôV™Ì •3Tή$!fmS×Tk>b®¥ÍÕ–.¨‚sñ'ö–£™G?ƒwÉ›/]e'SlÙï`ÃÏ?>A…á1ýtønSéc¿‡Ž+¨Ô¼ý’µR&Oº‹VÔI!‹ôïX}Qøæ­ÆíÔ›o¦† x™Ø|5ÙÛÙõØtØ^…`Îϳ™2™ŒÆ‚Ú^4£¾ ñláUƒN­Öçá ÏNjÉ‹ÏS.ÆÚ2²q‚åô3œ¦ûá,szø~¦Ò©„\:—'DÉfm>cùÇXBÓ<­>XØvS”ùCµt+Þé”Ûi½bø2ß`Mær35bƒp¹÷òyœ]²þÉ}e{³Öã­P¬¯®¬¶Õ-´¥ ŒPƒAu[ÕÅUUuîþóÇzú€¬°ËŽPkãA5¥]õåíµÙ-¡¯†GD%P;7J$ñ9÷Ì á=ùoò¾ÑVï0Q§QX›örì€tŒ;””äÚÞÔ¶.Ws…“rµ_3vfâg3&—‚óÍ.j­I«-C©Ss‚²"’Að¿Êìä!lÿÚLȼz4öd{e]MUÖZ|yø{¹Ï^] ½ÃE¼÷ùXä֎ʃAûÂÂ’(ÕÕŠP†ý‡^ûÿúˆä˜ «ú:®Ù{sÅj‘>ÞÄý;ú}yvø—3О9Èq¹(­—ß,­F¥Æ‹„ÕʪÊRg¾…Ê}qßæƒQr .БŒYm+G“ÐCèAß/ˆ¹@ àsœ;ÈÊÅzu€o²Z]Oó‰ Á|ÒƒN¦×h³|— v(§Ðn^¦œ¹ptGvçkO(×sUð}¡†æñr• Îžy¼’pŽ*$ “ÃE©oò]’ªdᡤC)å9µ-îæÆÑ‡é.o¶Þñ—Ñ•K\-ãw|ÝŽÁÇäq-z”å¯]yåSû„³ka™,¦½õMzò õÌF~úÁ}{C€†W~øÉ t²õ:Ýv㬫ÈŽ£I›W±GÃçÆ_!'er<ÏUønó%”Š'ƒ£Ì˜nÖ1¯­&‡1ßлԱkò5ƒ!WN½8+H-b´>”æX(òKNY[{)ö!‘J¨R®jDCp ìì6C'Ý=L×Ý{¨‘*¯Ù\¨Ð…ŽáR—7¢ .ôÄ;\O!ZúË Fdô† ÑvI~œ=Ú‘ œcõ†¾;ïv¸ËтϾ¼ˆO¢q«Î®bç,gC7eZûož@ÚËóZe-&èŒzÊ*Ï—œÅÎØ&WZê¯Ü@ÛÑÄŽ^ñ2öÉ%Kçl§BŇ#B‚–*ÖB½ÐdÂ~o¯/?Š·~¨Ï¬É©Ív§ãõëAkœwkp¡ëîKXÅ\SÐÆSÒ]×®».LõÏQxÒP*tï¾ÔúCëÀ—ð>y{Ó©U샳g>_!jkëií«P¸å¾2F½YC]š› Lej*Êo~ùÍ·m'³×J”ìvv9Æó r0î•v(£ëyúÙysB‚éä„×RCaìkԿש+jÃë©¢4m¯>8{ýÉàÛØ:¦üM¸û luZï®t{þšÉéò¬ázDÅ|‹£\:%•­NV5h]è•€á´g&k™$MJŽŽŠ`W¬©í‰ ±ÎH9¦…Ì€ª‘y}€»æË…"MšXMb'‡±Ö±ä ì#‹‚tŒš怄ÔÙdvkI¡ÝI9ìÛy(‡JhUœO ˆeçê|w.:AF™¶ ¢ÈYm¥ÚÐl«ÁVÔ_)*½ÛîzDÞA;]ˆzßqûâu®G‹Êù7ÃÞ_òZdŽ(–êA[ÌN“«)`[*`*ÔÕúJ<³1ŸZbÓ˜FgÐkéÐÌPU4„At¨TcÖ™t¸l½†Q¼Ä¾`` Jp0³™Ì6uúÂëŽÌÊø=»E33¢è°ÛÓc±6n«4|k6˜°- Õ•²â´ÍvášÎwÐ#ذ§£»43dxz\½×8h–'ëõóÎò!\£Õ££r3c÷ÄFE‚¯Ì%L‹®]× bدڱ»ºפïÙ§Â`ª©gØp›;0lN£Ñ–OÝ@O~Uu§0‹º,¹TTª-ƒR(É/¶ÍfWô‡6.d7ebÉK/W”s4µØ)7špù ‡ûÑØž«õŽ"ȹ•îpÛGuyfÕ`N^GùW¸ž>O.¿Ð3ì£ìTÖŸÉÎ ­aÇ¢qºŽ÷º©”©Áa»2R„lÅ4M°ÉN曃…,V•§$d‹â^í_úë­ßî¥þ†f£ è"7]⯠g•ìãëàÝâöF4½¾*tu¾äéÒá¿è$JÆ9Ke2âLõ¿ý/õòcô!¿ZR™LùoOH&¦•fÖ·¸›Ü¾¨ô?n;µ*]?¹.~ü%&è”÷ÑþÆ n´±iªÿ:…7]æÃ…ô¾øž¿^u£1x5©Ê)d¤ä$e*\*~É+a’ö'mˆ€ l8âÖ†Šê#Õ9öÜŒi¶šòï?Ã`|Ú§Á@[õWoœØSäÊl[ò“­è¡sõ_TwPfÆ-겿«»§]ìŠKŠ—§¢ÍߟG˾†FèÊ6®!wÂ~ð—>óÅò‹±g_ œÁNc§àíÝ‘L›´˜ÀhÖ®ÊøÄ’O|9-Gî÷ôoûÙ_øqâ˜Ø¤ÌÊ:%UPÔÞÛ di™*•ž˜îò¬u¢Ã¦RÏõÀ¹©ÆîNž0ÞeÆ)ÿ9V–o0 þ\³Rendstream endobj 482 0 obj << /Filter /FlateDecode /Length 587 >> stream xœ]”=nÛ@„{‚7¥}?2`lc7.I.@‘KC…)‚–‹Ü>3#;EŠ!0‰÷ͼÅîŸ^ž_–Ë­ÛÿØ®ã¯vëæË2míýú±­;·×˲;»é2Þ>žãÛ°îöO߆õ÷Ÿµux¡Íwÿ}xkûŸ~pýt¸4^§ö¾cÛ†åµíû¾>Îsݵeúï¯8Ý¿8ÏŸ¯Uê{T öö\%Ø3íX%Ø‘vªìDÛªÛhç*Á‚û± Õ÷xª{ os!sos!sos!sñ*Á:mT 6h³J°I‹pE „+ X° U‚h‘¦(Qa"¯‰ÙÈlà51™ ¼&f#³×Äld6ðš˜Ì^³‘ÙÀkb62xMÌFf¯‰ÙÈlà51™ 0mÁ¸¯‰ÙÄŒ ˜¶`Ü‚a¦-·ààu1;™¼.f'³ƒ×Åìdvðº˜Ì@¤Òq.\gÃy6. 'F §PWÁ®3Csƒs3Csƒs3Csƒs3Csƒs=…º v@a1=…º vè)ÔU°«ÀnCû î7Àb2Z 5l2€ŠŠ€CM› ´j2Ødâ\¤ÎFòl$Â¥&&Â¥&&Â¥&&Â¥&&Â¥&&Â¥&&Â¥&&Â¥&&SxòvøºxQðÊùºaºñcÛÚrÓ½¤{‡×Íeiÿ®®õºò«ÚýÞ4,­endstream endobj 483 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6102 >> stream xœYXWמ¥ÌŽØGŠf–¨±kŒ-†¨A¢((EQAP¤³²”¥ìÒ‹p‘&½÷¥(ÁÞˆ ËM²ÖhM¢MSÓþ3É%ÿóßeAÖ/~yþe–;s÷ÞsÏyÏ{Þ3ˆ(#J$^ãè( ‘¾5g–³oD—L{q²0N$Œ7^3LÇÑBÕŸÆh˜!fôáxÉ}SáµÑP0œFQ†"‘›¯ô}é®h™¿¯_¸ÕÜ9sæÍšE~¿cåme;ÛÊÁk{ Tèoå²ÃÊa¶ãl+'©œ\ô·š* ±òöñó Úi%Ýiåê³Ñj½Ë g«•Îk×à2möš50¦(jù²[éû»–¯Ù…­ _a)÷Šò^½Ýq‡“ÏÚ¾~Îþ.®ëƒ‚ݦÙlž1së¬ÙoÎykù ¾½hÂ;­'-™JQ¨µÔDêjµŽzƒšL¹PS(Wj*µžšFm ¦SnÔFÊ–ÚD½O͢ܩåÔljõ&eGÍ¡VR«({jå@ͧVS ¨5ÔBÊ‘r¢Q&ÔëÔbj5œZJ FR£¨Ñ”)ÅRc(OŠ£ÆRf”9eAR–”5Ž2¦xjµ‚Ä ã(A%:a0Ý ÅPd˜løÜÈËè¹q´ñç´}Ma,0ßö<ÒZŒejxS ŸéâuLVÄiæ‚Bkûȹ?¿¾Ù#:ÈŸgŸ6g”ú¼ª^Õ •7}ØëhRb@ôÓÀJìÆÎXá°b‰ßÃSüM1kzéâÙo]´Ï÷LPªE÷4PIÎ ç8˜¿¦c {¬^&©íUF ŽÈò`ö¬`YY‡G’hΔ?Ò`Ü…-0Ó„5xöaÐLs\³…œê/!ó0×#®Bµþ~(RÎÛájˆ3±7Šmßj«ø'ý÷b½ylž4{26ÐQ(b¿Ö»ÄöÖÔB¾w­ÐGkKK¯2xÐ2AB³ûò Ú$zI³4`¨Aߘ±s„Xa(WdÑÆÕÑk\ùýböNߊ؀VÈÈŠõŠ_ánëÁ”ÒeZ¿†"…j8éûK?Âp>+¬BÞ€˜Úêò¦þÍ´oÑ/OŽk(Ä ©Ü€Á£MÜ׫ Ðsålº¬,FÂæ0ž~¥/Æ“[ÙzŽxôj¨T ž0šC¿a®&0we±yHÎÊbtilkýá~iph6Ÿ³'¦µ¡š>€†¥+S2xÏOE ùnø;¾oþóX)éLþ2m`vî ˜³Å¥è®ŒO«L/ EŒ6\’éâX$k)(Ïê(æ;}Ïf¨¾æ¶Ý?%éK˜§†cjÑ 4’Ó§@ ×BœÆã¡ƒÎ—˜±L¹JTãÃg::'†#f):Ó $X$~áz¼èý•ïÌ×1[‰ÏC¼›žñ™ïÍ[_íáõèMô@~dýL«d^&(#©æìýÀãå»±aýë7ô*eƒ#:8KFˆÍGÊô ¨»«;¤«ܦгí4v0ÛŒU­Z+y¸G÷Áî%^÷§Ùη¬ã£}m<Ô‰ÿ9£€ž¡ »yøp¡ªƒg·fÕ Êq7éò_u<QäÐÎäÐ}¡¥%Pzùq`0/êUbJo| ožv¥ŠHÁD-ª‡M÷`“¡°[˜¤s!2xTEø6Ámc•žã† ºª…1~Rì_jEªCEû@ ß›·¼ðQúçpZ-*‡ÍßÃfC!Wxƒk CÑ<ÓÑad›:T%é¤7áÓÆ™tzc܉øÃÑï.òC‰$#"v§lÇ|ºœÉ¤Ýà´q§®‡£(ÉÀ×kÈ&—qONx¶â²8„² *Õ ³J³k™,:×­ÉI.Ž©DŨe—çÔ^†ó–šˆ’è]W›~¤XŠQB9‰œ )¼s³“y__ÿ5ž´í d\[_¦*èÈâÑÞ¬¬ê=¥Y%¨1ŸŸ Z.Á+v㑛Р†M°ûØá—ŽîüÖ“;æE9xSØlÜ¢ÇÚâqSa=†ÂNqª”›˜!OáS㢶,CÌÂ÷¯}wJERj\ÍA”$Éò«RÖ#¦¾¦¢ùæDämÖâñóð°ïßSìÿ¹¢M﨡\mz¡k[×—]0ž|˜±uBAS$ 䥸M›ì-XxRêÒ•I¡«°‡y¼oRHjɶēó 8#/±^†”ˆqéó”„m&éÖÆ÷*ÅZÔ°¹Zgð÷t§a?Õ-š%.Úz»æÄí /ñÉMÉK.N)F%¨tïÞÒì¼o ¯ø,“ÕJk—ès&›xïe>ýL‹7}J¤T!ï”:—hö.ßFj“hÆLÌJØl<êÑô?ºŽ45«xÖÉ)ñýŠgÃÛÛîâ±héòµ×{~¼võÚ•N×A >é‚È.R6…;:”¼®_#¤™4^#ìŽß§ÈÞ…,Vêmùx1úC¯zÒ,Öôî.ñ+ÏlD-ÅÙ$B^ƒxðÄèòç—aŒÚ”Ý%ìèG@tòî¨>bãú$)²A6Å~ËÀiº¦ u½úg<1”°xÄóÉÀùÉG ür˜Àá*ºôæ¥ó×Q÷²‚IÌ Ý¥&’Y~p‘ƒ#‘*ìˆ#wá£øHÍ.p„5µMp„·+à#Zž°>Á%4r.š‡d5ñÅŸFÐyÔ>+:Qr©µøºÚ“Ê\‹·Ëœ˜ò‚Ñ$}×h~z`(Ø ç¸Ëï¢Øw—nÏo˜2XßãîÉz…¨~°`M†n¡—j#NÒw?E-|zÁŽöêºr•6<8ú2,»pþ2¼w9ø²ióÅ(³ViB/¦kÖ]4cGQBž`ÎÕEµ®OpÏôßʳ&TQ¬_ÕÖq³–Û,ÜVP%aETBlRD°%ò+•Ä“”µÌ­L°\ð»Œ1¿wóˬPGôG›âò½jßBÌ :Å¡ä= ”ŠâKvBBBif-²D9{Js ³3„w"æñÍ=v® jIjŽQÕ×ç”dåíªK)DLE]q³¯Â†œ³§§Ûz¯“gyöjî…cÇΜ;²eÆœ§Í¶)SlŽ«,hk«æÊ ÐMÄô€1ZПΟ 0°+‰á«[Hpz+ÿ¥‡üÿt}JÚ”H,{—¦š”È„ª'\iĈ~ Îä“3vÆHщ³£½Iu||sx²ˆaÿ¤£J}ØòÛ÷îa¯øÿ‰¬€»Døµ 6)ÃþU‰"¼,‘ ® ¬VÅîGÌÇõŸà¹ð+çî±nÿ>Ü ÙžÇÇ>Øü¢~Þzf þÏl‰•„õû ç„ †'è!ÏwãázÚÿ”N±sð¡–SEÔJ¥Rim„JU[«zÑŒšž¹ê 9©‰Æçª$5‡®ø‰/ñ>´+I¥u¥¹W±O;:ÉœîBd»´Þ8ÕæÏVFžœ`§aË c{gÑ(ù„úíò "%ÅïQìÉÊF{P>£ ¯ˆ ˆ áÙ¤÷~F‡áaØž“%üøJ'éôSÍcòc(¤éµ]ãè€ä䉭øEãt,z•nâAM½L¯ÿ"jÖüå&KÇ1C ÇXÃf—.—>%Ùã Oƒ 0ÄÆízx¶žJ ñB<Ó~×™ã0ÈÔ½Jw=a¯×ºEy †â7uxú¼eòB:<ìV‹nk œ´B¸Ûßbqzý0þž¶²wsÛàpæxø¾EL¾ÚÚÒgÙK³žÒxäƒ7Ÿ={ðFòð´Eü ïÛßÜà±åo ˆ}‰=–(|NoàËC‘X@Ï öŽÛ!åû¥•(+Ã"ö«– 9Ѝ3´}(ÁÝbßÈ~Žx¨ó2YD+ÅlgÏᓇëJcx¬G Éí—&ýË­É_ !jÓ"˜Ÿó[a¾ûD(Ô`­Sëñ퉿MvJqË”•–ze ¸gæ%Õ…£$Ò-ÈQ"é¶à-iŽD¿ Ü̪”sn‚•¾„[¬SÅ*T É¢oôV³würëQñ¸T «³óÏA\Î!Ò7äxœÃÑYù²F”O:‡z”Û~C¨6/ê×Äð¡Æ~‡K‚¡[ù}´á¦MWbd©òdEQJîn ,¢2¼€0Ø”X‚ÇÍQ$&§!“œ'oh†m`ºG§ÕÐB~‰Žu}×+ˆîÿ’SIQbÌn”˜Èûú$øŠ ¦“&}L{þ˯ªã‰Nu’Ý{´ÑbÞuX€ñÐkÖ·:<Ë®"ˆÅËñx¢õÍHÅY #H‡nõèë ͈à¬=œ·mñº|÷ëç?¶ÎZkÁ"õŸ Èddò ý ›ùçD˜©WŒí途¤@Éß«ÅAy‰ûy°/¨¿&ù5C!†ø¢ÝÅš…‰t1j÷óC~d4OÇ“?ýÚQ±„Hæ‰t<òkoGíÅ>÷Yè–•›™¤Œ¬2­¬êpÞc|¯õñ`-ÎÑã Bm¦gz(BHíØ-æûEIyœD³£.þñöÑC ûäã®W¾´„a“oãØdñ; wª*jê*TÅi%Iù|Ù‰“­çsïÎÖy+Ü×Ù»Jp(vJJNMCJ íãfžÍ…Ç4Ë D$A {®€»ÚôXÏÚž’0Ñl'&„á`Ë¡ë[.Ù·t}¨º€Î1·l?Åb=½j“Ëš9Û— •äææç¡j¦>ªZ¡œûÓ:RL̾yü¤/¼ð€+W”Ç&¤¦¥¦ðÁÒÐX%a›ä‚¸â¸y?Ú…¤±á1rEHŠfbËbË‹òróòùUcy)*$¨$¾$®:r?jBªòºŠê²æZTÙ¯›)µð‰Ý­®n’úɰY¾%ð;½/e¯?/¥ÃPZfœGá¿Ì“âP@AJ+¹˜rÔSR«ÓÕ¨»ºXbÛVËhÁ/Æ:ß¶ªaZôP™,AàÌ=_ú36ñóL‰ðæÁRôžÃÕê’W‰£Qx[eNná^¾©ípåEÍã¶ï._û¶tõÞóRâ¼½ùÄyÍá告ऋ¾^F0úé#0Ôé&0è£nÒšž½¾ü HÿÂDô¤ë9 çõ`7·o¾^ÿþÞC´•'䦑W*qfX¥¼±¡º¢¥Ó÷Üt’–x8öÀ‰`dû”gèç¯a˜Änì{ç÷vtªå|býžzTÊt_þèó¯Î®Z¦Ý¿0R¸HØUs8| ¥Ã÷éÔòh”Œ%ñêW%U**h¼ ¯ñÇ»6`”( ½¢¢¨™Ï…˜¶êKÕ•{öú‘ª†­©W Ôi´ÿÝ™©Ãém‡KËj¾l:Þ‰.0÷ÞÅCñ°·[;ŸØôE(Ï^·‰\ýåô'ó`4˜>~ø¿qÎŽž¶<»ÏÖñx×™®S_ܽ°ÙMRŠrvö.‹xÖy‘}—F}ñãï_XãÔG\_ÁI‘ ®pÙ'ý÷Æ¡(’íY‚=ͳÙ‘*Ô€r+³*¼¶ýû ÝAÞé† Ôß]~ÝŒýç*©ØP3N^DÜN?œ gÎT>Î'âQK¦Î ×7+²<'77U0õÑÕ¡2yLp`årÒF™“ì îü’;œëzçEÖ>½õàz×£ªp9Ix¦mGAÔrK²sM$¼} &_ƒ…rQ|î:¶§+a²ñ©>þÕ^øÐ¥ Îí+T ‹ ”’¯ÀÃÍ'½òêÒA ÿ”ŽÆ“Ý/¤cñH”†]SÓšÝ\¼‡/‡Æ¿þ—ëŸëJ¶{N»Ô¤>Ãtì«‚`ôϲ€/½ªT\¼j]Ñ>êyCÒ§ø&vˆ÷¥¤,ßH4B<Šcˆênª©/î¸ãz›ò}=C’Åò>bl·ú=´ …åa 1X!öÈó®UœÎË)Ü‹êUX…<É7}뢋KIàwj…ÖÔPÎȪÓߢk Žƒ8ç ¢ÓèÔ©CÝ… ,í5ãÐF-«wÔmÔ‚Ü®Ý#52F0åÚw"%OÔªr'ñç>mü‹.Þ§uÐL£ömýü‹Ž ÷:´ô)]Ú¡«Ÿ°Œ¤žýz•¥äDãQ_o FèÙ€åwåEù9¨ŒÙ›V‚·as\€‡žx«}Öö¶K=bs«÷JF$ ïÁ’¢œ"Zm¢Ê›¹J‡ 9Pž—¥}åVçä FQÿB}¨endstream endobj 484 0 obj << /Filter /FlateDecode /Length 2657 >> stream xœíYIwÜÆ¾ÏI9øš7§¤'0è½›'q³=I–F£äù‘9@äh{)Éÿ_ÿ‹Tu70ݳЎ¥Ø—<4z©®å«¯j~9øþ_-Åp>øa@Ýè0ü»ZO¦ƒñD3Émaépúnà—Ð!å6—ŠµÔ¹år8].Ètdx^B‘²­ÊÕ¨È ) ³–”£Œs–[ÃÉÉl”áË iH2i¾¨ÊÇ8v¡šœU×î+×´°¤ ë 5ÊÚO³–‘Ó›hVy½Ü˜y('ÉÚdNw^ÁÉYéæS&É=íP”Lò ½%_û¥Ò ƒ²ãtÁ iSÙÜžw"gþ‹bJ1 Rƒ&Щ<߇£@9ߢ­‘–¬c!W8ÝJÎaö|ôïéS°‹0±]¸a¹àl3½fGÓï™t˜q™¥pø‚¼ò› ¦ AÅšnG“*G½MΣ9q\‚xŠLÊe“Üác÷M“§'ø,œm. µÚ\ŽPƒTÖ’<:TØŒ2 £T*ÒVKðT¥‚ŠpgÅ8ƒ+‡ 5y^}hcÔ‰M'… ëwáYròb]/ËEx·«iëêmtåXÙmµ^E¯ÝžVvóã×aœkò:~_µW#AÁ$#±gV~±Ôìg„²ÃŒò\ ˼‘&I€Ìëäµi¶¤ËG”w«?Ç2v ¥rA æã‚<]ßÕ+ÔÇÀ•Òé žÑèè›Ê‚;ßÌpL9 $uѱœÕÕ¼ üjPÿëlÖ´áC·­¸ŒÁ2°kÓ¬ý`½«ªtÚÝçÁŒÉœšàÀÑá*4¹J®”êfh›PŠ”¼»í%áJ\Žú7°¬øBƒÂ:]ñxuÆÍ•ƒ0؇º !“}ç øij»sÎyØ¡›0÷Ëõmd¸å âJÄàãÔùúémo¸Ì\g$ *\§\âæë’0P2ÆZP/W‰j ‚4 ŽÐÝ*õPPínu{+ÄXæ ‚<Itó»rŽ"*âƒBòšœ¯î«ÚYžR€³Õr¶j»¯’¼[×á…ÒÄ‹œ¯¹`Åó„%§‘ÒÖËÛ»¶Zí‡@€X0ž ÌÃSòå”ñqÆbÔ&¤ZÆ+Í7)kÕT-Ð6! 9.„VÇ1ô‡Òn0ªH¥aLyÄïfŸ•m¹ù´1Xb¯‰‹í·“=­|^;T²[\?ɧ­pò·-Ä_ãÍ ýf_—‹ÅøtâaˆÊ©×Ö–A„ñ³¿u°oëqßQç˜9c˜Ñ €×ø D•sŸõ!c ¬ŒõÙ展:?ÝÞ]ôPk¹§±î‚ÐqßÚ¥_ÈÃ3ô|Ži*™4ñßzMG»æ>Wa\ H "µƒŒî¬—.0£ ÄÈÏrcL2›Yž£pEOã™%СªA&FãÓmLB% g¡×Ã0y ymÊ¡æ#ĉãç\¥½*ƒ5ìNªwvÖgà´€Õq¼^7Én÷}q˜†#D‘ÿb(8·K£L8å žnqyÏ®\k¸YTÍÍ.ú£®£œ½×kÕå´Æ— g±nwã¼+u;»Lt¬Ý)Ãq>ÀÃÙŸ­«z7T4S…sÑG¿X¸ù}¸wf|_˜$“æ[k¶K¡NvEØMxƒ@xyðØ¤¿pWêíºÎÎ’¹·Hs\?à _î¦À°[ ÷ÜÕÖ^I.œ·òõášðed»zDÖŸìËÕ@0ÛÚÃÅ ¤–nr­Ö)3Š«›UàáTKOAA^ Ñ!Ëmÿ绤°YÁ÷ÃJw7=Ö!-ÔXJt‘nùƒ‘ÎĨwC¿@ltAæ ¼§ÁS]œb Ââ1‹cAÑÇ[þL$µÐŽœBjDoHªg¢ ˆžß6wž æ©Â¤CdSV`siȵxñu]]W³:¿º)ïîgåÝ“»UuŸ­ëŬ\5ù»úÂ×Ð!WÀˆ€$âANG›Ý~ó`LYï|£“˜‹BƒàÞ]d¼,o—ëñr¶|[ÏšqwßO* ñ†=ðbtÝwjãî;‹ºïô×r’=Óçr- kÅL¬¬Û}½8@—¬Cß±ú¾MèÑö~È™êü5å»ëeÙC€!'1V‹„•¤¬­Û8€†Ù„»W<9!Ž$ ßIúþŽ$‡ß?v3¬ûUÃϸ!¯É®züчذ²ew@ûWãWD©ÇHYÖßG=Ý—ŽuãøñÆU¨2ÛxæV/BÜGT·Ø"{Q"nß­vAÊ }„„ßûÊßéØP‘Å3`T¶7ZßC,?ô³e<[S*~ ct`|×êúænÕÎê'=5òiÀÅ0 ®ÿÀï¼U!wú)\èSÈ^¢À_ÔÌçûeó‡¥Ç]t`ATX»Èë õè·U·-=ˆ X奿΂\X7 7Jp±vÜÎHvèçØËÑïãóPÏä\8×iË·œÑÏèñT˜œ!!^¶šþ~çëÝS¢ïüž0ÿ¿¿üÁþÂhÅ¢ÇÈæ#Üçɶ¯¼üœkxendstream endobj 485 0 obj << /Filter /FlateDecode /Length 12096 >> stream xœµ}]“d9‘å{ý…}É·d©àJr}1Ëšíì6cƒA×Ú<ÐóÕ]ÝäPYÕ“™Ð ûçÇ× éff7MT†‡t¯¾Üý¸ëHñŸWÛ9\mø¯ÿûÙÝ«íêËWÿù*˜ôÊÿùìîêß¼úÉo¤©äÜ·®Þ|ñŠUÂU W5×sOùêÍÝ«S(×oþC ׸.ñÜ›h…7Ÿ¿úíéîö›Çׯc;o¡ôÓÇ÷ׯSÒ"]N_\oç-§6ýâÞå­ž~¥uþpýZŸ™k9Ý_‡ó¶Õ­Þ¡œ7þjzêçÓƒÞ¡â–[h¥ômÿþæŸ_ýüÍ«_k_[ŠW9H½º³?kJáêý«[[þ¶"ï_ýîÕ¿]}øÖQ ¡\ɹå°É†˜Ï¥ï’÷¯>y¦ÔEâY¼”èû1D—R»d*Uj:·8—Ú%S©Öû¹æ¹Ô.¹”:¶uný¥Ô_3K¡Ÿ%êcR:W±)øíéuÔÖ¶®ƒzÚ®_KØ6ÂS´?Ã9‡“\þ,—µ¶¢3ª-Ï›¶© /.)-Ö³¶ÀzüL©¤­h»d)Õ´eK! æ2%íÚTÆKéEÕd.ä’¥”·s*5µü/Û}}ë«plU+1¤­éà >eÿ$E?~§ÃmŸ–ïâvé_[[|„|M¨Ú«!HW¡äˆõãê°éŠ]/¨EØtg }ÐÕÔuY•¢Ôîß¿{õ¯.Jp(•j>§K)%5ÇR­„sÐz©¡*‡R:àõ\G¡\´Ýùi³Dǡ>•c:Ë^ª¶r®ýi)IùöÆ­;”ÊU mî^*n*®Ï¼QM¿è³T?oj³u¤µúÈíœô+¸úÍ/9m5,Ë¿¶sÓò×I‰çæã#%õœ}žr3IWÃêe*eŸÊf• ¢&Hç­PPÎÉ%É*éÎoäsµ"â/ q;ÛÀè2f5=1AR0“&éçfC¬–\L¢k¡ Œ>ã›T¡LíƒP¡‚.…ó†ÁTû?$“ ’Ir¢iÐ7D–ÉZeR9JÔÙÚŠRE¶°ÔsA·ræØ„ªƒ…"úEd“k…öçÜ0?&QM«Ð.j“ØV]Œ°…&é:\Z¦Ä2šÜ󹡌$tF%QÍeF]ÃÁ%:`:¦¥Ž·G<eô],¢£¢½Éê½aÖM¢ã…¨¯âˆQ0–º$zg’fK»j?;˨uÔÒ¹–îcS;C KÊF4JDÙ\õÕþÕÈS«óÉ*jA€>xëðÀ—7…ʨRWXãK[ÔfÊèŒU¾©(Xn¥ÐE©$›Z·Ú1hèðg”ÑÖ>¹©QÑU(u®…,-Óu$XD C…:&Ü%Ú]Ï®¯Úl&]¿Pª®(#wJ”ªl!a`!Ñ¿t¦Ë&c $ô8©D‡/ÙËUwUÅÕ¥À &J`¨ŠþëúÄ–PDñHãËÕ–mj®šÅJ:Nª”%jY®Ú$:*Z&ª¯*Ö‰”Õ£ ºÇ'뼪^•d Ê$º¨Š–Amo ¾®+iש©nXŠ%µäö$U{bIpy|Wu'¨ÃÔ9M WE»/gÐ+•$/HzÂl«ÄÊš¤aI[öK`m¬LôçÈV¡X* g!f1']B…^™¤Ú«D]Ž?—ýèÉ®Œ’ÔJ%–Ð$úNŸÚb7¢S«í*²+¬è¢Ip%qØ*Éì£JºâPJzeeü9 gU¯T’}u‹Î[°2›…¨eï‘=7@©85A³t”‘I–šÎYLHt–6ÌM-n“Em½ê–Î(_­†^P@Õ4²@¯·‚…ǵõ etý&¡¤@± ôÀ*Á«^éêô $C¯J¬Í×[Ö¾T”ÁJN”d(VI¾*mP¬»²±–Úz(VÔQ-Ñ%4šzèUhÃ8d5õ¦Wº ;%j8àãuÕ»çQãLÅÒÔØ‰’L±à29İèP¬MŸS­©ªç2: »a š‰þ‡Õµ™ÏQ[_PF…S®j›ýÉPŸHG§VÔ*T3ŒÉßU6³Ij^õ_[j‘›/í¢ ƒ¿ªê2hAÔP˜¿ªú/-HQ[‡Utª9Å0]Ã$¿’l$sÉcUèš:Ã¥èØ{ãļ¨:«a= °WC+\ÀŠnZ×Xj”T8Úœa ldŠšúžè;©0¥˜ëUïZ}é5õpV/`-mé†2Ú:´¢¦ÞpØnKËæ¬²*gású¥Rɘ)xÈn ¡ŽªQ-$–¯Jª.³ 6B§¤›ÃÊ?jÑj˜³ž-ÄUI3oTCkR9OJªãYñÅVSt–ÜRÔ„P”€Ê>«'óå¼@²ª6^Ò„Új.ç0㺠è›fìWUsY$us6cU ßË*±Ÿ%jáÓZ¦«.’¾@j“4¨Ó$iÚÙWIuü·KÔ–µ &0/Ø‹µŒ.„º–Q¿„†*)Á&‰Úø¶–Q_DÝòfl–¬/R_—!mjà×÷((k e•4*ÔE¢æ#®eZ¥B]$=R¡&I¥Bí’®me•, $ª9®’B…ºHÔÆ÷µ R KO{Ú¨P“$»B]$Ý…]¢F^Ö2Ò]§v‰šÎµ9jãóú˜’ÎiÔ9F…¤ÆóAPwµr‰âݰ Ê®W.éa׫!)«^)–ßV½RI^õJƒÂmÕ+•äU¯TÒW½Š›Zøee«¤ÃÎÌ5ò=¯’¶®lu± .‘´U¯4þˆ m&IEˆ`?œà˜½lâéß³´Ð†uáŸF2â¡t¯îmOq:.F¨^yl½§Á͈¿3+©¾¼–ÙD7kàò|p³@°|K$sÙ ·y¤{Ô²u]¡:•Ø$RÁ6f«¶ýÉÓÝåû/a¦løÌ}éÚ:/êà± ¶}KüIÐ4ÕT³mÉÔj~ŠIDGè?©‘„|IÇGC¢Šýæ_ S xýß/‡¿=QI ±ºU™#–žCæ}Ã7 iüŸï¯Õ¥«ÍJ§Ïo?Ü<¾» +ûB_]GëìooRªºç¿( û7 aðË<*ìùbßé[iT?Œ>3É )Ic¦s¢O=-u‘Ld&+0n—R»d*ÕÓÂÖâÇË÷ É…„u‘L¥Òf>k*µK¦R‡¾Ì½ûAôªˆ--ä€z•\¿ŽgÓ*vuÏà]¿N(ß;˜Vú§:"­ô/Àž™ha«§ÄÖÝ.©ØÜ6@ÿÉs¥¤ËšÚšJ©–òM¥\2—*`Ô:•’¥”€U”æR.YJÕ`霩”KæR£G—Rs¿/%+‚1üð '+6㓵 ü{Mƒ“µ—z1lÄÚÂÐÚ5Èç ›ÁA`VÕ±ÅA_ÒÀ¸L©;+¤þâPh¨Ù¡TÒ:^^ACnOÞ‡YÑþ(Õ§”óxàjRÀÉ" PÂÓÁ•åJŧí裃»8< è5׿„è¥Ë5Ì=ƒ’nyÝ&‹Y•yk/bS>¦U²çv‰Ar¼äv+{j·±JJÓ.¤~lž‰f¾L-J»–…O±Åâä,5?ÑëxÔ±ÛËìµÁtiFÏ^—Ñ´R|,gIµ‘ Ð%…wí;!2 ±±êÂÞÅ–™§G‚•oïS¸;OËR¸a@Ù º Ê躷8.ôe‡LBÊ”q 䕼–0áIY+“t±…Þ(È.ðýÄù|°º×ȧ4¾;ùöIÆ™A‹áÔ蹕âT´Ï¦±­š¸1àˆ²ÃqÆ3ˆ¡¬VÀºÇÄÐ&—R€2ß^Ý„Î8S%ð6Žp°¨3xkêGIc­8B0Ť„·±1¬Œ )¼u‚ºE¦î±qBA…åÓX%2¢0õi ÖàÜÄ쉈œ‚-¯âL+•d«„5_”6®®Êô± 2ë´Æ¬J’JŠñÂt=û‚ìb<ê¢CíY óŒd˜|^:rJàŽËDñ¸U0‚òöxˆaóiA”h•€) ù œJÚ¤Ž]¸Î"\%˜ùXøÚyìÒ##ŸöŒ@oÕÀaâ>$à&a7T(¾«cdúÆ.i»o3 OHb' –:ŸÆ2@–,ô¤Qb­ZŸ°lLF_Ž*±-@›(³ {ôHl³D“$Û,vä‡ÏaúEWM¡ÝJØ£·äá¶?Yí’‡ ²%¶9;µ 4?–ÉNm ™YÒ„=zd—ü,S¸ÝƒIì”TcšªrÒ$&ìÑ­ŽjpP§éó Ç¢ß/C±Í"&ìÒÛÑ6Štâ’j„xJ —Tq—“l“È(4vÉ6é‘Ü"d²Mú@ƒ(h7±7)‰ïÍÐf>D,ËßùNDÂ}2³_"–¥â„‰ÌÄ|¾%Þ:ËH!s¬4¢“=¶Z¹Ž&ƒJÝé˜øò²1ŠÒY5b‚ª''²e>¦:8‰ž;W‰ƒõa‘ÍA —ø…K y,Û_þàcZsDCML0„Ð*”½XÞ¹÷ ù•FTfDl j‡0•Æ ŽÿlP%åܯík}%i¬&ÇJý@’J œ/ô¿„dúÀ@#k™PWjUi|¡,ª¤(ç‡ZpÐËxY´¿Ö’²²(çe-“óÊvIR6bæI" ?GÝÏóì˜gY%í°ÀÀ8—µL;œ@J ×õɽ®ì¾„¿ÖZ°Jufìj…²R§’…:k™˜WÂU2Öy_%rXaÆ:_Ìhç« +eC)‹¤­œ¶„¤¯zà€ÑZIÝn_F¤ó²Ž—eLI<–4I §LÎ&m]c]`pŒ‡ZáÀþMˆvµv®ÒEÒœv´Kv²ÒERv´K$®¼±¾ÆÒ­®R]%e]–ϳ»"²9¹áÖù‰ØôFÇžñâ{‚5&ç¥ØK¬8íÛJö›¦×{@i0Ù¶¹ëõ†¨gËNäJŽ®;G¢Œ–•±Ï.–¦9?¯Å3$Dä#ÇÅ=Yn0œÕE°ì1qݽ»ÙÙS½gßýsf—Jœ"%iÛ|3-ù&¶JHĈ3%k{‘Íáu%WËÁ´o”©‡q ×@F0 ´ ž>ð­Ñ„]bC*ê¶…@Y6>GÁQ Âî"ÛãW!F2BXOÎôØ& ÛxºÄ6—=l(Üø,˜"—T;SQ:Etm;ßÅà5Ö:è<Ùñ5Öd ,64`œÙâf´ì¬Hˆ[ NÇ×Í(TÂÁûØÈ*0n–PÆÞ¾À`+×^lª¤6mZ–p¸à¡¾l;6gçû8¤Aí-¥…ñ.!©F58ÑYì8ŒŸ/I8щU Ê‚ 2ýÆ·ëD`U"Fw¬œ‰ÑZmãí…ôZÄ,sóÈ ˜#þvrò2î¦$ [Ç9;hIz;,É6a9bJï:3ÈÅÖ"Ë€æPÉâè|pgÜŠp†CHÐ]°ç]]`P¡ø&|ÆRÑð|„ÝdSpê›BlØ6Sd‡áÌS€šˆ±£‘ê <2û“ƒcš|{âI½‚r’‚,åcß”j ²mm•Zóhr.$­ÅD˜pÌÇ¿@bûŠ…G¥oÕU$bÁ}’0Þij(Å(..1ªBé#é  Ûv„Ãèd3Ħqb:ó{-¹Oków³*W¶ÅrŽí%JŠ?%ð)ÉN7× v”Ÿ³¥$@•³£Bkk£¶ÕW¿ vÞ3Ù‘†¾qà­§äÁ1Ðw1šÖæ ôíe,X®¢$d\•ýMÂC{$HàÁí"µÃ$ÅcmÕçç=ƒ¥åÒWcí¥Âœ„¶Ç3‰©ÞR²ìx¼Ùj °=½„Ó¡8‰–© ììVÔ¢ OÝ8Òœ„b['HBÐ2æÇÉF¬iÙœù–@›nçQ9¹8Qеˆƒ³™&˜°{³¹Á±%·¸±ÿƒ“¯qœOF›F楎¼$&Bá8Ì3¿H×ÀwŒŽI´üWŒFÍ¿9Á(ü¯ ý=8<ÏQŒàܪږïäÅ•? ïÞPö··)‡Þ–¿(ÇÙˆ½™cd÷À…ÿIFðºÍdÕ’b±ÞD2zZê"¹u»6S‘.’©”4»o`*µK¦RÆb]Þ¸K¦RÍö^Jí’K©cæ>þ ªr^?Þä´ò‹@*Ц‘ a;•‹´]Öaž͔½Û%q¹:ÏÊÛššJµ`h*å’¹TAÜÒÂTjH–R¸Aú\Ê%K)U^ë´—rÉ\Ê;t)4õðûòŒ’º‹ŽLØ3<#€¨œÏHß®&jðŒðÔÁ3Ú?Å¥Þ‘g´ìÂ3’ïÇ3œP½¸ŒÁŠi`x$7λ¢É:àv×½n}˜N¶ŽR÷HßK¹:i8ˆÓËp‚”pzúF@Þ÷7¥=ÒƒÄ2+^W9…§/”ŠCsƒC´kö¦Q°ä^ gZ¶ø¤Yv3GÚߨ¦Ãþ/w±KÚ/{šŸç¾?ë[©F É­¸êŸ„C2‹ âœK8Àæ”X†>ãœ_)ÂÎ"äÄ8ÜŠC,Å­ˆ±¹ÔAáP’¼yôÖ¤ÅLË ‚ö¡ùäÞ=UV‘rSâ©2Û{Ñ<šM\bg2ÇF›J†¡RË}C%tÂnÙ¢L‰œÁ!6Ë…r;Ò$Í3c~ÂB°Ók@aã“Åo‘!çBì4v`jÌÒA‚^ÛÛÊÈQl§72³n®¦öKë'lS¨e[A&Êòb…; ‚^¤û:ƒK˜Ò,‘Ïè¼¶£¤|fÓ:“óÆB²æã±Ín³jü˜÷ü—EXþ2ÍFñÉ”dQ¢Ÿœ\!¬\³G2î«ÕˆHàù(c«XÄ"¸C  »Ò‘‚n“Ô2ï´ä›ìPb ^BìUFz"S’™¼DôžØ<¬ ¿v ïpÀžº¿—7´°|ì@qÙ¢_Ú£‚æ$”è/nv@'m H”`ßÜÛ©SÂ8Ü¥’ºßxcJ*È+Ù†YL JÉØ$ÑgÕvsQ¦ùÞ· ±d”ˆq~X°›k×Mñ¸‚IÈ£±+Ã(IF )1Õñd"‘ÇILÁ‰k£¡€”(±¬˜JÚx{f+Já´Q+ãÌA̸*ãÒ6A")±9.¨vON‰Ü•0I&õbc[pih4™Ç>ÄH-`U4ÏØ  vFËÓ˜‚«´Á®¾?¥[n·øv+¦ f IP>7…!Y²‚q´¬$…ptGX+X䪪å[ó’*#ù€Cº|N4aÁq#Î8/w…d#”\fÙÆ,£ŒX®¿ ‡]YF<­¶  °ì,«‘˜,Û¶ SžC°mË̇_n&ÈÈØa4µM–9’d÷9”-•]`¶ÃÎëúc ZµO3“šŸr‹â&×ÐŽŸró1åñú‚ÃdvˆLý™âõ±(²;ÛÈ9„$0³ý®?\öÓC“1 2E0ÝÐg*§.IÛtÄñ@ ²ÅNÿU»TÎ>‚¡³Q¹§'¹åà~DpÎyêäìTÐÌnƒ3Ù¼œövœ`áñ¬ìÇW!)dlà`,‡ ·‚EKõ§Ñ¼j§À-éX«V£ÒŒkÂy!xÙÒêhr«´ÜÕ÷J a3Þ%2Y#@ÑO´1Eà¥7¿ÊhªbÄÔB:ÍjÁQVß+a·àaÀËæÜ=A:Å’½rSH@u17Ûü¢à<½a"R7Iæ~~ñ¢à@½¹ÙÜ]e !׫˹6ÉÙ¯Sg‰QBÍÍ2Ë#¸”^6ð ›` É6vMUp£@uj-=&`ö2šdÐF“_%ÅJÆ;vÈm¾HJ°çÔ<1Ù6ÅÚeN n%ÈΜæ„ÿµ¤Ô¸HJ÷ ζ)¬šoÜûá)Ñ3W\ø`]Çc¿›Ï¨è±aÎ 6bru‰Žüri‹`'v¹7EÀÎÊk™²`œh y•¬ÏPØ’ÃÅCRúv^ŸÑóº×-uÛV®‰TÞa¸Hú ©! ²Ò4Ù˜åþÁö\ZËÄÃORÓáÒAX³Üì#¸×­$meÌøÅi-“ ñs»‹¤¦ [k‘z iH=ž» Û:^ý@kì.ƒÓ¶°ò$'å—ýziáÀ|œ”_' Gå—½zÁQùº¾+m‡Éj)¯4ir¸ÐK°1¹NVÃÅ#Ëpr\kå~˜,»÷k­Uw ©1–Ãdaóríz;p)TÒÖ¹jýp‘€M—ñ›x,`Û…ï$Æ'N«¤f !bZkź’î'ã·µL:\%,æ™ °ÌkžŒ_$eemI/‡+y‘å:[ˆ,ëA’Wf— ´\g«heÖöVÂU«àpY^F`¹0ÏòÆ f‰o Ì’¾Ò¯²íh®eyW vÓ*iële@½åΧü䚯Œh¤­er]-yF`¹XòŒÈ2­ej\M¹JÖÇú‘…YR֩ʈ-×g€C¹H[ÆUWKž].–<#|Z§ ÑåbÉ3¢ËÅ’?O%b¢oΛ(2Œ,$ˆüDó@˜d '5Ú¹›â—ˆ=ÎbÊïÀ*8ÌÀeàˆX1çñ˜Ä›^ÌIŠñâ ¸øLQ%e›íÅIbQ"i¬' lÏÙ \ RY_ëxS1¢]T̨ $/R \ëoWw'òªÙ]ËÉYt‚›Gp=tc´‡\Ë /w%²ûÈ\bWü Î<ÃPyñUA Ãh­n™< q nè²Ûkjôp¼"M‚Ô°j‰óÈP82±&Žgði»mÇ.Ã5‰CB-5ü3i—öÔÀH5Z¶à*ˆà8ÒÂŽ‚£?Œ pŸ,îÁÂ1+f¸PÉ8ÆÄ2Å¢¤bNŽí)ÖŽ æýVÛc7)å3ûP¢a÷$e/až G !’€ããÉ 'i"ßÝ/OÚF¦70Ù%WÍOk 2~Ù6†£›(Ü'Ыä÷Ë´Dš÷¢¶ZÚ FÚs΋AË>‰3h‰©)~ÓžxxoÍ© ¸„ Sƒ˜gHºÍ)Ûfý&œ™åèá&Ì x1T:\Á„yÁúôÖe¿Ÿ¬•!)æQ Ò;œ)ªìj¢‘\̽%éJópw0¯ gŠØ° ‘&óS¥‚Ålg¶{Ò^pR/@{+*E3é–£)Á5n8!åW[:Ðì–žtºŠtÒèíÌkh‹y@àÚдô•Žsâ4íúíÊZ‘ΰÛf’Ia·MbÇ™Ñ)7öY,?–ql¾ÝõoŒ›‘õ4²mâ54¼ Û"žÄbîŽ;»‘Sp”q6ض-óâ½ìúCœ}¥¯ÆÉ5ãàdÿݶ{Ôo¡tÆnäc+¢7÷ˆ½{†µ;jÉ“8½è‰äŒ+Ī@²É˸nͰ‹TθOc’'?ÁeÀÓPJr=3ài(%&®7ž†R‚J xJ‡ªóÆtäåâìŒ_adäjá±æ­ppò&eœ7¾:G)ûcó8ïàz—‘ï,ÎŽlLÉ;vîì86ó^“ÚrÙ·Î(Ù––öͺ!iëÝÔ¿“ÒVpÝë‘h¾²c¤§ïÏŽœV å¯`ÇŒšsvŒXŒY¾?;æïÁ>yŽƒì,ÆðyvL,;;&ÿè{ýfXt1øãqûå¦_K»Ç/ªaãNú)ÿôú5Ø}ê,Oÿ:züjú°|á•C>}ü‚÷tzüQÔ÷Ÿcëàœ£?ùšž¹v…ÿ\ÜéÃW?ÿTníÝ’ŸÃøQ¹›÷_~¼¿õ÷°)wޔ홟•[ç¥üÞïzz¼¿ýã5ôVgéts«#î•òé—7sno>à;èH:Ýá'è°!šä[~‚nŒQ9}&s”r8Ý~˜ª°:k°ºzB§¯ø 5ÈëcŸVžßí•?\ã @E“:Sü×'~þ¼ÆñuuŸÎûåÉþÆ.© “O6,û\êKù{}Ú÷»å‹›‡ã»|÷p¶vØÍö ªö½ùÑoOožY0|çIN§¯¯µUÛù€˜¹xúryø‡–Ýéž3ŠJ¥žnÆ Êi^×öƒƒ]í_ÕÚÈÔ۵‡?^³ óÇ×÷7/MÁÇ;Yˆ§‡›»ù%ï÷Æ7j rªN·ž§À[ßèp¥©«:àæ®†ÒPcÚò3ŒØj}טŸaR›5)mü9µ£ŽÙ™zyY‹îÙ%þjã¢F·þ‹Œ[øKÕgTë~꺦V¼Žv!m¾z '|…þ¯ëרÞ@ó?\þüŸ¯ñ7ÐWB¯þÁ?õ|úóó…0ïß}zºûñéªÙÿºX¿º|ñ³ñŒtzó›ÿ÷óûG]_Ý|{y×TîýÍÝÛÏo>½¶®ñz@_âSîÃ¥AKþáò÷Ÿãóe´Ÿžþ¼7¥èæ·™B?yß7/¼ïîF ß7Ÿžî?ÝU;÷£¹¥Ó8}þÅoÿÿýÇ—Î~øì+H>½~i0GÓŽý¡oñ¯ê|þ%ß¼ð€½Óoß=Þx¿ÅlÁ.=»S—~ö޳äÃïâ·wü¥6=¿(?{{ûáóOušöGtm¾?â‰#t¥à,ÿâÜÒînÎΧÈê~M?qIˆvk±‰ßLýÆ×‹²Üc•ÓïX\ ÔS·ŠÇÔpúlV{˜„BU‘Âýl/H;ú&d·¼´Ç •àÒvéÃíã­}ƒ+NÂÉz ¡&þ~zÎÇѼšéÛÿ¶¦ûƒ{µGˆÍ0jc)|6;×›÷‹¯}ÐéKàÀèôÝ>ŽQ¯û ¨k9©Ùù·ÿ°z¾åSnŸÚ’#¾Jö{Céôv®7;ù×_ßΟ à–ï²â‘ç²L 1~R³NäM5GvZ:üþs³|ËÏ÷:ÑøòÛÀÏkœù麦m¦ý™OV¥ RXéýpX¹œ¸´z~ÿàOlû0NoÂX¥ÃÚ¾›@ÚÇ/u†K* + zÛÁ ºÿv öºâÖÑJÕ©‡ei=úG.OÿÊÛ ûloËó½U÷ìŠÜëé÷ k¹ÇÇ{¾%½¦y|F×ä'KGGþáãÝݽWE¾yïßi'?{ ícª]T+G›°a–îM÷€BÀ‡b®ì`R•}nü‡ÃÒÓq´>Õ—y2p½õóåg|œííãíÇïP7;¦²å]“nîÞ½ýúâøvÔN¿øßÿòÉÏŸõ8ª°ûSªëoÙïm´ú"ÞR{ñ¬'ýìSzã‹ÛJæòÇGEFö}Þ>`p%LÌjjÄíç$y÷Õó`6¼{ݦNüñÝýó`Ö–Õ4yßµ¿±ÈYžæ–ü€%9øKõÙ¡ï—íÀ…ô·ÚOŠ¥|ê~Jçûÿâ} utzÜîÓhß>š!Eüõ*À¦Ç'Ç5aŽÁð¦Rï‹ø%*¥—=ã\VqÐõpcò—…Cºàáñönà鎱p¿n«–ý Ì+€y0Ïú¤€åîÆüW(}~É[ú5b0g²t7·O]¢;¶ÏYGÜâØžÅ2®û“8®†(|,‘SN1¤ø"eQÏü%=]÷×+=]žc]NÄìðfO6œ’å%Ì|»7Y]Ùâ#ßϽzf.§LJ2?þƒÉÕãzµ¾Çèw·ß<«[`¯ØãýÃ4çÏ)#~ö»‚QÍ«BüöNÌO=ÂWï?jÈøv²DoïßÝüþáÓO!¿dìé³0õÍû÷bh£óߎ|èf9 †õZ̯—1®#né9pqS±gq ¢é'l——5…ùŽ6 žxn;šNÿôÉ$ÿ¹¿ý ÿ;=]š£îwi!&?F+ù/TvëG+=5„6Úï?ùÕ ßÕº!!ñxûGÓf ½N£«úH,«žÖtER J2ˆcí®/Ž~ï½F\}ãˆZ#šQó9ø Ð ß09¿ð Di:9òŽ:þËÌ_Px–ŸÉN(\A8~ˆóͳ˜í°¶>Þ¯1âÃÈ”JXaÿ‹ñí—#‹VÖ`è`½G»dz¢-Ù„}K¼´Xñé›Ç¥Ü°8ª]·°—Vð€ÁêË^pÒ»YùaNw+ {‰K"·šÌI·à¤í¡š’ùyççm–!оv¿º¹ÿôt÷…‚¶Ÿ}èú—àÕ/ g}zú d»ýpù;üTŸõÿç}œÿ ]CÂendstream endobj 486 0 obj << /Filter /FlateDecode /Length 11721 >> stream xœµ}[omÇq&æeÌH^<ˆ¼ds"n¯¾w[P€ØÉdƈD0Èó@ëèB‡’¶¤ùõS_}Õkw¯½ÈsŽŽƒ YìÕ—êꪯ.Ýçß.–£»XðößÏï^-_½ú·WN©öŸÏï.~þ髟~«PŽmiîâÓ/_ñwQÝEIåØBºøôîÕÁÕËO'‹Ÿgl5ÊŸ¾~õÙáîæû§ûË+_‹Ëípûxy‚4iñðåår\R(n‘?<½–ïä›ß_^IŸ©Ô—î¸,e©‡/Ð(!þjèõõÐÑøpIÕÕ\2Úÿýô—¯þîÓWÿ,km~¹ˆÅ¹‹;ý±„à.n_…Å¥égmrûêëWÿû⛹ä\¾¨ÇâëRG6ùÅk ±Æc]¼òêûïÁ+üõÊiGî“¿HÍK+Úäo¿øæñæé´Óùþ³ŒdøGÎüè³×©k¾ˆ®¶£l’Ï®c¸xøâ“MÒiZÒÅw2—_ÊÿcÄ¿å’wÇ.’ù(ó¹{å‹LÑ••rûê“V+ŵp̉­Š (ËZuÊØª¹xlc## m¼“¥7ΪSÆVa©ÇÇV2¶’EE*‡V2¶Ú¬zàÃÐêGl¸‹åè’°@Æ,±a7?;\¥Ë+—|ù\äÇܪ÷A©²›Bu Ë/ »¤?‡ã~ ût`b;f&,ûr·RrÅ:2yÞÊ7ùÉ­”©U’¹Ô:¶2ÊԪȡ‹S_F™Z5áƒóÐÊ(c«ì²;&?´ê”©U(鸌}uÊÔ*ÕzÌS_F™Zw†V¿Þr¯OG×û#äÑ}¨ÜjÑ7²e‹ ¿Åé·Ú+ò›ó§ …NZ™gBébÁ-.'ѱŸlÙE2Ÿ9áq GÚá"ÑÞ‹»³ä™’€J™l3!–[)€ªa¦b¹Å{*þR¨ùO” ²8Q*Uÿ‰ㆩêtÏ£ _æfÅÎ%ÛÚïYÃpÔÌ€›Y躩Ϡ1“Îõ"xÖ±±e`p0P ŸA¬wƤ’¹  /ËÂÐP4Ú‘°I™åD€ ðÉ ·¨%d)âuA §R,‚úÍìFV«V%h¨%Õhå1÷ª¢åè‰{¤¶ ¬*‚“„ér8åЗZ¸ p`ŒŠlg/I#$©Hož“aH#iˆcŒ!VW‡@Ž&Ô@^E@ô‰º9:j¡TÕÛˆ±ÙlšÆgBu‹y4ÍH׆JJR5d?¬ ÔQÂiÍæ|ÈðP z†8[‘A»N©ê£&xôt,DK«é±ÐSŸª‚‹ÀIÑh`ePVð?"¡³Õ#Ш"þ«Äü·…¡©à¼4R°Û>˜þV-Œ!нpj5+ ¨©šYà’úì[¥sT¢³À­P©ŒÝxèqµT¢N4LäáfAãGj|¯þ0z[D2p¡ÂU|¯‘‘ž½P|ïÍ—n†æÍ Òý¸/ž§„Ea݆‰r"½ÅŒxþbN«gȳË^ÉæóŠSxD‘©SQ.¶F¢ÅƦëN“6C«Ù²¡ÒuÕ=‚•^''I\ÝD“+)Ï€{Ï6rþ”oCt@÷¿çc¸[*ª¡î¿ë—³¤HæP™ñ çVÜ-ï´XH&uÔÙí Ò=rÇÉ4·b`žƒ„˜[Ïy‘,¶M`,÷p§Âíúeã5²w¤h_!‚^gJéÛON‰\·¿p.ÑÒfëÞæÔã&}os^lÿûÞ"Á¸Xß\Í@¤qssé ¯¾¹È@Ôis‘ImÜÜ,§2LA% ôe̶ %§Í-®gÛúæ ‡1ã%x<š¸¡7Bÿuw5ÕÆí-±çÉl{ Üîi{‹(ÒôÙ‹¨ÚŽÍ¹½šp˜öª”e㔕9jQ“•Ù}ã<‰À'C1Š4€µ(CÍHJÊÚ•ÛN+>9Oå>|M˜5C‚,@r."\ZÙQÙVKŸ¹!ã—9#¯5~X\¯Aø1\¢ìJÔcÑ" J@m@KAåÇ?€˜r¹üËS5Ç¿Â,¡¶Î¡(a,8ÊÈ¬Ô øŠµYÁÑ/îï.ýrx}óÍõÓîÿA˜‹MNƒßM“]¹L?¿o òìbü^*ÓôºbЗJàÞ³ôMl>†kÉW¬0~y*};oµR†Â0‘?"ÎS«NZEø ~,2[)c+Žem+el¥yű‘Æ6›õ +|¿¢¶ ‘ü6µ-G-e+HÈ/~ü%Ú/¨rÊãêéQ¥'‰ ¨âw+%$±û朵B¼tŠU ­RÔè×ÐÊ(S+ÑvÐÏC+£Œ­2<È:¶ê”©• !8iC+£L­ÆZejeëZ œx×J59Ï¢nUÈ„÷eÜAßX—xLú 4»îÍú7þÅŸþå—þ—aÜOÕ0ÃïSζž>Û`±ö͉árskA˜ ò8fO´U½pšŠéµR¨dÈô®à ‡V×V­Ëy#äˆÖ‚¤õ´oZeb77¡¢”'œ·ByÇZ4FŽç+ŒH¾ÅuZ nT>kæ/±—¼­úeæÃ¦Ò„îœÁk §7ÊeL¬|GÂ"åÞ .ê­íãU¶Î÷Um§®%P§VH“îm´¬»ôŽ>ñù«újÖáý!"¹ö„Äø².ÐôçvR¨Çjëú²À°äΆ›gŽÊáx¾Í.”^j´i%’TÊ[º Û˜VáNyÎÿ…%§5a‰2€uëDia……A 4†œœ‚_¯nÕ´êž Ä]V‘T/”¶¾z„sFŒ*йZÂP~€¤u`Ùñš9«ô‡‚«ÙBÊnp@玔 ƒû%w,@¼³Ü‹³"‰ a«ŽS”/î³×B­Õ[È»ªïí<½Ž€˜ ³üê"uÝ7XøjÚ+ÝÄO¯†é™ì–ãUÉugõ^Áww¬W$G•í¢§5Ð0‚f¯P¢cÍŸúf“AUˆr•¬¤ ð&0 À^R°˜ƒEÈä/ž\V¼ÀTw‘áqP4fø>m Y.[XŒÒ˜•Ê‘a_éßbë=J–P–—ÄdˆÞ*túª„PŽWº6–B•~Óô(‰qjF4D%2*ÃuD„¼P±ãÖ*CÿP¥…÷jeRXlßTY ãPˆCb±gŠ‘ ¼²,i©¯QEG@MCl¢ªüŽ”Ö$„´"æ¡Q”Ÿî‚Å ‰ÕpZǧññŠ] ¥ØÞ'Ö0% R+¡iÅ—2ñBȬALX†:²!ÃÉm XÅ–ì´–©'8Ž$Ö± .Â^"ó¾IªÁoDJ4/ ø&Ws¨}ÃÈ"Μ®ºÙ‘·x$3—¢›oc± jÎÔÓ áS#èï²}Þîþ2ø ŠºïAüU›rW"³{§éÁÖê6–·€’m­ReÏeaMœð,ñ«já]çìðøšži<€¡’ŸZì‚!'gÁŒ¦pLNR]ƒ…%yHe]h,ƒVx¦%œ)1P£„J̽F7¼ê™„˜÷ûîµf/²zV(¡ ¤«”/(„eÑ^"Ž Í.‹^µRËŒ) Hȸ^˼#¦þ Ç*qŒK59zP–„bð¿‡ðZc~K=ÅË⨊{alÄe¹j¼JLD‘«úa ¿‘°Cë1ØÄ7 ­t—yA0 ¼–hž°¤ÄÇÒàFêŽ.®Á©Ó­€PrTM¬e°œpq¼>:tÇ¥7@“µì0âe Ï"oG d'„~Õ轡 ŽmÜ¢`^ñÂPJãìÊvc,Ã[ʫٕ±ˆmjy…×ÅB+_jè”BÃhÖ…¿Ú½ˆb%¸Ñ¥Ä ÅÎRÄ“Gjvs³5¹l7ésw\aÁh`‰´†Z¬,³öX 4ŸÉ½ØÉ®¡Gä—¿¦`n£ï×M“aÜ=®83¶ÞÇ&Ò#°0J/¢ï·â#ÌA/©ä"ÆNFa4&1aDô«»IÚHô™5ëZªi›@(ÞT”PYª'‹c×Â4Yd¾#¢ò[‘V$<˜âˆí­J4Z*IɈŽKÜíØ7Ao2^hh`Hä^¡~ZŒÁê픉‚˜rš¾Šv%Í Î¤Løk0Ñ{ÕùÒO eá~÷ U¡ÐÙÔ< ׀߅ք2b‚KÅÜ2ÇøÊÜÛ)©ñÚo-XZ*¢ÖF½²àzÔ÷Ü|õõ%ôç™Ìá"ö˜cûž3‡wwd°´J ®¢¢¦S4ÿ§ÿý³Ãž†œõ³îã0Úåž»Šý¯&7"ªåL–ÅPf_´!\Ôÿ^ØÃd á͞Ћ¥r0³cÃØPðÀ8¶€| ›¬¿‘éŸ~,Ó9My[aÔ…¸ Khìö¯w&*§rY ­âXDùsGôU\àí², ýüÉn?ˆø•yÁ¿Û_p•i§iÁeOKÏÌÖmÁ‡ÿ´3(jÏ«8 {\ÞhŸ#*¸ò4è‡{f•ª©¿g}øÍÁ¹ß\¢ÝUÄÝqUˆ¾GSß}½#@âOµ±ëÉÞUˆðü¸åµe+D‹@°¡ág8 x¹TŽBãøµžÉS2m{øõÞVÁÔ¤¶òbÙãlSÁXÅòCÜþÈ€2‡Ÿô#”‡5ŠP Z¹"¿³ô+„cÜ"0ï `Á¿$Pð…É"¢m‰s½ÜÛÛbgÁ¦jêŽ{÷z¶ÑÛc€€zXYñ®`; q¾¥å´YÝ»™ÌÌòy2?±]ɛӟޓÉó¤ÅÏÐÛv'&Ëœ!ãÈO‰„íÜÀ@>âæ¯­àÛ½ã)µõͺ"OhÎnî&]ýÍð§Ç n®o1C@‚pøƒÚ›Å…—а¢~ }ìéÏö¦o¾š}ÔQÙVÐÁÔ£›æ1¬,/ˆJk‡?ŸÚÜl–#,É X}4þb%/È•F…}¡]JäØ>FéæÒÇÃ_âŠL%d,x¸™ŽÇSzg²Ô/‡6kOhŽ•â•‰Ã½`iå@oa‹¶‹¿QÀÀ®åEü%u§aWD‘‚+®`0„ÍÆ=öÉ´ú"fÿÃ¥"„°ñ n¸Ä['²B"‹+#²‡›§óSªssÏ£Þ±ýãÍ9œ² /Cèz^_Ô›zÇÜwz¶5o1Œ¶= (zC“Ê熋x//À¶i"EKóî¶VdÁ+LÓn÷,ôž,/I:EB¤ (DÛ¯lUqZ¾_ððørK¹©"9ü×}›ëuUcÃßöFÇå{X»—™¾be¼9ÿ"Óe†cÃßíae”Ž·Üޞ銕w'à·p†]­ágW¸ $ÒûÑåN÷úelHÜà7z¿³Þó²M>ë>éKµW8ÖðMµï±#P]Ø›ù®Ù3ù ·?}™q„H Ès>r»ˆÕÔ€™ª&EË?ÝÙ1\SŒKžö»ý݆å8íØŸï{iřϊQWîÏ‹Q o)F›]|VŒù»»\i©/º\gæ— áзq¹š‹o¹ ›só–H]j\ÎP亲7CõÓÒ:VImì»j^lZ=5¿õÔPãs{O ê$wOé-Å·¾°œÿ°+m¨Ä…÷nÒßµÊ_¯:}ǃ¿[>'O5üÈSýNž_ŸÅ[8%Á×—Å)й~£ç‡K­+¿Ï`'¯¢V]Ÿ„•.PuÄ÷w€(ú§wÂ(Yãå?ôOãá»ï Ys8³sý;l@¸–áßA<äp¼•t(àØ‘Žíq6iïy rM>D܇„¹Æn¥ Bü[y·AŠ)-Zo\š¶‘â„öëû§›íÌt£6!Ïkº$WúX SôïÜÏâuœÊ0#À½ô/–Y{—¦LÊõÃõÝä§=Í^¾NHgn{ óTÞíƒÇiü³„Í:›ÇËý@ˆœÏÚ•Ý.6t¨,pk˜å£Ë+-²hºq¯O¨­‘°?ÝÓ8(U-[s0‹'`ÿ7j8>"þdG¶vÃ8»`IÅ«º9Œóc•à¤õŠ‚ŽaàçŒh)޹‹·1¢Óä~v©®+ËŸm¨üñþSÓÐ^{ôoæñºUo •ußånÛ‰…‡†ÿ>†&£ntBæ~;£fܲokð:44ê²ê›æÓáÓ­™Q-áwÝtTÁ#5kþìEÓ¤«ØŸÒVošÌ’t*89ák$¦—Ú/¥ŸÞ÷K_:T„ËÞã}æÿeIÿÙK‡©GDdè.ž–Ÿ?™÷ ÜHƒ"µM¸¿ël:u(½ˆ)g81¤ Ãn¯þuÂk$é»ol´Xö·];Ö¨£6KY„Qc‡1Oiî[ħÌÊ>­¶sÈÂå6Z&ñÂFïø+‡7z¦ô~þªZÿϾ×à×ì9hÏgkzÃ÷ 3t~[õÑ¿XjdÄA¨XÅ ¸oîìäî;eNuÒà”ù=­ÀB(ýüOv>ì ¯9g£ï#—8Á“ó¤Í"è9›r,KïüŸvVƒÄ AKÝwSÅ&vtQM÷€Ô¹$kÊí™ t*Êæ'ugï]ƒ[çè<¬óë0+sßîqÙ\]±eüÕ®Åý×Ü4èÛ€†?ÛžâÎþ8Oü4³tœõw…Irûüõoô¹ *MÝvý–z#»bå×£f¸Äݨ%—!Íž_4/¥ò5þqÌKÐRX1Ô¨t,ó¢ÿœ_®c‡=â«(Êõú_÷sl˜2Û®¸…Ãõã Æž˜FŸÅ½6ö‡š7õO½‹óÒ  ÇõÃW7›;3EÉézff,ƒ¸y|z¸ùí@˜†¾aqJ¤C(ÚlÏcÅý¨Õeìêyâf`iÏ&Ä7ÙËñ8åÄw_óŸ®-÷L›æŸ¦èްü”.8Ïaà ¾øLæcùR ¡¾h›!>¯ºgGö ´Î~YÏL…—NÛÍ{±ðÅ'g®{>mÞ¯o€ä?ÊÖ„íÖÜ<=Nó»ýÒ&(¬›æ×wĕõùÙzõ´m`îþ¶ Öp_P›óÆmqqØ–ˆé=³-L¯Mèñt2vjgœÍü fC/<úô‹§* þ¨;s^nˆV9ιڽ²Äìô_GgY¢à„0õüz’ƒëëß'ƒ¬·}.šÆÎQº—íÆ?Å.'I¤± /Zëë>Ôi¤¼¿9è=¹aro•FŸ|í¿Õ·„°ï®ž;9?Ÿ¤ùdдi0ruâðÍ$Áã¸p{»|r§dïý˜>¼Ù™ôËÁ»rˆn#I¾ànší¾ñVŠ«¢€<Ë‹qsëij÷Ú†¥wÚo·t§`xrEßÏJ{ý÷Þ£à%®…Vº½‡‘Ƭý©ã­Â ´ø_}e¾Æ”•.¾á°ˆ¥ñ¸l¼1ÖŠßFswh’t7ý6$ÿmÓÍ Ô‘4®‡ßž,…⽇8kªûUú¿ß½SHAo!Æ2W4þæð‹ÜÕø‡~eÒ³Ex1ôz–'ÕÕ]œêéÜÝìüB¿\‹Œô³äϪͷ¢¬o«„gK}¦=y´öM·JÏWqi}<8_=Ü?Í&@µWàíæi>tÍUæPÄóKYöáïýOC»ÎA  ±!~÷óV¸•ÓkwK®q©,.SÉ5nÀºtðu¿âܜʲvJZDˆB2¡ÖâÞ‡¹¼éÑJgôáÇ´ f}úlšnõ-JÞžÕŽÆ«•¤©´Ô÷(´f«+6¤^ZNð[ îyAŠ·g5p›3‚;¨+ç?D¥WR#õ$¬;üðí®ïµwŸ"à9ÃŽä¾þâöÛßþâÿè_ cþâ™%‰ÈkMÊÍyâ)lúu„áãÝäv°Æü··/è㉊¼÷ç5‘†~,{º¾¹5yÏ›¸¦Þ‘FœŽVáNZyÕðY/ürRO3Žý 'ƒšö>;R½hNlBdV,ª§ôñ}‡a£üžÆ¥¾sôÿ°QHx•7&Þaã=ôzY»Nýzaâûjñ¦bËc—¨„ëSÁáõíÿïÝ\Ú"QE97„î¹›p8)¸ûZ‹âêNý£z±G@(ô]Î]ÃùñðŸ÷ÄâTÒHä?›‘{ýz“åVêÎÜYïØ€Á]ÚxN“:s'#nñ0¢ˆA»‰£hâ±/Ëï\jkZ¨üÝ„iÍUóyßU»½9/Â5Ýv=ôùIƒd‰‘¸F­¨ o_[^C4àÄ5¹î©&´™‘ÖœºíäÕ‘ã>o0X‡`ßßÜm‘Ûñÿ®5Pé¹¼*H#µr–¯;­ùP4¸SÙìóZéÁ˜ ½s¼ŠvÏ\mƒ~LU…s±ï9¬g¡¾Á±„‹qBÚAžd ‡7¿‰¨pxœáª†%åP|=kìþ*ÉÜõ­$ÛeºIaLGûöµ…rüF­Ü^?ÜŒ ÿ¡i&NÎ…¶ìËf‘1CÏòIë¾Eïoåü~\ÇööÁê¾õHÖ\Ë1m×c¯ènS0ñö~ [=“W|è%ÒEûÒ½±¨<Èé‚ÛÕâÿIׇ2endstream endobj 487 0 obj << /Filter /FlateDecode /Length 6983 >> stream xœ½\K“$·qÖyBûà“}èÐÅ56»\x`±Z-EI|‰; *¼ôa8ûjrz›ìir¹úõþ¾PTw—Cd]@%‰D¾šoWC¯VÿÍ¿7Û‹aõââÛ %½«üs³]ýîêâ¿>µ=}¢Z]=¿HCÔ*¨ÕèÆ>·ºÚ^tz¸¼ú À£n€½îc°põôâI·ÝüpØ]®uèåc·»½»\h»ç—C?83ª/ö¹?ŒÝ‡óÝå8ݬíö—ª†qÝ3Ù~@ç‡Ö§¢g8¸ ‚fû¿«?]<ººø uXòÖ¬õ0ôf\9¬Ô]°du¯õjÿlõùêÕ…éµ²z\½þ„ÿ¾Ëþp¡£2}ð+ï´ê­^mëž±ÇÚ±Ú²N´µë­™Ú7aTnΠfž‚]`ÙT Ô®æC샫P§6ÁËä¢W0´äß\<¾Ðfp½Ž+ç­êGË%Í=Ø´Á[p ÷F±í‰¥´1¯ÑàW€½a3‚©-SÈ€Üc\oüjB` £c5Cjs@¡¡@ ‚v\™ÑãØCÇA…^{¬lîѶ÷n*L?ŒlGö£{«¦ö FP:fá‰aF0µÓ0÷¨>êÕ„`ð½Õ ©Í b¢:#hW!+DÇ­üTŠ+›z¼éA×B¯›¡÷íh{§§6¦ ¤SÍÓqB05Ó 2 ô ”Ôu½³Õ©}s1Q &ª†Å*D]D¦`—•U=„¡éz&{@·†ÚN ȉ‹¡7a~í,gœFÏÍ!MYz\ŒF0#ÀO Ñ‚¿4ˆ?M?¿NÔÍÃ[úeMÑù^ƒ&Çï¶ê1†ØtôªwŠíôÖ¢§¹MÍm¯m1F™gÂPÚiQz°OÔý‚¶`TÕ©Í…Š1Ñ1´ëµ”^…õ[“÷kîÁü ”R€y]tVvDä$LmÌ+’4Δ4åg sÛäM›zŒïáf °Ü•iŽÔ¾¹˜©(…ÊŒa±Žl?,× €5ÒÉ~äpVí(V)bWŒh·ãî”¶ØMÃ6Ä1‰KAPÚi Pz H4IöD»j†Ôæ€BC˜¨ÎÚU¤• 6mû0ÊÊJd@°ÀSàmŸ°À³x;µ9/¼ Ý ÎjUa(í4G”¸GËV0€ç¦šBš„/4ä÷…Ä2¼]Drfv¤èBb ·u[õ(QHmŒ›â/ÐŒü-mz 7Ä8ˆžLJ;MÁ¹Gaë Ý]Æ °uÊÍsä6G$"&€Lã„ ]…l™E´`9 ¶ÛpǦZ$pk0ˆ8rÃXËPijƒfN†p¨*¥-3È€Ò!vzF˲æ)R›#2 `¢9#hÖ Ë‚¢"xq´s°G¿BÛSu°Í™e0m´S³1öÊÌj° C& S;Ís¦U˜1À²Á Ìs¤6ç(Tˆ‰îŒ¡]GÖ2ÕØœ1Ò÷lçŽ0ènÐ)i¶E’!ðš.µ´E"U`†@Üø|ÆÛi ÑÊÒ!Ò:!@,Ø}ž"·9"1ALTg Í*daì³³jo«ž¬üà`ïâlŒjŒã$­{£+0Ö¹ CiOæcêÉú?aHæaš¢˜‰†ü¾X†·‹ó—\3l©EÛª¶j€Ÿ€ö7"âPÍ€B‹ò”6 HÄ0VÐ îÀ„¡´UŪ,h5#$,𧯳" ÄDvBЮ"Fæð˜ã(È·uO Щ͎žfFȈ#ÊmZ-øcÄ83„sÕðÔÐIpsÓ åó@?ô®Â,M—©óûBYÞÒ.ë Ð3jìÏ=ÀêÀ]÷S|‹v¤iš`8R/¹Ò@Áçñ¥Y‚ÓªGÂ×A o§Jü;“P&š3‚v )V„é—HF b3ªÏ4A˜dJQ /ÐŒÄ]ÚÅ9êñ 1ª, ÁÔÎÜŸ: J‚Ï„ Æï4EnsD¢a($ÍÄb(†_’ 9”š{FF!€¶’ h‰”Lr˜šÙN©¹–L1ŸÌí¡„R¥ÇˆMœ1h±‰Ó©I·Ph(…ÆŒ`±Š´2”èó£ ßV=HohhCLÇöÈ_C{¤¦&§eœ*ÆÁc… ´ÓQzo«žÄT="íˆTeزK˜ä6ó$ë)Y3„K¶wÂPÚiŽÈ=#¬é*Æ(uiŽÜæˆLÅ‘©œ0´ëHj†Qq ÕHÅcîaÌ Ý´ŒÀM3gå ÒÔ톗q3„F %„%sS¥ªÖ܃˜*rŠ‚î[9O‘Úœ¢Q C» Y½´ª=sÕ#®ÕDm¨<Å(Ïl˜Å*]AXÁ?c˜ÚÙKÌ=ÉÇÎÄÏSd=ÓßËðvÉ~À¯@dœ³¢ÛªlÒ,mQæñ#;ÍRã†Ü¦n‡ˆDiˆŽsFPÚi 1¹ÇP-¦ñLVAåž*SQAUt½%ÃȬ5¹Æ”Ú‹-E„@8æÀ˜¢8†Ä< ;c§\~¶äã1ÃÎJÝK—[±^dµo7ÒöCÉ –lðrj‡ˆ×¯þðÑ'«ëWOW¶›»»ÍîÕÝê÷ׇëtœ—Ö8ãÞy¬t8<\=½èþ°ßÝÝ­>º>`ìõíê“ýîéw7ŽŸX¢àÉ=Ï `=áï„#/i³ub÷±¬<ÍÃŽéÒé¡â³ ˜b‹@œ³é“„!pˆÖ™U ¹úæÙ~õðú›MZŒ0ö/oâ÷cº¿b‘Ò5,LÜ(uôé`ôáƒ8ûÚ˱åjM‹î9 ~øè¯|‡0ÂY°GÑÇÀfñÕgðb)e Äëw¬‘Ë9êŸ.aÜ¢×݃O„sk¥p K ¾t4ôÞv*0ÀF¦«Pg-P&¨ÏgLà kÏH!Áuý/iaˆîaµ±°¦AÉ«_¥åõ‰H{Û‡!Ýï} ï!øŽ+¸¨àbZúCA©Ù˃³µÎW¿ÿèÏ2 Qa°„5äHyïÂNˆÆ@)Y#¦×e¾÷>}⬸Á®Ÿq>ú,‘aGS®¾x8—$ÀŸ>”—’éà&<ħöÇ+Y:¸aÁLÅ„D§¼ÿñ™aC tш@LõöJ†•š›P½ü$ d½ÑAüÖ°²F—W2Š=H¥›Þs-›š1^}&sA<Ó-ÀpŸý¹ð8’Ǭ<šQ%IûôÒEÈ&Mü‰÷ ,¢#.]ÌÇ{›ßU'ýûg—k m|ÿ6uàñǃÜ%¨¯ÐÄ¥Êu»WȺîÍYnFÓ½jÆÀÄÕíÛ§ºojbxaä”íu„šà›új¡â»/:ØãËùÕ—e‡9ÖÚ÷ÑÛÞlØÏô×5Q›´`rÂv×õ2žæ~ßb½;l¶×‡¦«@:·˜hÿeZ±5ªb¦oV¿Ù]ʨ»6çniP>”åW\€?¾üw^+¡µã "¡Ø— Q1(Ù/´Âcºèna|"5†òQf޳wÙýU„Ý%ÀŒ°ž–{1f_PÙÂÔŸ9oƒŽÂùžn*¦t÷Ñî0Ý\QÝáe#_Ý`ºzøþ?OtÞ¶ ÑŠŸ»Bó¸ê½9ü­Þ¹VŽnó4ÊŽºL¾…нSйF#v‡<=ôîa½”M£'}r.Á‘ `ãXѶÙ2¼Ø|IÖÆŠšÑzj^â>tòK‘ø£îM`§k#ÿ7F/fÝf#öë|!©–8Z?²Éâ¾èT*(tñerk©;œÀƒMAn­2Ä*ˆÔ1˜xãz7Ñ»ì6¾ÊÍ=)ƒGÐ1çŸtï^®YÀA“Ì´l„¦Õ0ØeÉøëåHnú:e+Þ°¨iµ)E»ÑH¥ôÜáF]-g r‘Y‡-‰t%rþ'-ª¥n¤7Eœÿíàþ“Óùü7¹H‡ýËîÊOß“–|ïÂçU[Rsx@ÂìuÅW)™"s}¾¶›_ ˜‘à8‘Þ‘±eÍNðÞ9QóõW'øá‘ Ñê%~¨S‹,²Ù£j™ŒhµVË41üÏÃCލßN| äø¤Ä?">Aÿ¨ô¨è~–ô<í¢uóšf’:/B˜'3¨r[ré£ã '²Xž² /a k˜qf@`Z¶($ð_Oʆ×)Š6ˆ=É6¤‘ ¿-ÛΙBÒ8B_Þ²²7dS8$ÒÞÍ€~%iOJEy9„ŸØ#MIü{‰Õ1Õ8š@ì>¤ÿ³›+™º—[†‰ õN.™¼µ°©Ë…‚ŠîPSß i!γ> øÿ»$–@11>óó$ãä3G¨_èZd†sb¡Œ¼¢ ™¿:£-x<öcÚ#g\™È;Éú¸˜ Ú©çgXˆ½ß {—j3Åú´…8¯Qœ—‡ñˆ(¨–§µæçÞÍd8\½ÙÌËjTö’ÉkÈ)êOU£f!Ô"&i¼}¡@Á›§Â–¶BÈë‘[Z.§@>8¹1”-¿ ç&ðrMDÈÜn-ÞFý%xpŠGe]­ô¶„ ‡0}ýÑäš×ËDdƒfBÌ=x:ɵ¥ßŽXÎõÍ"q•WüŽäy^5Á^¶……cºíõa¿ùád¥XØ4¾]­=®iµO:fó‘™Y`6¿9I—³'r{©¶jÀµbˆÝ·éÛ¯Îå% ¬ÅäœOÌfúZÇ­ö?õ+7xxu˜Wà 1ýídŽúg?NñNJhà wJXMõrjà ¬ŒÝ5Yq7ÝkÉça©ÚjÊæÅKyóÒžL€:ßÝ6C®ïùU Ý]æ&LÔŽïÉfŨ…­DS”XúóWe© ½áL1LÞZÊÜ´·§*Zócñ5¿>ÞIäÐT±¾:­GnÄÛ*Ö2;ØÕß~×H`/É"Ì/#_&"ƒR\el–/÷wÈ—äŽq…ïIµ)zò&yWšÖvª#}Y-ûöxï)-'L…Ó™îûK^ä´‡m6/½ {×FË]*Æ»²M+œ…ˆe=§›‚ð]#×OKñK±”–jo^MÒš¬}*«)ärã}pqõOº··;a,V÷º©Ã½"D[%º¹,ÅÛ—aˆ Ú‚æn›+ †m÷êØÙ'°W¢¿šuȈø¸›çmLbªcW¿¿d]›µÊgi˜XƒÃ]çº@ðì5Ùð?ÚE½z¿—¢§ JçÞfç²ó2Rң매ä|Í !ÄЄMÇ@K <²áGl:ÄóšÎ[瞟ŸÐGÇZ-D¾–™Û™Ec’²ÜêcÙ&ŒuÝíæëÄt;.>ŽÜÔ#ªó‹ô¯¥D&³lÜeCk­«O2Ÿ§5ñ"TÓó’Õk‡Þ)KCV±©ÅíE¶jQˆf·|l WÿÃf»ù[-–­œ°–½íï6÷‰-Åàí KAàgnú姦§¸µäfOhÞÌöéËæ´Gæôí‰Êž¥óÅê^eFdµV™¶ÿoÕsÝ¿9$·j*6Ï Bß5‡#M-Û’¡ Ý0?Ë“Á¤¡àie;AôÜÚ'Ùh—c!øèbçN¤¢]hÈ‹&ãèÒ¡N‚õªèO¦}}dr_"–íÿ¦ ÑîŠÄ¤xáE†*·ßÕjа&Íoy˜&åÀFž•ï¶»}yã|uô´Û$¶!ýì¨ù‚3.¢›ò:ü`5âÃíAu0È`ðg)܉ õvT€aKžW'–i%Ü™x7Ç{ÜÅ›Ú?þ'Ãk-1x‰45ï]€×âé/ðâL¬ù4ƒÃ£È7éDƒò…<;тԟÔàžC³ÓÖÙঔðç0B·×û‚Ú5'Ä/ôbRßY¸vÛó¯^e¼Øáyåe­Æ-ÌÑíúëÖX s°ÄׯòXh÷¦à4ÇOX2š{Ldz4x|æ¿<›Ÿ‰YÏÊL»ŸÄ ‡ÓVˆ­×õÎïöÛkù;âäßovþSÂɵ^Ÿe5É2¢cÇ^Ží)ËFéôî”e›¶©ÄžE™$!12Gµ¢UáWKc'®2=E«¢ã[ÈÂ.\—.åÌž?ÍCM’ïÄŽîËú[ú`ßšCzĨgþÇ@p~‘ìÁòÓ+^–g(S°ÿa3ã94ՋБÕy}G–­ÉË$bá}¦É{0Ðø$íQXœ8/eˆ8òd[ÃP/÷§®“ º‘_2½-9 ¬Æ(EÓ½ŸnFÐ,±VÙ1Jí ¾~ð¯ùT_24Úö.JëÖŽ«²HHA#GVJðJu&U2”d‚ößO!y5 Ñ$Z&A¯–ÑÌLÁ"!`b¾ßˆárÂØF/ÏÏZ–&Û=¡“sÓ2ª#­…yÁ;GÎlŽã°8¿[]™~´fªwUíñüµ“EÂÑŠËÚòb¢ a}^YÃï*3Y[ÉÆŽo±x%F¤Ž};䢛öÖÊ-ƒ#Wu3ïn{Þì?Î4f dcƒÄ*ßõa¡Çb»ý¦A±È 9qLYÐázÈD Œ—âš RU6RLld]¹Ý6¯³ËÖ%¶Öew·ˆUrgͺÞ_·º-YíOù¹\[0#–^ïe±2?I :ï½^e (Ëæž• œñmþÞ4šø†ÈKø22|1°I<ÅmÆ4„ÅU/úÖ˜î£I¦%©BfRkßV(J•YRiã±åD|oe¿è§˜M¤c‘ØgS´;£›kGqw2‘n Äw•Üwk­¾Ð,ðo›(©XÊF,sǶÂXÞÁcž³5yx ÿ^ª…Ù§ÜD  »*Œ>Š”›–MÜÑJņ×IÕV>còõ&CT3Y^/Äô¨êÄñ.&Ý\ ˜6RrUAj;_–<îM§GS2ÉÓ›m­@‡T;—×þ¤­2Š7 {’Öù\V¶øžeæ»òlÎR2‘ÆÞDª”ÆÌŒ5 IØ·v馶‡Bôñ}KAæipOÞã¨RÝî_䌵))ùÞxË#8V„½1÷•Žá{y¼;>ɱ¤” ëäònsÈ 8cëfÏß™/6%˦¼œœ‡\X\œú*Z廉¯[ëߤÍån¡êŠôf9“+’á”K¸Ë7 ù1PÐ`k£*——®g”ÖÑ…ù¶Np›–ÓŒ|¦4Ö|ç§šf:=Ý?{`àч§vˆß~Ï1æQ¶t½ÌË•H©p)ê8‘‘~$2 ÿkå¶ðI÷›Ç úè:© ¤w‰±ü@Sr¦<“áïÜ&êÚ;¤'ã­Aw”ÛðG…º!ýt‹úô)ÃMôÓ ˆý—Ûg”˜´jÞÕ½÷àƒÇ§7…'v¾Fñű½ã¢j7"U¯$@´üàª:ëž.éŸÐõÅ¢Ö–÷j)Ðd”Kû¶•­НÌÙÜí›å1‰uÄޟ§ꩫ>mIwÿïÊ<.)2Ÿc> stream xœÅ}Ï“d7rž}mû 9Â'ËuqÄkÇv¿'†^™^jMJ»Ü‰mRŠ(ÎÌÎÔ²{š¬.rHÿí>8¿Ìðªªg†=Z‡bÅFø•™_fxóýÆlíÆàÿô¿Ïï®ÌæÕÕ÷W–©ýÏó»Í¯Ÿ]ý—/C!Êv6³Ý<ûã•4±›b79æíìãæÙÝÕäÜõ³?Qåì†ÊÉmç¨Á³W_MwûŸŽ÷×7®lMótûp}ã=U™ÃôÇk³5Ñgk臃ÒKž¾ 6?\ßϘKÓáÚnɦL/Q)l ¿è¸¾è½DC‹-©LÔÛ?=ûíÕ§Ï®~O4åÌÙz»uv£OÛl76Û°õ4‹0—­ó›ÃËÍ?nÞ\åm4ÞÆÍ[Z€ßÒÿþDKöj<‡mš©ñì¶vÞÜ]Yý6¤MšsÞÒbÜ^Ùhé·JÙÎLIÙlË Ê¼õ”âæmJB L™KÙúÒQœ ykæžâMÜ–¾• )lcî)Éù­ZåⶦoõZ﯊'f´m‘qëÓÆÙD‹nÛu!ü6GK]¬B§]Wñ®u\)èæ´ÖB1f+c©«ÓUj”¥’.OW©QZ¥º>Ý e©´g?òVé1õ°6m ¤ƒ¥ÓËò»‰xÐj“Ž|59’XKrÃøÏ´%ÉO µ@ŒçyëÒdÍ"­MFÓl·¤Žw’âl¨¶¬Éi-3Ç­k„¾R²4°’—J•0TRîK¥®»÷\¬ÅåjÄ ”·ÎY‘K‹L“´ÙSÑp1GèàtƒOWᢦ>:ª¸™ÉpxÁj—H³[C[Îcú‡o^’šÉ,åà§_¾Øü·Ýq·ùüþÕÍçûo_Þî_ßß¿àqÉl;¾‘–'$̘¤1ƒ#ìÞ߉!™EcŸvÇýýnÝ–†Õd2IQ†¡Ý];´Kiêûåõ€Òzã=ŒË/RZŸÈ¸Ø‰~(´¤© J{Zk¡4 †v5÷ª¶P–J~t®¯Ô(K¥ÕúA=E}¢…Z+$)aˆ/Ûd''Ï[›'ßÑC'‚JÄzs*°Zw•@ V¶6ÈzÔqan”®R"pJ,•*¥¯ åfßWRJ_IGÐUêÆô¡ºê] Í4dÒÙ¢iMRv¤jºndLžlä¿¡ÜXÓµúˆÚJ[Bk“Fuýâþá¸ùÝõÄ”0ݳû†•Í?ݾÜüíýÝw÷o^¾9n¾xy÷ ‘Ö®Ý}x½ÿî¼§´-®ŒZ<ýîðòÅþù‘|“gêVÊÌÛbÈTBZmøB_¾| ^¢â¢©ïZŽKŠJF9’«æIMÌ6¸Í—¿!Úb“i!ëH¥ÞüP‚Û’ãEeê5R–inåçÔúÙU ý(]{-J¨®„”·)lZëd ·:öRFý:€Z£°2§ðœ- þŒq3½ë)ô_GJLr6cµ¡TÎÆÁìÕòó+¢ÌÛœ»$+%/–2÷•bývN›…ƒÉèkéCÊÔ¢Bk´Q*‡Õ·Öw¡°UÜGbGÚÃ"îe×_Ëè—¬¥Õ€íÉ ‡V–>ТRhî #­ÈOŽ®ëCÊÔ¢Bk´Q*‡ÕûmÊ]óZ¶žk×"ùÞqÞ´Ö–Ý0/쵌Ú«QÇW9tÃ罊¤¢ÌѨ9l„Œý¤b&Ïû@6v›[‘1’ËomWâ1ö’+ƒV6j…t‚ÆÔ8À©¾u¡E4Ð1´ :ÄÚ~˜ÏʇRç$trSˆ‡¥…’½ï9óK™zµ´ØÅu5h3Jî8´2÷•Bºáòfá@ºC´ô!e´¨£¨5ê(+‡qª]°øæY´K)>ÃȰܒ'KàhŒäT…â+.,¹¡¥ëCÊϯ–QÔmÜÂa51‰äϱ·Rõ¾ôfƒ<ÄÞlrtûÁ¤Áð´r3¢Jß8T³QûhfÃ?×ñU«3΀mF&03juyÇJää•©vF¹`?|&Ž®•µÁÂþ.5Bÿ…C-KÜB)´§ÞoˆKׇ”Ñ¢Ž¢Ö¨£¬Æyˆ=Œº‹´ŒELb¥=&½¡²ÊÙ8p I%EÊj´Bêjd•µÊ¡–¥n!”LfŽd©qÈ´Yä¶>´Œ:ŠVCGÙ8Œóà¹Í´BìŒT_q¡ˆ¯G¾»wF\A*qxª¯Hž~—¨Ö §Ž]¦Ê¡–«3·PÄÝ[8ˆ;¸ôQÆeµFeå0΃5ÍP¸–ekMá S ´·P"’/ÃFÖ¼#ƒ eRC®M²]Äîù¡–¥ n¡¤ìÊfá@Kׇ”Ñ¢Ž¢ÖÐAVÃ$Ä:R4oHÿ écߣRh5,¬#­+{5–SËl¸f¶­ÆœØMh jYº`G¢Rœš:åCGëCÊh¡ƒ¨Ú¨•Á8 Ñ4òIcèf¶Pd`>Xù:phÕLè¦æÉl³1k5(”ˆ±ãP˵ߎÂ#[8ÈÈ—>êÔ–QÔmÜÊaœ‡„/™dž”±xæÝB˜-p‘Šä‰¡˜YyS‰[ߊV8Θ´ Ûµ¯eé€[(…| À£rÈdƒìÒ…Ñ@‡P×ÖæÃ$lÁJYÁTvï iH!ÝG `×"rôT&4¦À«–VUò®«AV,øŽC-KÜ¢RØZ8Ð>‘õ_ú2ZÔQÔmÜÊaœ‡j‡5K¦f¡`“-¢2qÅ‚X8å$ï´0±•Ÿ‹ÓâbWƒÜŸ:µ,]¨C! m[8PÌ5§®)£…¢Vh£Vã,xf¤(rZðl¡…[=7´ |;< sIlµZ ’­;µ\±¦QE«ÖGó6ŠVCGÙ8Œó›OfF‡DßD¶ùB°`MÉ&Áu± …d|Ìs-ÃGdT»1‰ç® ´¨pƒJ!KÏ5„)e¤ -£…¢Õ¨cVÃXÏÒ’k—¼+œV¬EbDÒëÁEò~H<„¹Iú=%ß~§rP[·¢8HK‘½Ë¥1m,À¼q—2Ø×îk6XåÐ þy—“4ƒŒ»«ˆ%*pºHH)T—Ä¥ö£¡CAa3liÁ=Î+È0¥p J0¼Û°%B¨ÛÂ1…ü(ËñGD  JáÈ„(¾QhDb>õà#8¤°,Yˆ,$§™è õ÷.’ŠFC}‚B‹0òC¥N2œ¸#JåCŽ5/˜ul¯A!ŽBáè šÆZl2‡{,ÚQ’ódßI @ðè„Y"cȶt•­ /;y¿Èh¢È1(ðƒ±´"¤­ EAjÎRtÄ |‚Q‚h:K0ïS1šñ¢þgfRœæÈfVPàà9Ph´L ƒé¹d§S‘b4™¸ÕlÄé ;Ê;9“?Ïe6 ÐÚÔ”’Ëî*™^†™\X'”Â2Q,œŠ[Rbc5eÊ›…’9/Š÷,†4 K0‹c›UÒÉAŒ,†Ïø˜R8/È­ƒ<ç[RWDÁž²ƒlЛŠ.ÃŒ-a["ÀTÉ,…}MÇ0¦8$ãÎæï"’ZG][P„"SæÐ!Q’ÄŠxL =ä1Eùä1EzWÈë(y]#Á¼Ž¯bSdÄŠy<>ÅEÁ<¦h+Á<žùÜcSÌãK¦˜Ç«\æó˜" £˜Ç»¥'˜·lqÅ<ŒÒc Oê1Ìw˜WOnÌcɬRÌcy×:‚y¬,ïóøD(•óXÛX·*æ±BšÒa^Uã󢚊ó8½#Å<¢dm¥˜G”ÊY1(N{WÌ# ãó"öùâ–bözÁ<¢p¿`Q¬6RÌ‹84=è%‰Ã\A(T×u G[ëèE¶¤®C=¢$$6Ô#Jµ— {D±j‰÷"NÅ+ð…ÍÝ‚}v\¬¬bQŒ¶ì‹ŽWê°(Q@I¡/Bçb}±n”ú"ÄôÐG”€@}Á>¢ ÚZÐ/ðü%â¿ üÅwØÇ9×AYÔ¬š§ÐÇiAa…>¢¨ ¬Ð‹¯î”@_äÛ|¡ƒ>¢8Ur…¾šY bý¬Î“Ês„Q™Uè#Š¢H…>\¯D†`>¢Dѳ?\!¼J2âÿß[¾¿€ƒsê'EÊ™O¶ŠDþ8Jw(V=Bföüj16™vÛU€TÇŽA+[¹°P Tãà–´Œ:†V£Ž±2g!ùMBܸ+¡â¼HÜòˆ´ H÷$2~‰3‘œüÕ"¢sZfk» šNn jYzàC¥µòfá@—òÒ…9ªc¨tˆµý0=äœ Õ+£w…ä¸àD+Éê!Ä'êè×2ÚKÚ¡Õ @H-J|@¥‡}iŽ;©ë@ÊhP‡Pk´A+‡q’L %8œ<±…R8£‡t>Û)ÁT£œØ;¬e>àcœ¥†ºÓC+shQ)°®vÓ8àþRzµ-s JFÑjÔQVã<$½iù’XJ‘ãλŽB¦lÆ‘*‰<œkä} ÎH# Ò2rbF–€ÔÐq¨eéãùUG1|ÀÜ83¾ëCÊhQGQk´q+‡q’`šƒ\ö­÷®; G\' ÀDà›pg€”©F-kŠøÕjaósÇ¡•¹´¨”ÂG‡ðŠuUûÐ2çÚdµF¥rXÍ£KžÅH˜ï?ÖäYÔ1luÍÚ>  uª©2 (RQ¿£Ùh¶¢™ €Á­9JXÚâ‰LžŽ·}<‘ið¥Ïñ)¹FO ß.®x'Jœe-ž(ÅŽ¹3r2œ\‚\â ÜH,c<Åm\â ‚¾8„äŠÙ!ufÈkRg€]N$¨{-u†lŠäžjö ®«ï¢ Ž+çÔEœX”äcËž‘Ÿã}MîÔün¸ä!æ’Ã?saÖÜ^M ¹\“¡5†; 2Ör·±‹&’ljÉL$3yÛ‰F%bK $jÜYh89+}0A©Sh ´4ÚhiÛŒ¡ÉwÁDŠÞKÜh±_-áéÇ.˜HP^Þà–@K4=Îç¶Z¢H¡”%˜HPM—i 7ølKýÓ‹ï-–!u®‹%œ>q{kþL·¾ËŸeé§&ÏØ™ê∄“-¾#Ürg¥êsË•’kŒ ¹³£ ]‘f]숄ˆŽ³-u†*â·kêl–ƒ€%ŒÈ¸À(iM #²½é¢ˆŒãpñÈ5ŠÈH‚É‚k‘‘α¾‹"²¥ÍåB"²­qj"²å[~K‘1*5D#îDðk‘]PϳÙá²bŸ@Ë®f—k‘½­  "2 c "2® c"2.ÉÈæj‘ßáZ¢ˆ ¬Ù/‰"2œ3ÓgÐ2UÖ¥Ð0"‡Yµ¬†™—$taDækı‹$2aȘEËTîB‰ wAâM %2æ+Q³†9….ŽÈþЧÐr’ûaK‘3Ydõÿ%ŽÈ˜‰,Ƨ•=i‘qÊ,šªqDÆ)Ÿ„±GäBö6Õ{îŠxj£vx|Õ®<ê^ì¾ùIðØ;ÀKÅ­2h™´KÒH ñ\¾ ðà‘Øð²\ÙéAÑ €g³$À#\lq<„’rnR¯Ð/¾?,Z¢óð\Q¨Zh5Å×hdXÒxd£$RÀ³euVdhÕ¢/9ÙІxH v-ÇE+àÁÞ¦ðàT¸ðp¥Íøðì¼JŸ‘/ã‘ÃøÒ€w©: ï­ù†w¸"×eÏhçíˆw±šU¼ó¸a’{¼Ã£¥T¼³5`oxGÛ;‘¡‘ D…;Ò?…“w†U§‡;ã~€»0¹3@£Iü wð$ÅÎ7¸³AÍ@…;ŸÔâ4¸‹š›mxi‘Ä]Ã;š]IÞö‹ukx뛼KyÌ¥\ªmh˜+<@žwšo«Ñ©‡¤Ž¤R*äZ9k˜gkW ó‚Ñ\Jżä4[T‹æ¢GÍ æakÊzHíÏèA{Ì3è1õ˜‡ƒž!s–±g’"l˜çƒŽ¸‚Ÿ…‡ô,ßáé0¯IÛ󜩸X1`L–«bžKê|VÌs8ò ÏdM¿5ȃ=v=äy Ò:Ì#+¢ž\Å<\>uäY=mkˆãi{Ä㛎¹G¼@˜ ™¨†xðæñœp¼*ÈTÀ‹¤]¶?6"˜Lš®˜G¶Izj˜çê1^ż„±Ç<<m¨˜‡g"â`5̳z´Ó0/ãÖ_è1ÆS£¼ßø›l\¶'å“§Qÿ}ÿê‡î5ô/¦aBRœ¬ùë뼺4&LÏ^o¦¹R,Óoþþw(àÍDÞUïŽ;ý¡„鯺ŽÇáÉõ‹ÚÜOo÷Ç×µd§Ú|¶“»yÞ7¹¿û@)šònºsé1÷›k¼÷&ÉšŽ:^›¦ïú!vwÚ' e:öÏëÔÒôéõòËu0qÚݾº?`¤ £»:S7í»áÈñ0mñ|ì&À¸åÍ [wzfüù°òrž¬)íä‘v53é Èô̼p0n&MÚpöØÞï8]]ù¥_öaw˜Ô&O÷Äß_˜nï_ÝÜâ­*MíÇw÷û~9ïewgc§º6Äì…òróôãuÄ>üÐmÐÀîáWúh/kç,§Kdí>—Xr °|†kb’zëDl¹ÞOR¯ »HV ×oúŠ_OZ3 ûEŽŠ#È‘Nÿ~!u}âRb“&ê7p^¦«k@fQYϰò´¹Ô~}}nè¸Ö@¢¶¹úÓª+YÃØI²TV?¡ €…$-úrÿêõ5.ÑÚU¢muÓqe&Xh³7œ3HÖ‡……ÀdzuZ„<ÉåéáO¢¥f $0§j_kªœÌY Ê Ž7ÈŒòêE[HyjóüŸø5/›º¼†ãOL|;ôòêæ³ûã ·ã0^UiúÛÁ,ýU'¨¿=ñ˜BñG,â<ýz'µH\ýŒ…°}زÈ{€ºß<ûüêÙþjú‡7ÞÇïìt·ãÍ£xzúY©6O»‡‡^ÛïjƒPF[±;žÕ.Üûðx‡ÊõïÏ0n“ë:êןΠ)2žÎœ×¯h×2j›9ý©ãÈÑÍi¥ £Ô“CBÑD“ú^ wX3àɱ•*+L9î‡Ýë—ôvwPjïD¼üÉ®>|r÷+| A€uرçØÕ™Ö˜-ݧcf*cFï æxÿpläDðT¼_ ú¢\òG –ßxTp³ ÈûEÛ˰\tÓZñµò‚Wеà&ˆ–¡€‹ƒæüÐÉãó^%ýÄ·cp20»é¢—ðVê<â¯QóÌ:ʦÃÀo@ÌýA „ìê«:ž\÷w»Õjnal ëåàzíkÇôÃ^çgŒ?1¼\'¤iÑÞì–ÅN{~˜\ù4˳R'ò:{,AÄ0·o÷¼Þ¿<\GþöÉšüi-mÐk’*PWäÖÝÂY‚™ìýü°Ô{)_ß¹©lG̓dü‰ÓËŸ¾“V~zy8>\Ÿõ”à…›¹îëé³/>í¤†”ÿ†_Î’.÷PïƒýµdA=È…‡$BU’#÷óÄyFÂ)fX«ö™ùRÜ>ôJÈ]:~r„w¡ú…ßîdXÉOÎð7ÝÈñ‘¤Iýöþ0øã+]Á‰Óßß7—ìííùJ~lüBŽfÿ™ê* Èt>óä;S¼iûøÐ™'5fþõ5I>útbcð¹Ó‡ áë´2\÷wwƒ®Ýþ¬rçgî”å.ŠØô†æá$pɸƒuƒ4©ÏE33È ëÞ¨‘M¾Øâ(ûBHñVþ"m&—äA»%Ü9ÙŒûxniö_k ®ö• Yëý]/ÿ·Ã îV. f2•kn”šœN¾×…Îi놶?íéž™EöʺEF”b æ}ý³aR0ÍFýÇ~¹"tÖv 烫`P”-iúv÷ê¥ndv:[•°ƒ²¾g{ƒŒ’#·©¼éËs^ém*ÕS™Ú‡B~±1™q0ãÒúu›ÏTÛ?(V“ïün4®ÿúÉÑú?E™mt/žg &žŽP”Фþ¬M~ï’«6ÁmÞ¥þ@J~߉ôYwR|õ¦/yü®Ìïéñã[7ÿ¿­NÀ‡¿l³ Ýw¼þ–ü¢ŸUf?}£'^}^ ŠQ[ê>”bžS–²ò]+ï°\‹ãþGésíÀ~‚^gvy`ÿœ(7_ 8¤Í*à€[žÄ-_ûˆ`Çaì àv.9>½HôY–Çc¡?Ð…ÿ.q¡öþxßG°ƒT¶‘žA°E%™/éFݦ4s ‹ÛÑÍ¿?ê =Æ ØÝê|—¬Áîö¶²!g˜ÛŽ—›¬5õz\û{ƒ‚4«.á÷:ÃæcäOQ۷ʆs¸k“x¼ü7Çv@ñâÆ€´7j¯Z±ª.ÿpVuñ¤Á¸w¨n ÖÉëíUw­?ä¡™²é*~Åa'pr§ã2¿X°˜“ÏuZ]v5Ù6|-¡Äù²uX‡ú©„ÜB}2Ç‘Õ=MÿµfäÐ z9Ù®~/U9.ý˜§éðœ\Eý8âÿº.ð©H@î/Åì¯tõ­=uùaBž>Û²“×|‡7Ö5ÛÌRàµÍ<³ù4ÅÂôäªm®0É yrtŽrTÂ!ð“L39è¤9ÃÐ?Šiöø¢Þ t|Ÿh›=žÎâë ý*#ÇR`û¼näwî”Þ¼ Íooïåô#¥éíÃ_S†·䦬¸«xqó0‚þw£èp¾ ãÓØµI$ŸÍFóå>"|”ü Q€PÕ⃞—8檜 ÆãQe¯“û¶}Y3׫P ní]Í “ì\þÒ<êGÆ‚O;“ù…ŒÃØrážl…äþeÄ–lý˜BûYÇBqOoUXVgÂ8* 9Î m°º¯.ŒÒ{àD—ãoP󲹂üï‰5æäžü…ºA8ŠºXœìï0]s±k©lXYí>«½ë ûÛýq¿Bå³^®ìøêå|wFñBy^GîϺ9¸;=Çñ<òoê‚!ÅÇy»PóvŸžc–¸F=ǯÞÒ8zxKÞ'­ó¿ÏŒß(Jœh87ú•ãã:<“„Y¥=I6ŒiÉ•õužs \N·îñËpâ+9Ú2ìj!Ìrz˜:KÒi8ÑÎ6ŽûA厫‹8dÖ§“4KåYÇûÔ_èo @C¢@Ü#‚ûRò*PDNÛǰ Ú'Ç ÜÍ_%jÆ[7¼*‰=È[M1™´:èÄ8!ëqî6DõFµÚ: òj•”’ ÜoÍle‰/ûVœ”(ÑM?)¼q›pzdH“œÀ/çÿ›$'™DóøÍŒw¬¶qüe¹ŽÞ¿ ¸½M`7^'y¸|ÔófÝbÞS…(8£t«,×Ãz›nðµ¿R±¢ù5rëØ‹îOÇúPvZPçL¸ß pN’ß&¤ŽLåjí”l—ãÜÎþ-˜5޹Q ŠHe,E…Ï6å ·é§©FÑÁ®B¿Kw^HÎRz‡äú”Ÿ(¹§àÐ$÷ü5\0ös³äpâ½[‚­ŸÅ¶üóàÜ.aòôoÎÞX›s±~œ“93ùÐâÏ4ëhÓ;Áh9?¨{É\æx×}ÞX¾ î67üµg3×ë×ø—JØ<Ÿ_çq>–u.ö}×¹ÝX¼¸Î-oÚÖù±é}rþåLj«5þùš¹)ËŽ^\¤ÙŽ‹dÿ,Âø‹\”ÐA 럻™éä-;ýw§÷‡‡Ùâ­R¦ÞdÄEå·E—ëxºr– V=Oq€!X:kÀõ²|QC pûzŸœe™ëíÒ¾ª=³m`i°¦]½vaµïßNÅDñÑ;GˉŠo´þEŽ™ ›E%@s ()˲ÿOU_Ò£syF|¶-Ø@âãð1bßç‡ñ:òP\»Zû7öœPðÍ’G{dekþÇÙ¹«u替¨øú¼‚øœùšñRñ}â…*«cšK“ÿuvüçŠÉˆf"ÓcÐq)-k]ìUI`ˆ¿NaäWgâ¼µ!V£q)hS™}W؃O'Ï«°çÝÓþ`C¼rmÌ+ òËûÄÞŸµk+«•ý…£óS!©Ð÷/+#0Ùï'#5ußF~ýOgƒ"ØLÜÿ¦OUwÝñ¾ «Ö×üz²©žáš'ü1µõ•·ïHqáS{DpI½m¿Ÿz“’œUïòÜüëó‹I±{yÜ÷ÁM(o}…$>¦ç°Û/x¬gKH7½ƒ?^ƒ×„P™û›‘’ &O£¶s‰,çö³$~é…t‚¾â·1Mc`s»ä®¿3:~Êo´'ûíðÛ¶lpÚA®b«1™¿üýv݆˶´eçW0s <_Ÿ¿±îVÇØÁ›éïŽ:ƒe§ñêÑ#o5˜Žòeº4íê{Ž˜hT7z•…?è²¾Ê2^oe3±š8³@:€Üid‚œ>ñ­„ET.ÊÐaw»ÿ?ëgD<¢8Vü¾9kF—û éÒ­Çç(É„ãíó,'À6=!­Ž»úѹž¡¦Õ$i—å §hx ì™X ’Åæù;¤o99žUù¼sy¥6÷‡ŠÍù~¦ì Õ‹7t¸h/)§ÔîL½ë¢…ÅXS;zý¦Ý#ýYrX…!¶~Wä½ çéõÏ;¹·~bqÜËë°%íÐ%îȃÜFïVƒ§YïÕë™!y/‡±iP9ûô¦ú˜áºfWŸvæ^ì"þÍ,§'¯O]Äw ÿŒÁxIÜõRæ2\ÂYœÜ r›ëÜí°Î¿>é ÿÞl\7ør‰aKÇö‰G_Je\f9"óÈ®¼ÚÿØÄ’„íÞèrž?•Ò6Îm.œÿÈE·õÝjÙij7CNt)È=‚ógXÄ>êјecþYãñˆ ÇÅ]¾'ók‚‡býòì&8ñRC“žûíný|nȬ;sZûÔÒÂV`Ñ.¢÷îpjG1™ñí€w€^ºZ³¾V7Ÿ€öÛUÏØJZÔ¬¯¬ð„ÍG:rf»çæ ¾¶oÌÓÏœñ/¨zi ¿z¦?³U±‚‰§7YyŠ)Á’7Œc)sïŠvy{ó¶Ý ïƒÃ/B¶g"Ã…œ*£1 °Û÷ªOVQ˧³üÑøm±yXþ'9'øªþ½Ôž!.¦Ë…7ù·TG´\ß«“VçÕòëüÊ÷¥øVTá¿ïÏ©ê¿Ý?4žÙü=?šÄ‹1Cö®ÿh¼Ü©›ß¥¯2‚ÇçüŸÔѰ…©ß ø¡‹S~UÇŽC„oE:‚oާÇ*LÇ]¿óðLð;/ßKøÃ¥¬óp5ùxbbŸ*C,ÐK# Qþ=Ú°µO"ø.Y?*ÁW@i4à{}@ËÖ×oIÐ礥^®€CÊ+xèƒÛŠzÍËáñÌ—®Uð¯Eo®óßÄÉßѳ|Ç@ÞhðxÈ#:ÇÁ˜‘¯XüúÌW‡~},,ó´~§Ö¦qF…z÷{Cò;µš´¸xLµN«…%üÛŬ{Ÿ ¯¬b}(Q¶6º•—ðbÜéůk×7V>+m¹ñbí¹ø…?àXZ&äñ‹Ù.gi'Ž2wê‘Éçç`¹ZØ Or:l®Ö°Ó_ÜÖ{B¹®2Øi9¥[Ù¢Þ#[ı7x)O$‹<÷~ÏS-¹±ŠA™S¯Èó§²Óy›Ý2%2¥ørЦøõ»î ŒßÔà÷Á-÷oÏ^މ©øúxÁûǼ¬@¾zÞt¿º˜¾9§[7ø¼%>§3¼éû£{¾KÅΜՉOäYùÝê"ÈýÁçñf­g39V.œŸ½G 8<”^hë{el™Þ"™ÚÛñî–È2›TÿA²üQÞLàûõÎoðt÷÷r}…©õ› Ƶ“k¹ðQýiñ)o&øÃ9¡ûÇy3oÝå<ð}bTÌù' ´‡e^öÔ¼Õ_V8ÆN"Ö¼ý³8Ý–ó÷WÿVPoKendstream endobj 489 0 obj << /Filter /FlateDecode /Length 161 >> stream xœ]O1ƒ0 Üó ÿ  uA,tahUµý@p”' aèïKtèp'Ùw'Ÿe?\v ä#z|QëØDZü‘`¤É±¨j0Ó1ÆY!û›ïO Ø d÷ù®g’ÏF]ʪÚCè -A#E͉V©®µ¶ÄæO:£=œMÝ(µqöŸJŽæçMÀ5FâTš–&¹€cú=|È)Ø ¾/S/endstream endobj 490 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 325 >> stream xœcd`ab`ddôñ NÌ+64ÐõOÊÉ,,M ªüfü!ÃôC–¹»ûgÒO/Önæn–õß÷ }üîÏÿÝG€™‘1<=ß9¿ ²(3=£DÁÈÀÀXWHZ*$U*8é)x%&gç—gg*$æ¥(xéùê)øå—34òó’R3sÒòÓBR#Bƒ]ƒ‚܃üC‚5õÐã3000103012²¤_Ã÷Ÿ©õ*²ïO|Ÿq˜ñõÃï¥w¾‹ÜaþñWì·è÷[ß™VÞ½4çŽä‚w†~+wsüneû­ñ׋õ!Û¹ïY¿±}çý}‘õñ ¢5.v¿¹€*TØŸÁú]…í;G÷€¾Ò…?æ|_8{!Û ®'Ür\,!ù<œ‡z€ ·ˆ¦öñð001çendstream endobj 491 0 obj << /Type /XRef /Length 348 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 492 /ID [<7cfdb0106f8b1921d66dfddd47f5c71a>] >> stream xœí•½+…QÇç¸Ü›ûâ¾Ö½oEea`0èÖµÉÌ`°b l·Xd!=E”ÑË ;(,F‰,Ä$Žçû5øNç>}ûõ{;çû<=Zðh%#ßE# ­¥‘tÉ´W„ãÎqÛi¤¹è^ß»¯Ûzé.ÃëÊ©óÚv˜€×çßÎkÛidôíä8¼Nnƒñc°aôVÁôØ4ê01P)ƒÑ>Pµ²jšñ°æ¬ ƒÙ1æ,1’úŒ±³Š€ÕW`í#Ì OQ׳O†v1òÉ)CÔÜP_PסjUwÔ¯ÌY3¾Û‘3°—9‰Yœ+5ÿ¿Oè ÌQgçÀÞ@û ¹eæ§pn”'Õ`ã X¸FÏøûsnÎç­>ñÎWXµŒœ‡»=“ëìÙæ…=·XÛɹû`ÇØ–Bm~º…gQœ«vä—ÖG endstream endobj startxref 341241 %%EOF mixtools/inst/doc/mixtools.Rnw0000755000175100001440000021573414762763100016263 0ustar hornikusers\documentclass[nojss]{jss} \usepackage{amsmath} \usepackage{amssymb} %% need no \usepackage{Sweave.sty} %\VignetteIndexEntry{mixtools for mixture models} %% macros (Didier) \newcommand{\CF}{{\mathcal F}} \newcommand{\CN}{{\mathcal N}} \def\Bg{\mathbf{g}} \def\Bh{\mathbf{h}} \def\Bk{\mathbf{k}} \def\Bx{\mathbf{x}} \def\By{\mathbf{y}} \def\Bc{\mathbf{c}} \def\BC{\mathbf{C}} \def\Bz{\mathbf{z}} \newcommand{\argmax}{\mathop{\mbox{argmax}}} \def\bP{\mathbb{P}} % Probability \def\I{\mathbb I} % indicator function \def\bE{\mathbb{E}} % expectation \def\bR{\mathbb{R}} % real line \newcommand{\f}{{\vec\theta}} \newcommand{\lb}{{\lambda}} \def\post{{p}} \def\defn{{\stackrel{\rm def}{=}}} \def\vec#1{\mathchoice{\mbox{\boldmath$\displaystyle\bf#1$}} {\mbox{\boldmath$\textstyle\bf#1$}} {\mbox{\boldmath$\scriptstyle\bf#1$}} {\mbox{\boldmath$\scriptscriptstyle\bf#1$}}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% declarations for jss.cls %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% almost as usual \author{Tatiana Benaglia \\ Pennsylvania State University \And Didier Chauveau \\ Universit\'e d'Orl\'eans \AND David R.~Hunter \\ Pennsylvania State University \And Derek S. Young \\ Pennsylvania State University} \title{\pkg{mixtools}: An \proglang{R} Package for Analyzing Finite Mixture Models} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Tatiana Benaglia, Didier Chauveau, David R.~Hunter, Derek Young} %% comma-separated \Plaintitle{mixtools: An R Package for Analyzing Mixture Models} %% without formatting \Shorttitle{mixtools for Mixture Models} %% a short title (if necessary) %% an abstract and keywords \Abstract{ The \pkg{mixtools} package for \proglang{R} provides a set of functions for analyzing a variety of finite mixture models. These functions include both traditional methods, such as EM algorithms for univariate and multivariate normal mixtures, and newer methods that reflect some recent research in finite mixture models. In the latter category, \pkg{mixtools} provides algorithms for estimating parameters in a wide range of different mixture-of-regression contexts, in multinomial mixtures such as those arising from discretizing continuous multivariate data, in nonparametric situations where the multivariate component densities are completely unspecified, and in semiparametric situations such as a univariate location mixture of symmetric but otherwise unspecified densities. Many of the algorithms of the \pkg{mixtools} package are EM algorithms or are based on EM-like ideas, so this article includes an overview of EM algorithms for finite mixture models. } \Keywords{cutpoint, EM algorithm, mixture of regressions, model-based clustering, nonparametric mixture, semiparametric mixture, unsupervised clustering} %, keywords, comma-separated, not capitalized, \proglang{Java}} \Plainkeywords{keywords, comma-separated, not capitalized, Java} %% without formatting %% at least one keyword must be supplied %% publication information %% NOTE: Typically, this can be left commented and will be filled out by the technical editor %% \Volume{13} %% \Issue{9} %% \Month{September} %% \Year{2004} %% \Submitdate{2004-09-29} %% \Acceptdate{2004-09-29} %% The address of (at least) one author should be given %% in the following format: \Address{ Didier Chauveau\\ Laboratoire MAPMO - UMR 7349 - F\'ed\'eration Denis Poisson\\ Universit\'e d'Orl\'eans\\ BP 6759, 45067 Orl\'eans cedex 2, FRANCE.\\ E-mail: \email{didier.chauveau@univ-orleans.fr} \\ URL: \url{http://www.univ-orleans.fr/mapmo/membres/chauveau/}\\ \\ David R.~Hunter\\ Department of Statistics\\ 326 Thomas Building\\ Pennsylvania State University\\ University Park, PA 16802\\ Telephone: +1/814-863-0979\\ Fax: +1/814-863-7114\\ E-mail: \email{dhunter@stat.psu.edu} \\ URL: \url{http://www.stat.psu.edu/~dhunter/}\\ \\ Tatiana Benaglia\\ Department of Statistics, Penn State (see above)\\ E-mail: \email{tab321@stat.psu.edu} \\ \\ Derek Young\\ Department of Statistics, Penn State (see above)\\ E-mail: \email{dsy109@psu.edu} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/1/31336-5053 %% Fax: +43/1/31336-734 %% for those who use Sweave please include the following line (with % symbols): %% need no \usepackage{Sweave.sty} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} \SweaveOpts{concordance=FALSE} %% include your article here, just as usual %% Note that you should use the \pkg{}, \proglang{} and \code{} commands. \section[Introduction to finite mixtures and mixtools]{Introduction to finite mixtures and \pkg{mixtools}} %% Note: If there is markup in \(sub)section, then it has to be escape %% as above. \label{s:intro} Authors' note: The original version of this vignette was produced using an article that appears in the {\it Journal of Statistical Software} (URL: \url{http://www.jstatsoft.org/}); see \citet{Benaglia+Chauveau+Hunter+Young:2009}. Populations of individuals may often be divided into subgroups. Yet even when we observe characteristics of these individuals that provide information about their subgroup memberships, we may not actually observe these memberships {\em per se}. The basic goal of the tools in the \pkg{mixtools} package (version 0.4.3, as of this writing) for \proglang{R} \citep{r2009} is to examine a sample of measurements to discern and describe subgroups of individuals, even when there is no observable variable that readily indexes into which subgroup an individual properly belongs. This task is sometimes referred to as ``unsupervised clustering'' in the literature, and in fact mixture models may be generally thought of as comprising the subset of clustering methods known as ``model-based clustering''. The \pkg{mixtools} package is available from the Comprehensive \proglang{R} Archive Network at \url{http://CRAN.R-project.org/package=mixtools}. Finite mixture models may also be used in situations beyond those for which clustering of individuals is of interest. For one thing, finite mixture models give descriptions of entire subgroups, rather than assignments of individuals to those subgroups (though the latter may be accomplished using mixture models). Indeed, even the subgroups may not necessarily be of interest; sometimes finite mixture models merely provide a means for adequately describing a particular distribution, such as the distribution of residuals in a linear regression model where outliers are present. Whatever the goal of the modeler when employing mixture models, much of the theory of these models involves the assumption that the subgroups are distributed according to a particular parametric form --- and quite often this form is univariate or multivariate normal. While \pkg{mixtools} does provide tools for traditional fitting of finite mixtures of univariate and multivariate normal distributions, it goes well beyond this well-studied realm. Arising from recent research whose goal is to relax or modify the assumption of multivariate normality, \pkg{mixtools} provides computational techniques for finite mixture model analysis in which components are regressions, multinomial vectors arising from discretization of multivariate data, or even distributions that are almost completely unspecified. This is the main feature that distinguishes \pkg{mixtools} from other mixture-related \proglang{R} packages, also available from the Comprehensive \proglang{R} Archive Network at \url{http://CRAN.R-project.org/}, such as \pkg{mclust} \citep{Fraley+Raftery:2009} and \pkg{flexmix} \citep{jss:Leisch:2004, Grun+Leisch:2008}. We briefly mention these two packages in Sections~\ref{section:EMexample} and \ref{section:pdmp}, respectively. To make the mixture model framework more concrete, suppose the possibly vector-valued random variables $\vec X_1, \ldots, \vec X_n$ are a simple random sample from a finite mixture of $m>1$ arbitrary distributions, which we will call {\em components} throughout this article. The density of each $\vec X_i$ may be written \begin{equation} \label{mvmixture} g_{\f}(\vec x_i) = \sum_{j=1}^m\lambda_j\phi_j(\vec x_i), \quad \vec x_i\in\bR^r, \end{equation} where $\f=(\vec\lambda, \vec \phi) = (\lambda_1, \ldots, \lambda_m, \phi_1, \ldots, \phi_m)$ denotes the parameter and the $\lambda_m$ are positive and sum to unity. We assume that the $\phi_j$ are drawn from some family $\cal F$ of multivariate density functions absolutely continuous with respect to, say, Lebesgue measure. The representation \eqref{mvmixture} is not identifiable if no restrictions are placed on $\cal F$, where by ``identifiable'' we mean that $g_{\f}$ has a {\em unique} representation of the form \eqref{mvmixture} and we do not consider that ``label-switching'' --- i.e., reordering the $m$ pairs $(\lambda_1, \phi_1), \ldots, (\lambda_m, \phi_m)$ --- produces a distinct representation. In the next sections we will sometimes have to distinguish between {\em parametric} and more general {\em nonparametric} situations. This distinction is related to the structure of the family $\CF$ of distributions to which the component densities $\phi_j$ in model \eqref{mvmixture} belong. We say that the mixture is {\em parametric} if $\CF$ is a parametric family, $\CF = \{\phi(\cdot|\vec\xi), \vec\xi\in\bR^d\}$, indexed by a ($d$-dimensional) Euclidean parameter $\vec\xi$. A parametric family often used is the univariate Gaussian family $\CF = \{\phi(\cdot|\mu,\sigma^2)=\mbox{density of }\CN(\mu,\sigma^2), (\mu,\sigma^2)\in\bR\times\bR^+_*\}$, in which case the model parameter reduces to $\f = (\vec \lambda, (\mu_1,\sigma^2_1),\ldots,(\mu_m,\sigma^2_m))$. For the multivariate case, a possible parametric model is the {\em conditionally i.i.d.\ normal model}, for which $\CF=\{\phi(\vec x_i) = \prod_{k=1}^r f(x_{ik}), \mbox{$f(t)$ density of $\CN(\mu,\sigma^2)$}\}$ (this model is included in \pkg{mixtools}; see Section~\ref{ss:nbcomp}). An example of a (multivariate) nonparametric situation is $\CF=\{\phi(\vec x_i) = \prod_{k=1}^r f(x_{ik}), \mbox{$f(t)$ a univariate density on $\bR$}\}$, in which case $\vec\f$ consists in a Euclidean part ($\vec\lb$) and a nonparametric part $(f_1,\ldots,f_m)$. As a simple example of a dataset to which mixture models may be applied, consider the sample depicted in Figure \ref{geyser}. In the Old Faithful dataset, measurements give time in minutes between eruptions of the Old Faithful geyser in Yellowstone National Park, USA. These data are included as part of the \pkg{datasets} package in \proglang{R} \citep{r2009}; type \code{help("faithful")} in \proglang{R} for more details. <>= library(mixtools) data(faithful) attach(faithful) @ \setkeys{Gin}{width=0.6\textwidth} \begin{figure}[h] \centering <>= hist(waiting, main="Time between Old Faithful eruptions", xlab="Minutes", ylab="", cex.main=1.5, cex.lab=1.5, cex.axis=1.4) @ \caption{The Old Faithful dataset is clearly suggestive of a two-component mixture of symmetric components.} \label{geyser} \end{figure} For the Old Faithful eruption data, a two-component mixture model is clearly a reasonable model based on the bimodality evident in the histogram. This example is analyzed by \citet{hunter2007ims}, who compare a standard normal-mixture method for fitting it with a novel semiparametric approach. Both approaches are included in \pkg{mixtools}; see Sections \ref{section:EMexample} and \ref{section:SPexample} of this article. In Section~\ref{section:EM} of the current article we review the well-known class of EM algorithms for finite mixture models, a common thread that runs throughout much of the rest of the article. The remaining sections discuss various categories of functions found in the \pkg{mixtools} package, from cutpoint methods that relax distributional assumptions for multivariate data by discretizing the data (Section~\ref{section:cut}), to semi- and non-parametric methods that eliminate distributional assumptions almost entirely depending on what the identifiability of the model allows (Section~\ref{section:np}), to methods that handle various mixtures of regressions (Section~\ref{section:reg}). Finally, Section \ref{section:misc} describes several miscellaneous features of the \pkg{mixtools} package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{EM algorithms for finite mixtures} \label{section:EM} \subsection{Missing data setup} Much of the general methodology used in \pkg{mixtools} involves the representation of the mixture problem as a particular case of maximum likelihood estimation (MLE) when the observations can be viewed as incomplete data. This setup implies consideration of two sample spaces, the sample space of the (incomplete) observations, and a sample space of some ``complete'' observations, the characterization of which being that the estimation can be performed explicitly at this level. For instance, in parametric situations, the MLE based on the complete data may exist in closed form. Among the numerous reference papers and monographs on this subject are, e.g., the original EM algorithm paper by \citet{dempster1977mli} and the finite mixture model book by \citet{mclachlan2000fmm} and references therein. We now give a brief description of this setup as it applies to finite mixture models in general. The (observed) data consist of $n$ i.i.d. observations $\vec x = (\vec x_1,\ldots,\vec x_n)$ from a density $g_\f$ given by \eqref{mvmixture}. It is common to denote the density of the sample by $\Bg_\f$, the $n$-fold product of $g_\f$, so that we write simply $\Bx\sim \Bg_\f$. In the missing data setup, $\Bg_\f$ is called the incomplete-data density, and the associated log-likelihood is $L_{\Bx}(\f) = \sum_{i=1}^n \log g_\f(\vec x_i)$. The (parametric) ML estimation problem consists in finding $\hat\f_{\Bx} = \argmax_{\f\in\Phi} L_{\Bx}(\f)$, or at least finding a local maximum --- there are certain well-known cases in which a finite mixture model likelihood is unbounded \citep{mclachlan2000fmm}, but we ignore these technical details for now. Calculating $\hat\f_{\Bx}$ even for a parametric finite mixture model is known to be a difficult problem, and considering $\Bx$ as incomplete data resulting from non-observed complete data helps. The associated complete data is denoted by $\Bc = (\vec c_1,\ldots, \vec c_n)$, with density $\Bh_\f(\Bc)=\prod_{i=1}^n h_\f(\vec c_i)$ (there exists a many-to-one mapping from $\Bc$ to $\Bx$, representing the loss of information). In the model for complete data associated with model~\eqref{mvmixture}, each random vector $\vec C_i = (\vec X_i,\vec Z_i)$, where $\vec Z_i = (Z_{ij},j=1,\ldots m)$, and $Z_{ij}\in\{0,1\}$ is a Bernoulli random variable indicating that individual $i$ comes from component $j$. Since each individual comes from exactly one component, this implies $\sum_{j=1}^m Z_{ij}=1$, and $$ \Prob(Z_{ij} = 1) = \lambda_{j},\quad (\vec X_i|Z_{ij}=1) \sim \phi_j, \quad j=1,\ldots,m. $$ The complete-data density for one observation is thus $$ h_\f(\vec c_i) = h_\f(\vec x_i,\vec z_i) = \sum_{j=1}^m \I_{z_{ij}}\lb_j \phi_j (\vec x_i), $$ In the parametric situation, i.e.\ when $\CF$ is a parametric family, it is easy to check that the complete-data MLE $\hat\f_{\Bc}$ based on maximizing $\log \Bh_\f(\Bc)$ is easy to find, provided that this is the case for the family $\CF$. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{EM algorithms} \label{sec:EM} An EM algorithm iteratively maximizes, instead of the observed log-likelihood $L_{\Bx}(\f)$, the operator $$ Q(\f | \f^{(t)}) = \E \left[\log \Bh_\f(\BC)|\Bx,\f^{(t)} \right], $$ where $\f^{(t)}$ is the current value at iteration~$t$, and the expectation is with respect to the distribution $\Bk_\f(\Bc|\Bx)$ of $\Bc$ given $\Bx$, for the value $\f^{(t)}$ of the parameter. The iteration $\f^{(t)} \to \f^{(t+1)}$ is defined in the above general setup by \begin{enumerate} \item E-step: compute $Q(\f | \f^{(t)})$ \item M-step: set $\f^{(t+1)} = \argmax_{\f\in\Phi}Q(\f | \f^{(t)})$ \end{enumerate} For finite mixture models, the E-step does not depend on the structure of $\CF$, since the missing data part is only related to the $\Bz$'s: $$ \Bk_\f(\Bc|\Bx) = \prod_{i=1}^n k_\f(\vec z_i|\vec x_i). $$ The $\Bz$ are discrete, and their distribution is given via Bayes' theorem. The M-step itself can be split in two parts, the maximization related to $\vec\lb$, which does not depend on $\CF$, and the maximization related to $\vec \phi$, which has to be handled specifically (say, parametrically, semi- or non-parametrically) for each model. Hence the EM algorithms for the models handled by the \pkg{mixtools} package share the following common features: \begin{enumerate} \item{\bf E-step:\ } Calculate the ``posterior'' probabilities (conditional on the data and $\vec\theta^{(t)}$) of component inclusion, \begin{equation}\label{posteriors} \post_{ij}^{(t)} \, \defn \, \Prob_{\vec\theta^{(t)}}(Z_{ij}=1| \vec x_i) = \frac{\lambda_j^{(t)} \phi_{j}^{(t)}(\vec x_{i})} {\sum_{j'=1}^m\lambda_{j'}^{(t)} \phi_{j'}^{(t)}(\vec x_{i})} \end{equation} for all $i=1,\ldots, n$ and $j=1, \ldots, m$. Numerically, it can be dangerous to implement equation (\ref{posteriors}) exactly as written due to the possibility of the indeterminant form $0/0$ in cases where $\vec x_i$ is so far from any of the components that all $\phi_{j'}^{(t)}(\vec x_i)$ values result in a numerical underflow to zero. Thus, many of the routines in \pkg{mixtools} actually use the equivalent expression \begin{equation}\label{altposteriors} \post_{ij}^{(t)} = \left[ 1 + \sum_{j'\ne j} \frac{ \lambda_{j'}^{(t)} \phi_{j'}^{(t)}(\vec x_{i})} {\lambda_j^{(t)} \phi_{j}^{(t)}(\vec x_{i})} \right]^{-1} \end{equation} or some variant thereof. \item{\bf M-step for $\vec\lb$:\ } Set \begin{equation}\label{lambda} \lambda_j^{(t+1)} = \frac1n\sum_{i=1}^n \post_{ij}^{(t)} , \quad\mbox{for $j=1, \ldots, m$.} \end{equation} \end{enumerate} \subsection{An EM algorithm example} \label{section:EMexample} As an example, we consider the univariate normal mixture analysis of the Old Faithful waiting data depicted in Figure \ref{geyser}. This fully parametric situation corresponds to a mixture from the univariate Gaussian family described in Section~\ref{s:intro}, where the $j$th component density $\phi_j(x)$ in \eqref{mvmixture} is normal with mean $\mu_j$ and variance $\sigma_j^2$. This is a special case of the general mixture-of-normal model that is well-studied in the literature and for which other software, such as the \pkg{mclust} \citep{Fraley+Raftery:2009} package for \proglang{R}, may also be used for parameter estimation. The M-step for the parameters $(\mu_j,\sigma^2_j)$, $j=1,\ldots,m$ of this EM algorithm for such mixtures of univariate normals is straightforward, and can be found, e.g., in \citet{mclachlan2000fmm}. The function \code{normalmixEM} implements the algorithm in \pkg{mixtools}. Code for the Old Faithful example, using most of the default values (e.g., stopping criterion, maximum number of iterations), is simply <>= wait1 <- normalmixEM(waiting, lambda = .5, mu = c(55, 80), sigma = 5) @ The code above will fit a 2-component mixture (because \code{mu} is a vector of length two) in which the standard deviations are assumed equal (because \code{sigma} is a scalar instead of a vector). See \code{help("normalmixEM")} for details about specifying starting values for this EM algorithm. <>= plot(wait1, density=TRUE, cex.axis=1.4, cex.lab=1.4, cex.main=1.8, main2="Time between Old Faithful eruptions", xlab2="Minutes") @ \setkeys{Gin}{width=0.49\textwidth} \begin{figure}[!h] \centering <>= for(i in 1:2){ file=paste("geyserEM", i, ".pdf", sep="") pdf(file=file, paper="special", width=6, height=6) plot(wait1, whichplots=i, cex.axis = 1.4, cex.lab = 1.4, cex.main = 1.8, main2 = "Time between Old Faithful eruptions", xlab2 = "Minutes") dev.off() cat("\\includegraphics{", file, "}\n", sep="") } @ \caption{The Old Faithful waiting data fitted with a parametric EM algorithm in \pkg{mixtools}. Left: the sequence of log-likelihood values; Right: the fitted Gaussian components.} \label{geyserEM} \end{figure} The \code{normalmixEM} function returns an object of class \code{"mixEM"}, and the \code{plot} method for these objects delivers the two plots given in Figure \ref{geyserEM}: the sequence $t\mapsto L_{\Bx}(\f^{(t)})$ of observed log-likelihood values and the histogram of the data with the $m$ ($m=2$ here) fitted Gaussian component densities of $\CN(\hat\mu_j,\hat\sigma^2_j)$, $j=1,\ldots,m$, each scaled by the corresponding $\hat\lambda_j$, superimposed. The estimator $\hat{\vec\theta}$ can be displayed by typing, e.g., <>= wait1[c("lambda", "mu", "sigma")] @ Alternatively, the same output may be obtained using the \code{summary} method: <>= summary(wait1) @ \section{Cutpoint methods} \label{section:cut} Traditionally, most literature on finite mixture models has assumed that the density functions $\phi_j(\vec x)$ of equation (\ref{mvmixture}) come from a known parametric family. However, some authors have recently considered the problem in which $\phi_j(\vec x)$ is unspecified except for some conditions necessary to ensure the identifiability of the parameters in the model. One such set of conditions is as follows: \citet{hettmansperger2000ani}; \citet{cruzmedina2004smm}; and \citet{elmore2004ecc} treat the case in which $\phi_j(\vec x)$ equals the product $f_j(x_i)\cdots f_j(x_r)$ for some univariate density function $f_j$. Thus, conditional on knowing that $\vec X$ comes from the $j$th mixture component, the coordinates of $\vec X$ are independent and identically distributed. For this reason, this case is called the conditionally i.i.d.\ model. The authors named above have developed an estimation method for the conditionally i.i.d.\ model. This method, the {\em cutpoint approach}, discretizes the continuous measurements by replacing each $r$-dimensional observation, say $\vec X_i= (x_{i1}, \ldots, x_{ir})$, by the $p$-dimensional multinomial vector $(n_1, \ldots, n_p)$, where $p\ge2$ is chosen by the experimenter along with a set of cutpoints $-\infty = c_0 < c_1 < \cdots < c_p=\infty$, so that for $a=1, \ldots, p$, \[ n_a = \sum_{k=1}^r I\{c_{a-1} < x_{ik} \le c_a\}. \] Note that the multinomial distribution is guaranteed by the conditional i.i.d.\ assumption, and the multinomial probability of the $a$th category is equal to $\theta_a \equiv P_{}(c_{a-1}>= data("Waterdata") cutpts <- 10.5*(-6:6) watermult <- makemultdata(Waterdata, cuts = cutpts) @ Once the multinomial data have been created, we may apply the \code{multmixEM} function to estimate the multinomial parameters via an EM algorithm. <>= set.seed(15) theta4 <- matrix(runif(56), ncol = 14) theta3 <- theta4[1:3,] mult3 <- multmixEM(watermult, lambda = rep(1, 3)/3, theta = theta3) mult4 <- multmixEM (watermult, lambda = rep (1, 4) / 4, theta = theta4) @ Finally, \code{compCDF} calculates and plots the estimated distribution functions of equation (\ref{ecdf}). Figure \ref{WDcutpoint} gives plots for both a 3-component and a 4-component solution; these plots are very similar to the corresponding plots in Figures 1 and 2 of \citet{elmore2004ecc}. <>= cdf3 <- compCDF(Waterdata, mult3$posterior, lwd=2, lab=c(7, 5, 7), xlab="Angle in degrees", ylab="Component CDFs", main="Three-Component Solution") cdf4 <- compCDF(Waterdata, mult4$posterior, lwd=2, lab=c(7, 5, 7), xlab="Angle in degrees", ylab="Component CDFs", main="Four-Component Solution") @ <>= pdf(file="WDcutpoint3comp.pdf", paper="special", width=8, height=8) cdf3 <- compCDF(Waterdata, mult3$posterior, lwd=3, xlab="Angle in degrees", lab=c(7, 5, 7), ylab="Component CDFs", main="Three-Component Solution", cex.axis=1.4, cex.lab=1.5, cex.main=1.5) ltext <- paste(round(mult3$lam*100, 1), "%", sep="") legend("bottomright", legend=ltext, pch=15:17, cex=1.5, pt.cex=1.35) y <- compCDF(Waterdata, mult3$posterior, x=cutpts, makeplot=F) for(i in 1:3) points(cutpts, y[i,], pch=14+i, cex=1.35) dev.off() pdf(file="WDcutpoint4comp.pdf", paper="special", width=8, height=8) cdf4 <- compCDF(Waterdata, mult4$posterior, lwd=3, xlab="Angle in degrees", lab=c(7, 5, 7), ylab="Component CDFs", main="Four-Component Solution", cex.axis=1.4, cex.lab=1.5, cex.main=1.5) ltext <- paste(round(mult4$lam*100,1), "%", sep="") legend("bottomright", legend=ltext, pch=15:18, cex=1.5, pt.cex=1.35) y <- compCDF(Waterdata, mult4$posterior, x=cutpts, makeplot=F) for(i in 1:4) points(cutpts, y[i,], pch=14+i, cex=1.35) dev.off() @ \begin{figure}[!h] \centering \includegraphics[width=0.49\textwidth]{WDcutpoint3comp} \includegraphics[width=0.49\textwidth]{WDcutpoint4comp} \caption{Empirical cumulative distribution function (CDF) estimates for the three- and four-component multinomial cutpoint models for the water-level data; compare Figures 1 and 2 of \citet{elmore2004ecc}. The 13 cutpoints used are indicated by the points in the plots, and the estimated mixing proportions for the various components are given by the legend. } \label{WDcutpoint} \end{figure} As with the output of \code{normalmixEM} in Section~\ref{section:EM}, it is possible to summarize the output of the \code{multmixEM} function using the \code{summary} method for \code{mixEM} objects: <>= summary(mult4) @ \section{Nonparametric and semiparametric methods} \label{section:np} In this section, we consider nonparametric multivariate finite mixture models. The first algorithm presented here was introduced by \citet{benaglia2009} as a generalization of the stochastic semiparametric EM algorithm of \citet{bordes2007sas}. Both algorithms are implemented in \pkg{mixtools}. \subsection{EM-like algorithms for mixtures of unspecified densities} \label{section:EMlike} Consider the mixture model described by equation \eqref{mvmixture}. If we assume that the coordinates of the $\vec X_i$ vector are {\em conditionally independent}, i.e. they are independent conditional on the subpopulation or component ($\phi_1$ through $\phi_m$) from which $\vec X_i$ is drawn, the density in \eqref{mvmixture} can be rewritten as: \begin{equation} \label{mvmixture2} g_{\vec\theta}(\vec x_i) = \sum_{j=1}^m\lambda_j\prod_{k=1}^rf_{jk}(x_{ik}), \end{equation} where the function $f(\cdot)$, with or without subscripts, will always denote a univariate density function. Here we do not assume that $f_{jk}(\cdot)$ comes from a family of densities that may be indexed by a finite-dimensional parameter vector, and we estimate these densities using nonparametric density techniques. That is why we say that this algorithm is a fully nonparametric approach. The density in equation \eqref{mvmixture2} allows for a different distribution for each component and each coordinate of $\vec X_i$. Notice that if the density $f_{jk}(\cdot)$ does not depend on $k$, we have the case in which the $\vec X_i$ are not only conditionally independent but identically distributed as well. These are the two extreme cases. In order to encompass both the conditionally i.i.d. case and the more general case \eqref{mvmixture2} simultaneously in one model, we allow that the coordinates of $\vec X_i$ are conditionally independent and there exist {\em blocks} of coordinates that are also identically distributed. If we let $b_k$ denote the block to which the $k$th coordinate belongs, where $1\le b_k\le B$ and $B$ is the total number of such blocks, then equation \eqref{mvmixture2} is replaced by \begin{equation}\label{rmgeneral} g_{\vec\theta} (\vec x_i) = \sum_{j=1}^m \lambda_j \prod_{k=1}^r f_{j{b_k}} (x_{ik}). \end{equation} The indices $i$, $j$, $k$, and $\ell$ will always denote a generic individual, component (subpopulation), coordinate (repeated measurement), and block, respectively. Therefore, we will always have $1\le i\le n$, $1\le j\le m$, $1\le k\le r$, and $1\le\ell\le B$. The EM algorithm to estimate model \eqref{rmgeneral} has the E-step and M-step described in Section~\ref{sec:EM}. In equation (\ref{posteriors}), we have $\phi_j^{(t)}(\vec x_i) = \prod_{k=1}^r f_{jb_k}^{(t)}(x_{ik})$, where $f_{j\ell}^{(t)}(\cdot)$ is obtained by a weighted nonparametric (kernel) density estimate, given by: \begin{enumerate} \addtocounter{enumi}{2} \item{\bf Nonparametric (Kernel) density estimation step:\ } For any real $u$, define for each component $j\in\{1, \ldots, m\}$ and each block $\ell\in\{1, \ldots, B\}$ \begin{equation} \label{densest} f_{j\ell}^{t+1}(u) = \frac {1}{nh_{j\ell} C_\ell\lambda_{j}^{t+1}} \sum_{k=1}^r \sum_{i=1}^n \post_{ij}^{(t)} I\{b_k=\ell\} K\left(\frac{u-x_{ik}}{h_{j\ell}}\right), \end{equation} where $K(\cdot)$ is a kernel density function, $h_{j\ell}$ is the bandwidth for the $j$th component and $\ell$th block density estimate, and $C_\ell$ is the number of coordinates in the $\ell$th block. \end{enumerate} The function \code{npEM} implements this algorithm in \pkg{mixtools}. This function has an argument \code{samebw} which, when set to \code{TRUE} (the default), takes $h_{j\ell} = h$, for all $1 \le j \le m$ and $1\le\ell\le B$, that is, the same bandwidth for all components and blocks, while \code{samebw = FALSE} allows a different bandwidth for each component and each block, as detailed in \citet{bch:festchrift2009}. This function will, if called using \code{stochastic = TRUE}, replace the deterministic density estimation step (\ref{densest}) by a {\em stochastic} density estimation step of the type proposed by \citet{bordes2007sas}: First, generate $\vec Z^{(t)}_{i} = (Z^{(t)}_{i1}, \ldots, Z^{(t)}_{im})$ as a multivariate random vector with a single trial and success probability vector $\vec p_i^{(t)} = (p_{i1}^{(t)}, \ldots, p_{1m}^{(t)})$, then in the M-step for $\lambda_{j}^{t+1}$ in equation~(\ref{lambda}), replace $p^{(t)}_{ij}$ by $Z^{(t)}_{ij}$ and let \[ f_{j\ell}^{t+1}(u) = \frac {1}{nh_{j\ell} C_\ell\lambda_{j}^{t+1}} \sum_{k=1}^r \sum_{i=1}^n Z_{ij}^{(t)} I\{b_k=\ell\} K\left(\frac{u-x_{ik}}{h_{j\ell}}\right). \] In other words, the stochastic versions of these algorithms re-assign each observation randomly at each iteration, according to the $p_{ij}^{(t)}$ values at that iteration, to one of the $m$ components, then the density estimate for each component is based only on those observations that have been assigned to it. Because the stochastic algorithms do not converge the way a deterministic algorithm often does, the output of \code{npEM} is slightly different when \code{stochastic = TRUE} than when \code{stochastic = FALSE}, the default. See the corresponding help file for details. \citet{benaglia2009} also discuss specific cases of model (\ref{rmgeneral}) in which some of the $f_{jb_k}(\cdot)$ densities are assumed to be the same except for a location and scale change. They refer to such cases as semiparametric since estimating each $f_{jb_k}(\cdot)$ involves estimating an unknown density as well as multiple location and scale parameters. For instance, equation (17) of \citet{benaglia2009} sets \begin{equation} \label{spEM} f_{j\ell}(x) = \frac{1}{\sigma_{j\ell}}f \left( \frac{x-\mu_{j\ell}}{\sigma_{j\ell}} \right), \end{equation} where $\ell=b_k$ for a generic $k$. The \pkg{mixtools} package implements an algorithm for fitting model (\ref{spEM}) in a function called \code{spEM}. Details on the use of this function may be obtained by typing \code{help("spEM")}. Implementation of this algorithm and of that of the \code{npEM} function requires updating the values of $f_{jb_k}(x_{ik})$ for all $i$, $j$, and $k$ for use in the E-step (\ref{posteriors}). To do this, the \code{spEM} algorithm keeps track of an $n\times m$ matrix, called $\Phi$ here, where \[ \Phi_{ij} \equiv \phi_j(\vec x_i) = \prod_{k=1}^r f_{jb_k}(x_{ik}). \] The density estimation step of equation (\ref{densest}) updates the $\Phi$ matrix for the $(t+1)$th iteration based on the most recent values of all of the parameters. For instance, in the case of model (\ref{spEM}), we obtain \begin{eqnarray*} \Phi_{ij}^{t+1} &=& \prod_{\ell=1}^B\prod_{k:b_k=\ell} \frac{1}{\sigma_{j\ell}^{t+1}} f^{t+1} \left( \frac{x-\mu_{j\ell}^{t+1}}{\sigma_{j\ell}^{t+1}} \right) \\ &=& \prod_{\ell=1}^B \prod_{k:b_k=\ell} \frac{1}{\sigma_{j\ell}^{t+1}} \sum_{i'=1}^n \frac{p_{ij}^{t+1}}{hrn\lambda_j^{t+1}} \sum_{k'=1}^r K\left[ \frac{\left(\frac{x_{ik}-\mu_{j\ell}^{t+1}}{\sigma_{j\ell}^{t+1}} \right) - (x_{i'k'} - \mu_{j\ell}^{t+1})} {h\sigma_{j\ell}^{t+1}} \right]. \end{eqnarray*} \subsection{A univariate symmetric, location-shifted semiparametric example} \label{section:SPexample} Both \citet{hunter2007ims} and \citet{bordes2006set} study a particular case of model (\ref{mvmixture}) in which $x$ is univariate and \begin{equation} \label{spmodel} g_{\vec \theta}(x) = \sum_{j=1}^m\lambda_j \phi(x-\mu_j), \end{equation} where $\phi(\cdot)$ is a density that is assumed to be completely unspecified except that it is symmetric about zero. Because each component distribution has both a nonparametric part $\phi(\cdot)$ and a parametric part $\mu_j$, we refer to this model as semiparametric. Under the additional assumption that $\phi(\cdot)$ is absolutely continuous with respect to Lebesgue measure, \citet{bordes2007sas} propose a stochastic algorithm for estimating the model parameters, namely, $(\vec\lambda, \vec\mu, \phi)$. This algorithm is implemented by the \pkg{mixtools} function \code{spEMsymloc}. This function also implements a nonstochastic version of the algorithm, which is the default and which is a special case of the general algorithm described in Section~\ref{section:EMlike}. <>= pdf(file="spsymmfig1.pdf", paper="special", width=8, height=8) par(mar=0.1+c(5,4.2,4,1.8)) plot(wait1, which = 2, cex.axis = 1.4, cex.lab = 1.5, cex.main = 1.5, main2 = "Time between Old Faithful eruptions", xlab2 = "Minutes") wait2 <- spEMsymloc(waiting, mu0 = c(55, 80)) plot(wait2, lty = 2, newplot = FALSE, addlegend = FALSE) dev.off() pdf(file="spsymmfig2.pdf", paper="special", width=8, height=8) par(mar=0.1+c(5,4.2,4,1.8)) wait2a <- spEMsymloc(waiting, mu0 = c(55, 80), bw = 1) wait2b <- spEMsymloc(waiting, mu0 = c(55, 80), bw = 6) plot(wait2a, lty = 1, addlegend = FALSE, cex.axis = 1.4, cex.lab = 1.5, cex.main = 1.5, title = "Time between Old Faithful eruptions", xlab = "Minutes") plot(wait2b, lty = 2, newplot = FALSE, addlegend = FALSE) dev.off() @ \begin{figure}[h] \centering \includegraphics[height=3in,width=3in]{spsymmfig1} \includegraphics[height=3in,width=3in]{spsymmfig2} \caption{The Old Faithful dataset, fit using different algorithms in \pkg{mixtools}. Left: the fitted Gaussian components (solid) and a semiparametric fit assuming model (\ref{spmodel}) with the default bandwidth of $4.0$ (dashed); Right: the same model (\ref{spmodel}) using bandwidths of $1.0$ (solid) and $6.0$ (dashed).} \label{spsymmfig} \end{figure} As noted in Figure \ref{geyser}, model (\ref{spmodel}) appears to be an appropriate model for the Old Faithful waiting times dataset. Here, we provide code that applies the \code{spEMsymloc} function to these data. First, we display the normal mixture solution of Figure \ref{geyserEM} with a semiparametric solution superimposed, in Figure \ref{spsymmfig}(a): <>= plot(wait1, which = 2, cex.axis = 1.4, cex.lab = 1.4, cex.main = 1.8, main2 = "Time between Old Faithful eruptions", xlab2 = "Minutes") wait2 <- spEMsymloc(waiting, mu0 = c(55, 80)) plot(wait2, lty = 2, newplot = FALSE, addlegend = FALSE) @ Because the semiparametric version relies on a kernel density estimation step (\ref{densest}), it is necessary to select a bandwidth for this step. By default, \code{spEMsymloc} uses a fairly simplistic approach: It applies ``Silverman's rule of thumb'' \citep{silverman1986des} to the entire dataset using the \code{bw.nrd0} function in \proglang{R}. For the Old Faithful waiting time dataset, this bandwidth is about~$4$: <>= bw.nrd0(waiting) @ But the choice of bandwidth can make a big difference, as seen in Figure \ref{spsymmfig}(b). <>= wait2a <- spEMsymloc(waiting, mu0 = c(55, 80), bw = 1) wait2b <- spEMsymloc(waiting, mu0 = c(55, 80), bw = 6) plot(wait2a, lty = 1, addlegend = FALSE, cex.axis = 1.4, cex.lab = 1.4, cex.main = 1.8, xlab = "Minutes", title = "Time between Old Faithful eruptions") plot(wait2b, lty = 2, newplot = FALSE, addlegend = FALSE) @ We find that with a bandwidth near $2$, the semiparametric solution looks quite close to the normal mixture solution of Figure \ref{geyserEM}. Reducing the bandwidth further results in the ``bumpiness'' exhibited by the solid line in Figure \ref{spsymmfig}(b). On the other hand, with a bandwidth of 8, the semiparametric solution completely breaks down in the sense that algorithm tries to make each component look similar to the whole mixture distribution. We encourage the reader to experiment by changing the bandwidth in the above code. \subsection{A trivariate Gaussian example} \label{ss:trigauss} As a first simple, nonparametric example, we simulate a Gaussian trivariate mixture with independent repeated measures and a shift of location between the two components in each coordinate, i.e., $m=2$, $r=3$, and $b_k=k$, $k=1,2,3$. The individual densities $f_{jk}$ are the densities of $\CN(\mu_{jk},1)$, with component means $\vec\mu_1 = (0,0,0)$ and $\vec\mu_2=(3,4,5)$. This example was introduced by \citet{hall2005nim} then later reused by \citet{benaglia2009} for comparison purposes. Note that the parameters in this model are identifiable, since \citet{hall2003nec} showed that for two components ($m=2$), identifiability holds in model~\eqref{mvmixture} is under mild assumptions as long as $r\ge3$, even in the most general case in which $b_k=k$ for all $k$. A function \code{ise.npEM} has been included in \pkg{mixtools} for numerically computing the integrated squared error (ISE) relative to a user-specified true density for a selected estimated density $\hat f_{jk}$ from \code{npEM} output. Each density $\hat f_{jk}$ is computed using equation~(\ref{densest}) together with the posterior probabilities after convergence of the algorithm, i.e., the final values of the $\post_{ij}^t$ (when \code{stochastic = FALSE}). We illustrate the usage of \code{ise.npEM} in this example by running a Monte Carlo simulation for $S$ replications, then computing the square root of the mean integrated squared error (MISE) for each density, where \[ {\rm MISE} = \frac{1}{S}\sum_{s=1}^S \int \left(\hat f_{jk}^{(s)}(u)-f_{jk}(u)\right)^2\,du,\quad j=1,2 \mbox{ and } k=1,2,3. \] For this example, we first set up the model true parameters with $S=100$ replications of $n=300$ observations each: <>= m <- 2; r <- 3; n <- 300; S <- 100 lambda <- c(0.4, 0.6) mu <- matrix(c(0, 0, 0, 3, 4, 5), m, r, byrow = TRUE) sigma <- matrix(rep(1, 6), m, r, byrow = TRUE) @ Next, we set up ``arbitrary'' initial centers, a matrix for storing sums of integrated squared errors, and an integer storing the number of suspected instances of label switching that may occur during the replications: <>= centers <- matrix(c(0, 0, 0, 4, 4, 4), 2, 3, byrow = TRUE) ISE <- matrix(0, m, r, dimnames = list(Components = 1:m, Blocks = 1:r)) nblabsw <- 0 @ Finally, we run the Monte Carlo simulation, using the \code{samebw = FALSE} option since it is more appropriate for this location-shift model: <>= set.seed(1000) for (mc in 1:S) { x <- rmvnormmix(n, lambda, mu, sigma) a <- npEM(x, centers, verb = FALSE, samebw = FALSE) if (a$lambda[1] > a$lambda[2]) nblabsw <- nblabsw + 1 for (j in 1:m) { for (k in 1:r) { ISE[j, k] <- ISE[j, k] + ise.npEM(a, j, k, dnorm, lower = mu[j, k] - 5, upper = mu[j, k] + 5, plots = FALSE, mean = mu[j, k], sd = sigma[j, k])$value #$ } } } MISE <- ISE/S print(sqMISE <- sqrt(MISE)) @ We can examine the \code{npEM} output from the last replication above using <>= summary(a) @ We can also get plots of the estimated component densities for each block (recall that in this example, block $\ell$ consists only of coordinate $\ell$) using the \code{plot} function. The resulting plots are given in Figure~\ref{fig:gausstrivariate}. <>= plot(a) @ <>= pdf("gauss3rm.pdf", paper="special", width=10, height=5) par(mfrow=c(1,3), ask=F) plot(a) dev.off() @ \begin{figure}[h] \centering \includegraphics[width=.99\textwidth]{gauss3rm} \caption{Output of the \code{npEM} algorithm for the trivariate Gaussian model with independent repeated measures.} \label{fig:gausstrivariate} \end{figure} \subsection{A more general multivariate nonparametric example} \label{sec:generalmv} In this section, we fit a more difficult example, with non-multimodal mixture densities (in block \#2), heavy-tailed distributions, and different scales among the coordinates. The model is multivariate with $r=5$ repeated measures and $m=2$ components (hence identifiability holds; cf.\ \citet{hall2003nec} as cited in Section~\ref{ss:trigauss}). The $5$ repeated measures are grouped into $B=2$ blocks, with $b_1=b_2=b_3=1$ and $b_4=b_5=2$. Block $1$ corresponds to a mixture of two noncentral Student $t$ distributions, $t'(2,0)$ and $t'(10,8)$, where the first parameter is the number of degrees of freedom, and the second is the non-centrality. Block~2 corresponds to a mixture of Beta distributions, ${\cal B}(1,1)$ (which is actually the uniform distribution over $[0,1]$) and ${\cal B}(1,5)$. The first component weight is $\lambda_1 = 0.4$. The true mixtures are depicted in Figure~\ref{fig:true5rm}. <>= pdf("truepdf5rm_block1.pdf") par(mar=0.1+c(5,4.2,4,1.5)) x <- seq(-10, 25, len=250) plot(x, .4* dt(x, 2, 0) + .6 * dt(x, 10, 8), type="l", lwd=3, col=2, cex.axis=1.4, cex.lab=1.5, cex.main=1.5, main="Block 1", xlab="", ylab="Density") lines (x, .4*dt(x, 2, 0), lwd=4, lty=2) lines (x, .6*dt(x, 10, 8), lwd=4, lty=2) dev.off() pdf("truepdf5rm_block2.pdf") par(mar=0.1+c(5,4.2,4,1.5)) x <- seq(0, 1, len=250) plot(x, .4 + .6 * dbeta(x, 1, 5), type="l", lwd=3, col=2, cex.axis=1.4, cex.lab=1.5, cex.main=1.5, main="Block 2", xlab="", ylab="Density", ylim= c(0, 3.4)) lines (x, rep(.4, 250), lwd=4, lty=2) lines (x, .6*dbeta(x, 1, 5), lwd=4, lty=2) dev.off() @ \begin{figure}[h] \centering \includegraphics[height=2.5in,width=2.5in]{truepdf5rm_block1} \includegraphics[height=2.5in,width=2.5in]{truepdf5rm_block2} \caption{True densities for the mixture of Section~\ref{sec:generalmv}, with individual component densities (scaled by $\lambda_j$) in dotted lines and mixture densities in solid lines. The noncentral $t$ mixture of coordinates 1 through 3 is on the left, the beta mixture of coordinates 4 and 5 on the right.} \label{fig:true5rm} \end{figure} To fit this model in \pkg{mixtools}, we first set up the model parameters: <>= m <- 2; r <- 5 lambda <- c(0.4, 0.6) df <- c(2, 10); ncp <- c(0, 8) sh1 <- c(1, 1) ; sh2 <- c(1, 5) @ Then we generate a pseudo-random sample of size $n=300$ from this model: <>= n <- 300; z <- sample(m, n, rep = TRUE, prob = lambda) r1 <- 3; z2 <- rep(z, r1) x1 <- matrix(rt(n * r1, df[z2], ncp[z2]), n, r1) r2 <- 2; z2 <- rep(z, r2) x2 <- matrix(rbeta(n * r2, sh1[z2], sh2[z2]), n, r2) x <- cbind(x1, x2) @ For this example in which the coordinate densities are on different scales, it is obvious that the bandwidth in \code{npEM} should depend on the blocks and components. We set up the block structure and some initial centers, then run the algorithm with the option \code{samebw = FALSE}: <>= id <- c(rep(1, r1), rep(2, r2)) centers <- matrix(c(0, 0, 0, 1/2, 1/2, 4, 4, 4, 1/2, 1/2), m, r, byrow = TRUE) b <- npEM(x, centers, id, eps = 1e-8, verb = FALSE, samebw = FALSE) @ Figure~\ref{fig:npEM5rm} shows the resulting density estimates, which may be obtained using the plotting function included in \pkg{mixtools}: <>= plot(b, breaks = 15) @ % plot(b, breaks = 15, cex.main = 1.5, cex.lab = 1.5, cex.axis = 1.4, % cex.legend = 1.5) <>= pdf("npEM5rm.pdf", width=8, height=5) par(mfrow=c(1,2)) plot(b, breaks = 15) dev.off() @ \begin{figure}[h] \centering \includegraphics[width=.95\textwidth]{npEM5rm} \caption{Result of plotting \code{npEM} output for the example of Section~\ref{sec:generalmv}. Since $n=300$, the histogram on the left includes 900 observations and the one on the right includes 600.} \label{fig:npEM5rm} \end{figure} Finally, we can compute the ISE of the estimated density relative to the truth for each block and component. The corresponding output is depicted in Figure \ref{fig:ISEnpEM5rm}. <>= par(mfrow=c(2,2)) for (j in 1:2){ ise.npEM(b, j, 1, truepdf = dt, lower = ncp[j] - 10, upper = ncp[j] + 10, df = df[j], ncp = ncp[j]) ise.npEM(b, j, 2, truepdf = dbeta, lower = -0.5, upper = 1.5, shape1 = sh1[j], shape2 = sh2[j]) } @ <>= options(warn=-1) pdf("ISEnpEM5rm.pdf", width=8, height=8) par(mfrow = c(2, 2)) for (j in 1:2){ ise.npEM(b, j, 1, truepdf = dt, lower = ncp[j] - 10, upper = ncp[j] + 10, df = df[j], ncp = ncp[j]) ise.npEM(b, j, 2, truepdf = dbeta, lower = -0.5, upper = 1.5, shape1 = sh1[j], shape2 = sh2[j]) } dev.off() @ \begin{figure}[h] \centering \includegraphics[height=5in,width=6in]{ISEnpEM5rm} \caption{\code{ise.npEM} output for the 5-repeated measures example; the true densities are $f_{11}\equiv t'(2,0)$, $f_{21}\equiv t'(10,8)$, $f_{12}\equiv {\cal U}_{(0,1)}$, $f_{22}\equiv {\cal B}(1,5)$.} \label{fig:ISEnpEM5rm} \end{figure} \section{Mixtures of regressions} \label{section:reg} \subsection{Mixtures of linear regressions} Consider a mixture setting where we now assume $\textbf{X}_{i}$ is a vector of covariates observed with a response $Y_{i}$. The goal of mixtures of regressions is to describe the conditional distribution of $Y_{i}|\textbf{X}_{i}$. Mixtures of regressions have been extensively studied in the econometrics literature and were first introduced by \citet{quandt1972sr} as the \textit{switching regimes} (or \textit{switching regressions}) problem. A switching regimes system is often compared to \textit{structural change} in a system \citep{quandtram1978sr}. A structural change assumes the system depends deterministically on some observable variables, but switching regimes implies one is unaware of what causes the switch between regimes. In the case where it is assumed there are two heterogeneous classes, \citet{quandt1972sr} characterized the switching regimes problem ``by assuming that nature chooses between regimes with probabilities $\lambda$ and $1-\lambda$''. Suppose we have $n$ independent univariate observations, $y_{1},\ldots,y_{n}$, each with a corresponding vector of predictors, $\textbf{x}_{1},\ldots,\textbf{x}_{n}$, with $\textbf{x}_{i}=(x_{i,1},\ldots,x_{i,p})^\top$ for $i=1,\ldots,n$. We often set $x_{i,1}=1$ to allow for an intercept term. Let $\textbf{y}=(y_{1},\ldots,y_{n})^\top$ and let $\underline{\textbf{X}}$ be the $n\times p$ matrix consisting of the predictor vectors. Suppose further that each observation $(y_{i}, \vec x_i)$ belongs to one of $m$ classes. Conditional on membership in the $j$th component, the relationship between $y_{i}$ and $\textbf{x}_{i}$ is the normal regression model \begin{equation}\label{regmodel} y_{i}=\textbf{x}_{i}^\top\vec{\beta}_{j}+\epsilon_{i}, \end{equation} where $\epsilon_{i}\thicksim \CN(0,\sigma^{2}_{j})$ and $\vec{\beta}_{j}$ and $\sigma_{j}^{2}$ are the $p$-dimensional vector of regression coefficients and the error variance for component $j$, respectively. Accounting for the mixture structure, the conditional density of $y_{i}|\vec x_i$ is \begin{equation}\label{mor} g_{\vec\theta}(y_{i}|\textbf{x}_{i})=\sum_{j=1}^{m}\lambda_{j} \phi(y_{i} | \textbf{x}_{i}^\top\vec{\beta}_{j},\sigma^{2}_{j}), \end{equation} where $\phi(\cdot|\textbf{x}^\top\vec{\beta}_{j},\sigma^{2}_{j})$ is the normal density with mean $\textbf{x}^\top\vec\beta$ and variance $\sigma^2$. Notice that the model parameter for this setting is $\vec\theta=(\vec\lambda,(\vec{\beta}_{1},\sigma^2_{1}),\ldots,(\vec{\beta}_{m},\sigma^2_{m}))$. The mixture of regressions model (\ref{mor}) differs from the well-known mixture of multivariate normals model $(Y_{i},\textbf{X}_{i}^\top)^\top\thicksim \sum_{j=1}^{m}\lambda_{j}\CN_{p+1}(\vec{\mu}_{j},\Sigma_{j})$ because model (\ref{mor}) makes no assertion about the marginal distribution of $\textbf{X}_{i}$, whereas the mixture of multivariate normals specifies that $\textbf{X}_{i}$ itself has a mixture of multivariate normals distribution. <>= data("CO2data") attach(CO2data) pdf("gnpdata.pdf") par(mar=0.1+c(5,4.2,4,1.5)) plot(GNP, CO2, xlab="Gross National Product", ylab=expression(paste(CO[2]," per Capita")), cex.lab=1.5, cex.main=1.5, cex.axis=1.4, main="1996 GNP and Emissions Data") text(GNP, CO2, country, adj=c(.5,-.5)) dev.off() @ \begin{figure}[h] \centering \includegraphics[height=3in,width=3in]{gnpdata.pdf} \caption{1996 data on gross national product (GNP) per capita and estimated carbon dioxide ($\textrm{CO}_{2}$) emissions per capita. Note that ``CH'' stands for Switzerland, not China.} \label{gnpdata} \end{figure} As a simple example of a dataset to which a mixture of regressions models may be applied, consider the sample depicted in Figure \ref{gnpdata}. In this dataset, the measurements of carbon dioxide ($\textrm{CO}_{2}$) emissions are plotted versus the gross national product (GNP) for $n=28$ countries. These data are included \pkg{mixtools}; type \code{help("CO2data")} in \proglang{R} for more details. \citet{hurn} analyzed these data using a mixture of regressions from the Bayesian perspective, pointing out that ``there do seem to be several groups for which a linear model would be a reasonable approximation.'' They further point out that identification of such groups could clarify potential development paths of lower GNP countries. \subsection{EM algorithms for mixtures of regressions} A standard EM algorithm, as described in Section~\ref{section:EM}, may be used to find a local maximum of the likelihood surface. \citet{deveaux1989} describes EM algorithms for mixtures of regressions in more detail, including proposing a method for choosing a starting point in the parameter space. The E-step is the same as for any finite mixture model EM algorithm; i.e., the $p_{ij}^{(t)}$ values are updated according to equation (\ref{posteriors})---or, in reality, equation (\ref{altposteriors})---where each $\phi_j^{(t)}(\vec x_i)$ is replaced in the regression context by $\phi(y_i | \vec x_i^\top\vec\beta_j, \sigma_j^2)$: \begin{equation}\label{regposteriors} \post_{ij}^{(t)} = \left[ 1 + \sum_{j'\ne j} \frac{ \lambda_{j'}^{(t)} \phi(y_i | \vec x_i^\top\vec\beta_{j'}, \sigma_{j'}^2)}{\lambda_j^{(t)} \phi(y_i | \vec x_i^\top\vec\beta_j, \sigma_j^2)} \right]^{-1} \end{equation} The update to the $\lambda$ parameters in the M-step, equation (\ref{lambda}), is also the same. Letting $\textbf{W}_{j}^{(t)}=\textrm{diag}(\post_{1j}^{(t)},\ldots,\post_{nj}^{(t)})$, the additional M-step updates to the $\vec\beta$ and $\sigma$ parameters are given by \begin{eqnarray}\label{betaEM} \vec{\beta}_{j}^{(t+1)} &=& (\underline{\textbf{X}}^\top\textbf{W}_{j}^{(t)}\underline{\textbf{X}})^{-1}\underline{\textbf{X}}^\top \textbf{W}_{j}^{(t)}\textbf{y} \quad \mbox{and} \\ \label{sigma} \sigma_{j}^{2(t+1)} &=& \frac{\biggl\|\textbf{W}_{j}^{1/2(t)}(\textbf{y}-\underline{\textbf{X}}^\top\vec{\beta}_{j}^{(t+1)})\biggr\|^{2}}{\mbox{tr}(\textbf{W}_{j}^{(t)})}, \end{eqnarray} where $\|\textbf{A}\|^{2}=\textbf{A}^\top\textbf{A}$ and $\mbox{tr}(\textbf{A})$ means the trace of the matrix $\textbf{A}$. Notice that equation (\ref{betaEM}) is a weighted least squares (WLS) estimate of $\vec{\beta}_{j}$ and equation (\ref{sigma}) resembles the variance estimate used in WLS. Allowing each component to have its own error variance $\sigma_j^2$ results in the likelihood surface having no maximizer, since the likelihood may be driven to infinity if one component gives a regression surface passing through one or more points exactly and the variance for that component is allowed to go to zero. A similar phenomenon is well-known in the finite mixture-of-normals model where the component variances are allowed to be distinct \citep{mclachlan2000fmm}. However, in practice we observe this behavior infrequently, and the \pkg{mixtools} functions automatically force their EM algorithms to restart at randomly chosen parameter values when it occurs. A local maximum of the likelihood function, a consistent version of which is guaranteed to exist by the asymptotic theory as long as the model is correct and all $\lambda_j$ are positive, usually results without any restarts. The function \code{regmixEM} implements the EM algorithm for mixtures of regressions in \pkg{mixtools}. This function has arguments that control options such as adding an intercept term, \code{addintercept = TRUE}; forcing all $\vec\beta_j$ estimates to be the same, \code{arbmean = FALSE} (for instance, to model outlying observations as having a separate error variance from the non-outliers); and forcing all $\sigma_j^2$ estimates to be the same, \code{arbvar = FALSE}. For additional details, type \code{help("regmixEM")}. As an example, we fit a 2-component model to the GNP data shown in Figure \ref{gnpdata}. \citet{hurn} and \citet{youngphd} selected 2 components for this dataset using model selection criteria, Bayesian approaches to selecting the number of components, and a bootstrapping approach. The function \code{regmixEM} will be used for fitting a 2-component mixture of regressions by an EM algorithm: <>= data("CO2data") attach(CO2data) @ <>= CO2reg <- regmixEM(CO2, GNP, lambda = c(1, 3) / 4, beta = matrix(c(8, -1, 1, 1), 2, 2), sigma = c(2, 1)) @ We can then pull out the final observed log-likelihood as well as estimates for the 2-component fit, which include $\hat{\lambda}$, $\hat{\vec{\beta}}_{1}$, $\hat{\vec{\beta}}_{2}$, $\hat{\sigma}_{1}$, and $\hat{\sigma}_{2}$: <>= summary(CO2reg) @ The reader is encouraged to alter the starting values or let the internal algorithm generate random starting values. However, this fit seems appropriate and the solution is displayed in Figure \ref{co2EM} along with 99\% Working-Hotelling Confidence Bands, which are constructed automatically by the \code{plot} method in this case by assigning each point to its most probable component and then fitting two separate linear regressions: <>= plot(CO2reg, density = TRUE, alpha = 0.01, cex.main = 1.5, cex.lab = 1.5, cex.axis = 1.4) @ \setkeys{Gin}{width=0.49\textwidth} \begin{figure}[!h] \centering <>= for(i in 1:2){ file=paste("CO2reg", i, ".pdf", sep="") pdf(file=file, paper="special", width=6, height=6) plot(CO2reg, whichplots=i, alpha = 0.01, cex.main = 1.5, cex.lab = 1.5, cex.axis = 1.4) dev.off() cat("\\includegraphics{", file, "}\n", sep="") } @ \caption{The GNP data fitted with a 2-component parametric EM algorithm in \pkg{mixtools}. Left: the sequence of log-likelihood values, $L_{\Bx}(\f^{(t)})$; Right: the fitted regression lines with 99\% Working-Hotelling Confidence Bands.} \label{co2EM} \end{figure} \subsection{Predictor-dependent mixing proportions} \label{section:pdmp} Suppose that in model (\ref{mor}), we replace $\lambda_j$ by $\lambda_{j}(\textbf{x}_{i})$ and assume that the mixing proportions vary as a function of the predictors $\textbf{x}_{i}$. Allowing this type of flexibility in the model might be useful for a number of reasons. For instance, sometimes it is the proportions $\lambda_j$ that are of primary scientific interest, and in a regression setting it may be helpful to know whether these proportions appear to vary with the predictors. As another example, consider a \code{regmixEM} model using \code{arbmean = FALSE} in which the mixture structure only concerns the error variance: In this case, $\lambda_j(\vec x)$ would give some sense of the proportion of outliers in various regions of the predictor space. One may assume that $\lambda_{j}(\textbf{x})$ has a particular parametric form, such as a logistic function, which introduces new parameters requiring estimation. This is the idea of the \textit{hierarchical mixtures of experts} (HME) procedure \citep{jacobsall}, which is commonly used in neural networks and which is implemented, for example, in the \pkg{flexmix} package for \proglang{R} \citep{jss:Leisch:2004, Grun+Leisch:2008}. However, a parametric form of $\lambda_{j}(\textbf{x})$ may be too restrictive; in particular, the logistic function is monotone, which may not realistically capture the pattern of change of $\lambda_j$ as a function of $\vec x$. As an alternative, \citet{young2009mor} propose a nonparametric estimate of $\lambda_{j}(\textbf{x}_{i})$ that uses ideas from kernel density estimation. The intuition behind the approach of \citet{young2009mor} is as follows: The M-step estimate (\ref{lambda}) of $\lambda_j$ at each iteration of a finite mixture model EM algorithm is simply an average of the ``posterior'' probabilities $p_{ij}=\E(Z_{ij}|\mbox{data})$. As a substitute, the nonparametric approach uses local linear regression to approximate the $\lambda_j(\textbf{x})$ function. Considering the case of univariate $x$ for simplicity, we set $\lambda_j(x) = \hat\alpha_{0j}(x)$, where \begin{equation}\label{lambdax} (\hat\alpha_{0j}(x), \hat\alpha_{1j}(x))= \arg\min_{(\alpha_0, \alpha_1)} \sum_{i=1}^n K_h(x-x_i) \left[ p_{ij} - \alpha_0 - \alpha_1(x-x_i) \right]^2 \end{equation} and $K_h(\cdot)$ is a kernel density function with scale parameter (i.e., bandwidth) $h$. It is straightforward to generalize equation (\ref{lambdax}) to the case of vector-valued $\vec x$ by using a multivariate kernel function. \citet{young2009mor} give an iterative algorithm for estimating mixture of regression parameters that replaces the standard $\lambda_j$ updates (\ref{lambda}) by the kernel-weighted version (\ref{lambdax}). The algorithm is otherwise similar to a standard EM; thus, like the algorithm in Section~\ref{section:EMlike} of this article, the resulting algorithm is an EM-like algorithm. Because only the $\lambda_j$ parameters depend on $\vec x$ (and are thus ``locally estimated''), whereas the other parameters (the $\vec\beta_j$ and $\sigma_j$) can be considered to be globally estimated, \citet{young2009mor} call this algorithm an iterative global/local estimation (IGLE) algorithm. Naturally, it replaces the usual E-step (\ref{regposteriors}) by a modified version in which each $\lambda_j$ is replaced by $\lambda_j(x_i)$. The function \code{regmixEM.loc} implements the IGLE algorithm in \pkg{mixtools}. Like the \code{regmixEM} function, \code{regmixEM.loc} has the flexibility to include an intercept term by using \code{addintercept = TRUE}. Moreover, this function has the argument \code{kern.l} to specify the kernel used in the local estimation of the $\lambda_{j}(\textbf{x}_{i})$. Kernels the user may specify include \code{"Gaussian"}, \code{"Beta"}, \code{"Triangle"}, \code{"Cosinus"}, and \code{"Optcosinus"}. Further numeric arguments relating to the chosen kernel include \code{kernl.g} to specify the shape parameter for when \code{kern.l = "Beta"} and \code{kernl.h} to specify the bandwidth which controls the size of the window used in the local estimation of the mixing proportions. See the corresponding help file for additional details. For the GNP and emissions dataset, Figure \ref{co2EM} indicates that the assumption of constant weights for the component regressions across all values of the covariate space may not be appropriate. The countries with higher GNP values appear to have a greater probability of belonging to the first component (i.e., the red line in Figure \ref{co2EM}). We will therefore apply the IGLE algorithm to this dataset. We will use the triweight kernel in equation (\ref{lambdax}), which is given by setting $\gamma=3$ in \begin{equation}\label{beta} K_{h}(x)=\frac{1}{hB(1/2,\gamma+1)}\left(1-\frac{x^2}{h^2}\right)^{\gamma}_{+}, \end{equation} where $B(x,y)=\Gamma(x)\Gamma(y)/\Gamma(x+y)$ is the beta function. For the triweight, $B(1/2, 4)$ is exactly $32/35$. This kernel may be specified in \code{regmixEM.loc} with \code{kern.l = "Beta"} and \code{kernl.g = 3}. The bandwidth we selected was $h=20$, which we specify with \code{kernl.h = 20}. For this implementation of the IGLE algorithm, we set the parameter estimates and posterior probability estimates obtained from the mixture of regressions EM algorithm as starting values for $\hat{\vec{\beta}}_{1}$, $\hat{\vec{\beta}}_{2}$, $\hat{\sigma}_{1}$, $\hat{\sigma}_{2}$, and $\lambda(x_{i})$. <>= CO2igle <- regmixEM.loc(CO2, GNP, beta = CO2reg$beta, sigma = CO2reg$sigma, lambda = CO2reg$posterior, kern.l = "Beta", kernl.h = 20, kernl.g = 3) @ We can view the estimates for $\hat{\vec{\beta}}_{1}$, $\hat{\vec{\beta}}_{2}$, $\hat{\sigma}_{1}$, and $\hat{\sigma}_{2}$. Notice that the estimates are comparable to those obtained for the mixture of regressions EM output and the log-likelihood value is slightly higher. <>= summary(CO2igle) @ Next, we can plot the estimates of $\lambda(x_{i})$ from the IGLE algorithm. <>= plot(GNP, CO2igle$post[,1], xlab = "GNP", cex.axis = 1.4, cex.lab = 1.5, ylab = "Final posterior probabilities") lines(sort(GNP), CO2igle$lambda[order(GNP), 1], col=2) abline(h = CO2igle$lambda[1], lty = 2) @ <>= pdf("lamplot.pdf") plot(GNP, CO2igle$post[,1], xlab = "GNP", cex.axis = 1.4, cex.lab = 1.5, ylab = "Final posterior probabilities") lines(sort(GNP), CO2igle$lambda[order(GNP), 1], col=2, lwd=2) abline(h = CO2igle$lambda[1], lty = 2, lwd=2) dev.off() @ This plot is given in Figure \ref{lamplot}. Notice the curvature provided by the estimates from the IGLE fit. These fits indicate an upward trend in the posteriors. The predictor-dependent mixing proportions model provides a viable way to reveal this trend since the regular mixture of regressions fit simply provides the same estimate of $\lambda$ for all $x_{i}$. \begin{figure}[h] \centering \includegraphics[height=3in,width=3in]{lamplot.pdf} \caption{Posterior membership probabilities $p_{i1}$ for component one versus the predictor GNP along with estimates of $\lambda_1(x)$ from the IGLE algorithm (the solid red curve) and $\lambda_1$ from the mixture of linear regressions EM algorithm (the dashed black line).} \label{lamplot} \end{figure} \subsection{Parametric bootstrapping for standard errors} With likelihood methods for estimation in mixture models, it is possible to obtain standard error estimates by using the inverse of the observed information matrix when implementing a Newton-type method. However, this may be computationally burdensome. An alternative way to report standard errors in the likelihood setting is by implementing a parametric bootstrap. \citet{eftib} claim that the parametric bootstrap should provide similar standard error estimates to the traditional method involving the information matrix. In a mixture-of-regressions context, a parametric bootstrap scheme may be outlined as follows: \begin{enumerate} \item Use \code{regmixEM} to find a local maximizer $\hat{\vec\theta}$ of the likelihood. \item For each $\textbf{x}_{i}$, simulate a response value $y_{i}^{*}$ from the mixture density $g_{\hat{\vec\theta}}(\cdot|\textbf{x}_{i})$. \item Find a parameter estimate $\tilde{\vec{\theta}}$ for the bootstrap sample using \code{regmixEM}. \item Use some type of check to determine whether label-switching appears to have occurred, and if so, correct it. \item Repeat steps 2 through 4 $B$ times to simulate the bootstrap sampling distribution of $\hat{\vec\theta}$. \item Use the sample covariance matrix of the bootstrap sample as an approximation to the covariance matrix of $\hat{\vec\theta}$. \end{enumerate} Note that step 3, which is not part of a standard parametric bootstrap, can be especially important in a mixture setting. The \pkg{mixtools} package implements a parametric bootstrap algorithm in the \code{boot.se} function. We may apply it to the regression example of this section, which assumes the same estimate of $\lambda$ for all $x_{i}$, as follows: <>= set.seed(123) CO2boot <- boot.se(CO2reg, B = 100) @ This output consists of both the standard error estimates and the parameter estimates obtained at each bootstrap replicate. An examination of the slope and intercept parameter estimates of the 500 bootstrap replicates reveals that no label-switching is likely to have occurred. For instance, the intercept terms of component one range from 4 to 11, whereas the intercept terms of component two are all tightly clumped around 0: <>= rbind(range(CO2boot$beta[1,]), range(CO2boot$beta[2,])) @ We may examine the bootstrap standard error estimates by themselves as follows: <>= CO2boot[c("lambda.se", "beta.se", "sigma.se")] @ \section[Additional capabilities of mixtools]{Additional capabilities of \pkg{mixtools}} \label{section:misc} \subsection{Selecting the number of components} \label{ss:nbcomp} Determining the number of components $k$ is still a major contemporary issue in mixture modeling. Two commonly employed techniques are information criterion and parametric bootstrapping of the likelihood ratio test statistic values for testing \begin{eqnarray}\label{mixturetest} \nonumber H_{0}&:& k = k_{0} \\ H_{1}&:& k = k_{0}+1 \end{eqnarray} for some positive integer $k_{0}$ \citep{mclach}. The \pkg{mixtools} package has functions to employ each of these methods using EM output from various mixture models. The information criterion functions calculate An Information Criterion (AIC) of \citet{aic}, the Bayesian Information Criterion (BIC) of \citet{schw}, the Integrated Completed Likelihood (ICL) of \citet{biern}, and the consistent AIC (CAIC) of \citet{boz}. The functions for performing parametric bootstrapping of the likelihood ratio test statistics sequentially test $k=k_{0}$ versus $k=k_{0}+1$ for $k_0=1, 2, \ldots$, terminating after the bootstrapped $p$-value for one of these tests exceeds a specified significance level. Currently, \pkg{mixtools} has functions for calculating information criteria for mixtures of multinomials (\code{multmixmodel.sel}), mixtures of multivariate normals under the conditionally i.i.d.\ assumption (\code{repnormmixmodel.sel}), and mixtures of regressions (\code{regmixmodel.sel}). Output from various mixture model fits available in \pkg{mixtools} can also be passed to the function \code{boot.comp} for the parametric bootstrapping approach. The parameter estimates from these EM fits are used to simulate data from the null distribution for the test given in (\ref{mixturetest}). For example, the following application of the \code{multmixmodel.sel} function to the water-level multinomial data from Section~\ref{section:cut} indicates that either 3 or 4 components seems like the best option (no more than 4 are allowed here since there are only 8 multinomial trials per observation and the mixture of multinomials requires $2m \le r+1$ for identifiability): <>= <> set.seed(10) multmixmodel.sel(watermult, comps = 1:4, epsilon = 0.001) @ \citet{youngphd} gives more applications of these functions to real datasets. \subsection{Bayesian methods} Currently, there are only two \pkg{mixtools} functions relating to Bayesian methodology and they both pertain to analyzing mixtures of regressions as described in \citet{hurn}. The \code{regmixMH} function performs a Metropolis-Hastings algorithm for fitting a mixture of regressions model where a proper prior has been assumed. The sampler output from \code{regmixMH} can then be passed to \code{regcr} in order to construct credible regions of the regression lines. Type \code{help("regmixMH")} and \code{help("regcr")} for details and an illustrative example. \section*{Acknowledgments} This research is partially supported by NSF Award SES-0518772. DRH received additional funding from Le Studium, an agency of the Centre National de la Recherche Scientifique of France. \bibliography{mixtools} \end{document} mixtools/build/0000755000175100001440000000000014762772100013253 5ustar hornikusersmixtools/build/vignette.rds0000644000175100001440000000032014762772100015605 0ustar hornikusers‹‹àb```b`a’Ì@&³0`b fd`aàÒ<¹™%ùù9ÅzAyåhrÒ09…´ü"§´(U!7?%5§§1)ihr\+€.Ë@T ’JÖ¼ÄÜTt£Ù]R RóR@Âÿ°ëgü¦…Ã;µ²<¿¦E T ‹[fN*ÌÞÌ8‡9ÀÅ Êd Bw†ù(îç,Ê/׃ùú @â? {49'±Ý£\)‰%‰ziE@ý waßó‡¿mixtools/man/0000755000175100001440000000000014343400152012715 5ustar hornikusersmixtools/man/summary.mixEM.Rd0000644000175100001440000000306414342153463015733 0ustar hornikusers\name{summary.mixEM} \alias{summary.mixEM} \title{Summarizing EM mixture model fits} \usage{ \method{summary}{mixEM}(object, digits=6, \dots) } \arguments{ \item{object}{an object of class \code{mixEM} such as a result of a call to \code{\link{normalmixEM}}} \item{digits}{Significant digits for printing values} \item{\dots}{further arguments passed to \code{print} method.} } \description{ \code{\link[base]{summary}} method for class \code{mixEM}. } \details{ \code{\link{summary.mixEM}} prints parameter estimates for each component of a fitted mixture model. The estimates printed vary with the type of model. } \value{ The function \code{\link{summary.mixEM}} prints the final loglikelihood value at the solution as well as a matrix of values for each component that could include: \item{lambda}{The estimated mixing weights} \item{mu}{The estimated mean parameters} \item{sigma}{The estimated standard deviations} \item{theta}{The estimated multinomial parameters} \item{beta}{The estimated regression parameters} } \seealso{ \code{\link{normalmixEM}}, \code{\link{logisregmixEM}}, \code{\link{multmixEM}}, \code{\link{mvnormalmixEM}}, \code{\link{poisregmixEM}}, \code{\link{regmixEM}}, \code{\link{regmixEM.lambda}}, \code{\link{regmixEM.loc}}, \code{\link{regmixEM.mixed}}, \code{\link{regmixEM.chgpt}}, \code{\link{repnormmixEM}}, \code{\link{expRMM_EM}}, \code{\link{weibullRMM_SEM}} } \examples{ data(faithful) attach(faithful) set.seed(100) out <- normalmixEM(waiting, mu=c(50,80), sigma=c(5,5), lambda=c(.5,.5)) summary(out) } \keyword{file} mixtools/man/parseconstraint.Rd0000755000175100001440000000076014342153463016442 0ustar hornikusers\name{parse.constraints} \title{Constraint Function} \alias{parse.constraints} \usage{ parse.constraints(constr, k = 2, allsame = FALSE) } \description{ Constraint function for some mixture EM algorithms. } \arguments{ \item{constr}{Vector indicating constrained/unconstrained means.} \item{k}{Number of components.} \item{allsame}{Logical indicating for processing the constraints.} } \details{ This function is not intended to be called by the user. } \keyword{internal} mixtools/man/plotly_npEM.Rd0000644000175100001440000001004014343061413015444 0ustar hornikusers\name{plotly_npEM} \title{Plot Nonparametric or Semiparametric EM Output} \alias{plotly_npEM} \alias{plotly_spEM} \usage{ plotly_npEM(x, blocks = NULL, hist=TRUE, addlegend=TRUE, scale = TRUE, title=NULL, breaks="Sturges", dens.col = NULL, newplot=TRUE, ylim = NULL , col.hist = "#1f77b4", width = 3, title.x = 0.5 , title.y = 0.95, title.size = 15, xlab = "X" , xlab.size = 15 , xtick.size = 15, ylab = "Density" , ylab.size = 15 , ytick.size = 15, legend.text = "Posteriors", legend.text.size = 15, legend.size = 15) plotly_spEM(x, blocks = NULL, hist=TRUE, addlegend=TRUE, scale = TRUE, title=NULL, breaks="Sturges", dens.col = NULL, newplot=TRUE, ylim = NULL , col.hist = "#1f77b4", width = 3, title.x = 0.5 , title.y = 0.95, title.size = 15, xlab = "X" , xlab.size = 15 , xtick.size = 15, ylab = "Density" , ylab.size = 15 , ytick.size = 15, legend.text = "Posteriors", legend.text.size = 15, legend.size = 15) } \description{ This is an updater version of \code{plot.npEM} function by using \code{plotly}. For technical details, please refer to \code{plot.npEM}. } \arguments{ \item{x}{An object of class \code{npEM} such as the output of the \code{\link{npEM}} function} \item{blocks}{Blocks (of repeated measures coordinates) to plot; not relevant for univariate case. Default is to plot all blocks.} \item{hist}{If TRUE, superimpose density estimate plots on a histogram of the data} \item{addlegend}{If TRUE, adds legend to the plot.} \item{scale}{If TRUE, scale each density estimate by its corresponding estimated mixing proportion, so that the total area under all densities equals 1 and the densities plotted may be added to produce an estimate of the mixture density. When FALSE, each density curve has area 1 in the plot.} \item{title}{Alternative vector of main titles for plots (recycled as many times as needed)} \item{breaks}{Passed directly to the \code{\link{hist}} function} \item{ylim}{\code{ylim} parameter to use for all plots, if desired. If not given, each plot uses its own ylim that ensures that no part of the plot will go past the top of the plotting area.} \item{dens.col}{Color values to use for the individual component density functions, repeated as necessary. Default value is \code{2:(m+1)}.} \item{newplot}{If TRUE, creates a new plot.} \item{col.hist}{Color of the histogram to plot.} \item{width}{Line width.} \item{title.size}{Size of the main title.} \item{title.x}{Horsizontal position of the main title.} \item{title.y}{Vertical posotion of the main title.} \item{xlab}{Label of X-axis.} \item{xlab.size}{Size of the lable of X-axis.} \item{xtick.size}{Size of tick lables of X-axis.} \item{ylab}{Label of Y-axis.} \item{ylab.size}{Size of the lable of Y-axis.} \item{ytick.size}{Size of tick lables of Y-axis.} \item{legend.text}{Title of legend.} \item{legend.text.size}{Size of the legend title.} \item{legend.size}{Size of legend.} } \value{ \code{plotly_npEM} returns a list with two elements: \item{x}{List of matrices. The \eqn{j}th column of the \eqn{i}th matrix is the vector of \eqn{x}-values for the \eqn{j}th density in the \eqn{i}th plot.} \item{y}{\eqn{y}-values, given in the same form as the \eqn{x}-values.} } \seealso{ \code{\link{npEM}}, \code{\link{density.npEM}}, \code{\link{spEMsymloc}}, \code{\link{plotseq.npEM}}, \code{plot.npEM} } \examples{ \dontrun{ ## Examine and plot water-level task data set. ## First, try a 3-component solution where no two coordinates are ## assumed i.d. data(Waterdata) set.seed(100) a <- npEM(Waterdata[,3:10], 3, bw=4) plotly_npEM(a , newplot = FALSE) ## Next, same thing but pairing clock angles that are directly opposite one ## another (1:00 with 7:00, 2:00 with 8:00, etc.) b <- npEM(Waterdata[,3:10], 3, blockid=c(4,3,2,1,3,4,1,2), bw=4) plotly_npEM(b , newplot = FALSE) } } \keyword{file} mixtools/man/RTdata2.Rd0000755000175100001440000000243014342153463014460 0ustar hornikusers\name{RTdata2} \docType{data} \title{Reaction Time (RT) Data Set (No. 2)} \alias{RTdata2} \usage{ data(RTdata2) } \description{ This data set involves normally developing children 9 years of age presented visual simuli on a computer monitor. There are three different experimental conditions, according to the length of the delay after which the stimulus was displayed on the screen. Each subject experienced each condition eight times, and these 24 trials were given in random order. These data give the 82 children for whom there are complete measurements among over 200 total subjects. } \format{This data frame consists of 82 children (the rows) and their 24 responses (the columns) to the stimulus presented. The response is recorded in milliseconds. The columns are not in the order in which the stimuli were presented to the children; rather, they are arranged into three blocks of eight columns each so that each eight-column block contains only trials from one of the three conditions. } \references{ Miller, C. A., Kail, R., Leonard, L. B. and Tomblin, J. B. (2001) Speed of Processing in Children with Specific Language Impairment, \emph{Journal of Speech, Language, and Hearing Research} \bold{44(2)}, 416--433. } \seealso{ \code{\link{RTdata}} } \keyword{datasets} mixtools/man/ddirichlet.Rd0000755000175100001440000000071714342153463015340 0ustar hornikusers\name{ddirichlet} \alias{ddirichlet} \title{Density Function for the Dirichlet Distribution} \description{ Density function for the Dirichlet distribution. } \usage{ ddirichlet(x, alpha) } \arguments{ \item{x}{A k-dimensional vector of values that sum to 1 for which to calculate the density} \item{alpha}{A k-dimensional vector of the Dirichlet distribution parameters.} } \details{ This is usually not to be called by the user. } \keyword{internal} mixtools/man/initializations.Rd0000755000175100001440000000431614342153463016436 0ustar hornikusers%gammamix things temporarily commented out by DRH on 8-29-2008 %gammamix things uncommented by DSY on 10-2-2009 \name{mixtools initializations} \alias{flaremix.init} \alias{gammamix.init} \alias{logisregmix.init} \alias{multmix.init} \alias{mvnormalmix.init} \alias{normalmix.init} \alias{poisregmix.init} %\alias{regmix.chgpt.init} \alias{regmix.init} \alias{regmix.lambda.init} \alias{regmix.mixed.init} \alias{repnormmix.init} \alias{segregmix.init} \title{Initializations for Various EM Algorithms in 'mixtools'} \description{ Internal intialization functions for EM algorithms in the package \code{mixtools}. } \usage{ flaremix.init(y, x, lambda = NULL, beta = NULL, sigma = NULL, alpha = NULL) gammamix.init(x, lambda = NULL, alpha = NULL, beta = NULL, k = 2) logisregmix.init(y, x, N, lambda = NULL, beta = NULL, k = 2) multmix.init(y, lambda = NULL, theta = NULL, k = 2) mvnormalmix.init(x, lambda = NULL, mu = NULL, sigma = NULL, k = 2, arbmean = TRUE, arbvar = TRUE) normalmix.init(x, lambda = NULL, mu = NULL, s = NULL, k = 2, arbmean = TRUE, arbvar = TRUE) poisregmix.init(y, x, lambda = NULL, beta = NULL, k = 2) %regmix.chgpt.init(y, x, lambda = NULL, beta = NULL, % gamma = NULL, sigma = NULL, t = NULL, k = 2) regmix.init(y, x, lambda = NULL, beta = NULL, s = NULL, k = 2, addintercept = TRUE, arbmean = TRUE, arbvar=TRUE) regmix.lambda.init(y, x, lambda = NULL, beta = NULL, s = NULL, k = 2, addintercept = TRUE, arbmean = TRUE, arbvar = TRUE) regmix.mixed.init(y, x, w = NULL, sigma = NULL, arb.sigma = TRUE, alpha = NULL, lambda = NULL, mu = NULL, R = NULL, arb.R = TRUE, k = 2, mixed = FALSE, addintercept.fixed = FALSE, addintercept.random = TRUE) repnormmix.init(x, lambda = NULL, mu = NULL, s = NULL, k = 2, arbmean = TRUE, arbvar = TRUE) segregmix.init(y, x, lambda = NULL, beta = NULL, s = NULL, k = 2, seg.Z, psi, psi.locs = NULL) } \details{ These are usually not to be called by the user. Definitions of the arguments appear in the respective EM algorithms. } \keyword{internal} mixtools/man/gammamixEM.Rd0000755000175100001440000000715014342153463015245 0ustar hornikusers\name{gammamixEM} \title{EM Algorithm for Mixtures of Gamma Distributions} \alias{gammamixEM} \usage{ gammamixEM(x, lambda = NULL, alpha = NULL, beta = NULL, k = 2, mom.start = TRUE, fix.alpha = FALSE, epsilon = 1e-08, maxit = 1000, maxrestarts = 20, verb = FALSE) } \description{ Return EM algorithm output for mixtures of gamma distributions. } \arguments{ \item{x}{A vector of length n consisting of the data.} \item{lambda}{Initial value of mixing proportions. If \code{NULL}, then \code{lambda} is random from a uniform Dirichlet distribution (i.e., its entries are uniform random and then it is normalized to sum to 1).} \item{alpha}{Starting value of vector of component shape parameters. If non-NULL, \code{alpha} must be of length \code{k} if allowing different component shape parameters, or a single value if \code{fix.alpha = TRUE}. If NULL, then the initial value is estimated by partitioning the data into \code{k} regions (with \code{lambda} determining the proportion of values in each region) and then calculating the method of moments estimates.} \item{beta}{Starting value of vector of component scale parameters. If non-NULL and a vector, \code{k} is set to \code{length(beta)}. If NULL, then the initial value is estimated the same method described for \code{alpha}.} \item{k}{Number of components. Initial value ignored unless \code{alpha} and \code{beta} are both NULL.} \item{mom.start}{Logical to indicate if a method of moments starting value strategy should be implemented. If \code{TRUE}, then only unspecified starting values will be generated according to this strategy.} \item{epsilon}{The convergence criterion. Convergence is declared when the change in the observed data log-likelihood increases by less than epsilon.} \item{fix.alpha}{Logical to indicate if the components should have a common shape parameter \code{alpha} estimated. The default is \code{FALSE}.} \item{maxit}{The maximum number of iterations.} \item{maxrestarts}{The maximum number of restarts allowed in case of a problem with the particular starting values chosen (each restart uses randomly chosen starting values).} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} } \value{ \code{gammamixEM} returns a list of class \code{mixEM} with items: \item{x}{The raw data.} \item{lambda}{The final mixing proportions.} \item{gamma.pars}{A 2xk matrix where each column provides the component estimates of \code{alpha} and \code{beta}.} \item{loglik}{The final log-likelihood.} \item{posterior}{An nxk matrix of posterior probabilities for observations.} \item{all.loglik}{A vector of each iteration's log-likelihood. This vector includes both the initial and the final values; thus, the number of iterations is one less than its length.} \item{ft}{A character vector giving the name of the function.} } \references{ Dempster, A. P., Laird, N. M., and Rubin, D. B. (1977) Maximum Likelihood From Incomplete Data Via the EM Algorithm, \emph{Journal of the Royal Statistical Society, Series B}, \bold{39(1)}, 1--38. Young, D. S., Chen, X., Hewage, D., and Nilo-Poyanco, R. (2019) Finite Mixture-of-Gamma Distributions: Estimation, Inference, and Model-Based Clustering, \emph{Advances in Data Analysis and Classification}, \bold{13(4)}, 1053--1082. } \examples{ ##Analyzing a 3-component mixture of gammas. set.seed(100) x <- c(rgamma(200, shape = 0.2, scale = 14), rgamma(200, shape = 32, scale = 10), rgamma(200, shape = 5, scale = 6)) out <- gammamixEM(x, lambda = c(1, 1, 1)/3, verb = TRUE) out[2:4] } \keyword{file} mixtools/man/makemultdata.Rd0000755000175100001440000000521514342153463015674 0ustar hornikusers\name{makemultdata} \title{Produce Cutpoint Multinomial Data} \alias{makemultdata} \usage{ makemultdata(..., cuts) } \description{ Change data into a matrix of multinomial counts using the cutpoint method and generate EM algorithm starting values for a k-component mixture of multinomials. } \arguments{ \item{...}{Either vectors (possibly of different lengths) of raw data or an nxm matrix (or data frame) of data. If \code{...} are vectors of varying length, then \code{makemultdata} will create a matrix of size nxm where n is the sample size and m is the length of the vector with maximum length. Those vectors with length less than m will have \code{NA}s to make the corresponding row in the matrix of length m. If \code{...} is a matrix (or data frame), then the rows must correspond to the sample and the columns the repeated measures.} \item{cuts}{A vector of cutpoints. This vector is sorted by the algorithm.} } \value{ \code{makemultdata} returns an object which is a list with components: \item{x}{An nxm matrix of the raw data.} \item{y}{An nxp matrix of the discretized data where p is one more than the number of cutpoints. Each row is a multinomial vector of counts. In particular, each row should sum to the number of repeated measures for that sample.} } \details{ The (i, j)th entry of the matrix \code{y} (for j < p) is equal to the number of entries in the ith column of \code{x} that are less than or equal to \code{cuts}[j]. The (i, p)th entry is equal to the number of entries greater than \code{cuts}[j]. } \seealso{ \code{\link{compCDF}}, \code{\link{multmixmodel.sel}}, \code{\link{multmixEM}} } \references{ Elmore, R. T., Hettmansperger, T. P. and Xuan, F. (2004) The Sign Statistic, One-Way Layouts and Mixture Models, \emph{Statistical Science} \bold{19(4)}, 579--587. } \examples{ ## Randomly generated data. set.seed(100) y <- matrix(rpois(70, 6), 10, 7) cuts <- c(2, 5, 7) out1 <- makemultdata(y, cuts = cuts) out1 ## The sulfur content of the coal seams in Texas. A <- c(1.51, 1.92, 1.08, 2.04, 2.14, 1.76, 1.17) B <- c(1.69, 0.64, .9, 1.41, 1.01, .84, 1.28, 1.59) C <- c(1.56, 1.22, 1.32, 1.39, 1.33, 1.54, 1.04, 2.25, 1.49) D <- c(1.3, .75, 1.26, .69, .62, .9, 1.2, .32) E <- c(.73, .8, .9, 1.24, .82, .72, .57, 1.18, .54, 1.3) out2 <- makemultdata(A, B, C, D, E, cuts = median(c(A, B, C, D, E))) out2 ## The reaction time data. data(RTdata) out3 <- makemultdata(RTdata, cuts = 100*c(5, 10, 12, 14, 16, 20, 25, 30, 40, 50)) dim(out3$y) out3$y[1:10,] } \keyword{file} mixtools/man/summary.mvnpEM.Rd0000755000175100001440000000446314762771704016137 0ustar hornikusers\name{summary.mvnpEM} \alias{summary.mvnpEM} \alias{print.summary.mvnpEM} \title{Summarizing Fits for Nonparametric Mixture Models with Conditionally Independent Multivariate Component Densities} \usage{ \method{summary}{mvnpEM}(object, \dots) \method{print}{summary.mvnpEM}(x, digits=3, \dots) } \arguments{ \item{object,x}{an object of class \code{mvnpEM} such as a result of a call to \code{\link{mvnpEM}}} \item{digits}{Significant digits for printing values} \item{\dots}{further arguments passed to or from other methods.} } \description{ \code{\link[base]{summary}} method for class \code{mvnpEM}. } \details{ \code{\link{summary.mvnpEM}} prints means and variances of each block for each component. These quantities might not be part of the model, but they are estimated nonparametrically based on the posterior probabilities and the data. } \value{ The function \code{\link{summary.mvnpEM}} returns a list of type \code{summary.mvnpEM} with the following components: \item{n}{The number of observations} \item{m}{The number of mixture components} \item{B}{The number of blocks} \item{blockid}{The block ID (from 1 through B) for each of the coordinates of the multivariate observations. The \code{blockid} component is of length \eqn{r}, the dimension of each observation.} \item{means}{A \eqn{B\times m}{B x m} matrix giving the estimated mean of each block in each component.} \item{variances}{Same as \code{means} but giving the estimated variances instead.} } \references{ Benaglia, T., Chauveau, D., and Hunter, D. R. (2009), An EM-like algorithm for semi- and non-parametric estimation in multivariate mixtures, \emph{Journal of Computational and Graphical Statistics}, \bold{18(2)}, 505--526. Chauveau, D., and Hoang, V. T. L. (2015), Nonparametric mixture models with conditionally independent multivariate component densities, Preprint under revision. \url{https://hal.science/hal-01094837} } \seealso{ \code{\link{mvnpEM}}, \code{\link{plot.mvnpEM}} } \examples{ # Example as in Chauveau and Hoang (2015) with 6 coordinates \dontrun{ m=2; r=6; blockid <-c(1,1,2,2,3,3) # 3 bivariate blocks # generate some data x ... a <- mvnpEM(x, mu0=2, blockid, samebw=F) # adaptive bandwidth plot(a) # this S3 method produces 6 plots of univariate marginals summary(a)} } \keyword{file} mixtools/man/compCDF.Rd0000755000175100001440000000447514342153463014505 0ustar hornikusers\name{compCDF} \title{Plot the Component CDF} \alias{compCDF} \usage{ compCDF(data, weights, x=seq(min(data, na.rm=TRUE), max(data, na.rm=TRUE), len=250), comp=1:NCOL(weights), makeplot=TRUE, ...) } \description{ Plot the components' CDF via the posterior probabilities. } \arguments{ \item{data}{A matrix containing the raw data. Rows are subjects and columns are repeated measurements.} \item{weights}{The weights to compute the empirical CDF; however, most of time they are the posterior probabilities.} \item{x}{The points at which the CDFs are to be evaluated.} \item{comp}{The mixture components for which CDFs are desired.} \item{makeplot}{Logical: Should a plot be produced as a side effect?} \item{...}{Additional arguments (other than \code{lty} and \code{type}, which are already used) to be passed directly to \code{plot} and \code{lines} functions.} } \value{ A matrix with \code{length(comp)} rows and \code{length(x)} columns in which each row gives the CDF evaluated at each point of \code{x}. } \details{ When \code{makeplot} is \code{TRUE}, a line plot is produced of the CDFs evaluated at \code{x}. The plot is not a step function plot; the points \eqn{(x, CDF(x))} are simply joined by line segments. } \references{ McLachlan, G. J. and Peel, D. (2000) \emph{Finite Mixture Models}, John Wiley and Sons, Inc. Elmore, R. T., Hettmansperger, T. P. and Xuan, F. (2004) The Sign Statistic, One-Way Layouts and Mixture Models, \emph{Statistical Science} \bold{19(4)}, 579--587. } \seealso{ \code{\link{makemultdata}}, \code{\link{multmixmodel.sel}}, \code{\link{multmixEM}}. } \examples{ ## The sulfur content of the coal seams in Texas set.seed(100) A <- c(1.51, 1.92, 1.08, 2.04, 2.14, 1.76, 1.17) B <- c(1.69, 0.64, .9, 1.41, 1.01, .84, 1.28, 1.59) C <- c(1.56, 1.22, 1.32, 1.39, 1.33, 1.54, 1.04, 2.25, 1.49) D <- c(1.3, .75, 1.26, .69, .62, .9, 1.2, .32) E <- c(.73, .8, .9, 1.24, .82, .72, .57, 1.18, .54, 1.3) dis.coal <- makemultdata(A, B, C, D, E, cuts = median(c(A, B, C, D, E))) temp <- multmixEM(dis.coal) ## Now plot the components' CDF via the posterior probabilities compCDF(dis.coal$x, temp$posterior, xlab="Sulfur", ylab="", main="empirical CDFs") } \keyword{file} mixtools/man/plotly_weibullRMM.Rd0000644000175100001440000000632414343144365016646 0ustar hornikusers\name{plotly_weibullRMM} \alias{plotly_weibullRMM} %- Also NEED an '\alias' for EACH other topic documented here. \title{Plot sequences from the Stochastic EM algorithm for mixture of Weibull using \code{plotly} } \description{This is an updated version of \code{plotweibullRMM} function by using \code{plotly} function. For technical details, please refer to \code{\link{plotweibullRMM}}. } \usage{ plotly_weibullRMM(a, title=NULL, rowstyle=TRUE, subtitle=NULL, width = 3 , col = NULL , title.size = 15 , title.x = 0.5 , title.y = 0.95, xlab = "Iterations" , xlab.size = 15 , xtick.size = 15, ylab = "Estimates" , ylab.size = 15 , ytick.size = 15, legend.size = 15) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{a}{An object returned by \code{\link{weibullRMM_SEM}}.} \item{title}{The title of the plot, set to some default value if \code{NULL}.} \item{rowstyle}{Window organization, for plots in rows (the default) or columns.} \item{subtitle}{A subtitle for the plot, set to some default value if \code{NULL}.} \item{width}{Line width.} \item{col}{Color of lines. Number of colors specified needs to be consistent with number of components.} \item{title.size}{Size of the main title.} \item{title.x}{Horsizontal position of the main title.} \item{title.y}{Vertical posotion of the main title.} \item{xlab}{Label of X-axis.} \item{xlab.size}{Size of the lable of X-axis.} \item{xtick.size}{Size of tick lables of X-axis.} \item{ylab}{Label of Y-axis.} \item{ylab.size}{Size of the lable of Y-axis.} \item{ytick.size}{Size of tick lables of Y-axis.} \item{legend.size}{Size of legend.} } \value{The plot returned.} \seealso{ Related functions: \code{\link{weibullRMM_SEM}}, \code{\link{summary.mixEM}}, \code{\link{plotweibullRMM}}. Other models and algorithms for censored lifetime data (name convention is model_algorithm): \code{\link{expRMM_EM}}, \code{\link{spRMM_SEM}} . } \references{ \itemize{ \item Bordes, L., and Chauveau, D. (2016), Stochastic EM algorithms for parametric and semiparametric mixture models for right-censored lifetime data, Computational Statistics, Volume 31, Issue 4, pages 1513-1538. \url{https://link.springer.com/article/10.1007/s00180-016-0661-7} } } \author{Didier Chauveau} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ n = 500 # sample size m = 2 # nb components lambda=c(0.4, 0.6) shape <- c(0.5,5); scale <- c(1,20) # model parameters set.seed(321) x <- rweibullmix(n, lambda, shape, scale) # iid ~ weibull mixture cs=runif(n,0,max(x)+10) # iid censoring times t <- apply(cbind(x,cs),1,min) # censored observations d <- 1*(x <= cs) # censoring indicator ## set arbitrary or "reasonable" (e.g., data-driven) initial values l0 <- rep(1/m,m); sh0 <- c(1, 2); sc0 <- c(2,10) # Stochastic EM algorithm a <- weibullRMM_SEM(t, d, lambda = l0, shape = sh0, scale = sc0, maxit = 200) summary(a) # Parameters estimates etc plotly_weibullRMM(a , legend.size = 20) # plot of St-EM sequences %%\dontrun{ %%} } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{file} mixtools/man/ellipse.Rd0000755000175100001440000000274114342153463014661 0ustar hornikusers\name{ellipse} \title{Draw Two-Dimensional Ellipse Based on Mean and Covariance} \alias{ellipse} \usage{ ellipse(mu, sigma, alpha = .05, npoints = 250, newplot = FALSE, draw = TRUE, ...) } \description{ Draw a two-dimensional ellipse that traces a bivariate normal density contour for a given mean vector, covariance matrix, and probability content. } \arguments{ \item{mu}{A 2-vector giving the mean.} \item{sigma}{A 2x2 matrix giving the covariance matrix.} \item{alpha}{Probability to be excluded from the ellipse. The default value is alpha = .05, which results in a 95\% ellipse.} \item{npoints}{Number of points comprising the border of the ellipse.} \item{newplot}{If newplot = TRUE and draw = TRUE, plot the ellipse on a new plot. If newplot = FALSE and draw = TRUE, add the ellipse to an existing plot.} \item{draw}{If TRUE, draw the ellipse.} \item{...}{Graphical parameters passed to \code{lines} or \code{plot} command.} } \value{ \code{ellipse} returns an \code{npoints}x2 matrix of the points forming the border of the ellipse. } \references{ Johnson, R. A. and Wichern, D. W. (2002) \emph{Applied Multivariate Statistical Analysis, Fifth Edition}, Prentice Hall. } \seealso{ \code{\link{regcr}} } \examples{ ## Produce a 95\% ellipse with the specified mean and covariance structure. mu <- c(1, 3) sigma <- matrix(c(1, .3, .3, 1.5), 2, 2) ellipse(mu, sigma, npoints = 200, newplot = TRUE) } \keyword{file} mixtools/man/plot.spEMN01.Rd0000755000175100001440000000250014342153463015315 0ustar hornikusers\name{plot.spEMN01} \alias{plot.spEMN01} \title{Plot mixture pdf for the semiparametric mixture model output by spEMsymlocN01} \description{Plot mixture density for the semiparametric mixture model output by spEMsymlocN01, with one component known and set to normal(0,1), and a symmetric nonparametric density with location parameter.} \usage{ \method{plot}{spEMN01}(x, bw = x$bandwidth, knownpdf = dnorm, add.plot = FALSE, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{An object of class "spEMN01" as returned by spEMsymlocN01} \item{bw}{Bandwidth for weighted kernel density estimation.} \item{knownpdf}{The known density of component 1, default to \code{dnorm}.} \item{add.plot}{Set to TRUE to add to an existing plot.} \item{...}{further arguments passed to \code{plot} if \code{add.plot = FALSE}, and to \code{lines} if \code{add.plot = TRUE}.} } \value{A plot of the density of the mixture} \references{ \itemize{ \item Chauveau, D., Saby, N., Orton, T. G., Lemercier B., Walter, C. and Arrouys, D. Large-scale simultaneous hypothesis testing in soil monitoring: A semi-parametric mixture approach, preprint (2013). } } \author{Didier Chauveau} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{spEMsymlocN01}}} % \keyword{file}mixtools/man/npEM.Rd0000755000175100001440000001361014342153463014060 0ustar hornikusers\name{npEM} \title{Nonparametric EM-like Algorithm for Mixtures of Independent Repeated Measurements} \alias{npEM} \alias{npEMindrep} \alias{npEMindrepbw} \usage{ npEM(x, mu0, blockid = 1:ncol(x), bw = bw.nrd0(as.vector(as.matrix(x))), samebw = TRUE, h = bw, eps = 1e-8, maxiter = 500, stochastic = FALSE, verb = TRUE) } \description{ Returns nonparametric EM algorithm output (Benaglia et al, 2009) for mixtures of multivariate (repeated measures) data where the coordinates of a row (case) in the data matrix are assumed to be independent, conditional on the mixture component (subpopulation) from which they are drawn. } \arguments{ \item{x}{An \eqn{n\times r}{n x r} matrix of data. Each of the \eqn{n} rows is a case, and each case has \eqn{r} repeated measurements. These measurements are assumed to be conditionally independent, conditional on the mixture component (subpopulation) from which the case is drawn.} \item{mu0}{Either an \eqn{m\times r}{m x r} matrix specifying the initial centers for the \link{kmeans} function, or an integer \eqn{m} specifying the number of initial centers, which are then choosen randomly in \link{kmeans}} \item{blockid}{A vector of length \eqn{r} identifying coordinates (columns of \code{x}) that are assumed to be identically distributed (i.e., in the same block). For instance, the default has all distinct elements, indicating that no two coordinates are assumed identically distributed and thus a separate set of \eqn{m} density estimates is produced for each column of \eqn{x}. On the other hand, if \code{blockid=rep(1,ncol(x))}, then the coordinates in each row are assumed conditionally i.i.d.} \item{bw}{Bandwidth for density estimation, equal to the standard deviation of the kernel density. By default, a simplistic application of the default \code{\link{bw.nrd0}} bandwidth used by \code{\link{density}} to the entire dataset.} \item{samebw}{Logical: If \code{TRUE}, use the same bandwidth for each iteration and for each component and block. If \code{FALSE}, use a separate bandwidth for each component and block, and update this bandwidth at each iteration of the algorithm using a suitably modified \code{\link{bw.nrd0}} method as described in Benaglia et al (2011).} \item{h}{Alternative way to specify the bandwidth, to provide backward compatibility.} \item{eps}{Tolerance limit for declaring algorithm convergence. Convergence is declared whenever the maximum change in any coordinate of the \code{lambda} vector (of mixing proportion estimates) does not exceed \code{eps}.} \item{maxiter}{The maximum number of iterations allowed, for both stochastic and non-stochastic versions; for non-stochastic algorithms (\code{stochastic = FALSE}), convergence may be declared before \code{maxiter} iterations (see \code{eps} above).} \item{stochastic}{Flag, if FALSE (the default), runs the non-stochastic version of the npEM algorithm, as in Benaglia et al (2009). Set to TRUE to run a stochastic version which simulates the posteriors at each iteration, and runs for \code{maxiter} iterations.} \item{verb}{If TRUE, print updates for every iteration of the algorithm as it runs} } \value{ \code{npEM} returns a list of class \code{npEM} with the following items: \item{data}{The raw data (an \eqn{n\times r}{n x r} matrix).} \item{posteriors}{An \eqn{n\times m}{n x m} matrix of posterior probabilities for observation. If \code{stochastic = TRUE}, this matrix is computed from an average over the \code{maxiter} iterations.} \item{bandwidth}{If \code{samebw==TRUE}, same as the \code{bw} input argument; otherwise, value of \code{bw} matrix at final iteration. This information is needed by any method that produces density estimates from the output.} \item{blockid}{Same as the \code{blockid} input argument, but recoded to have positive integer values. Also needed by any method that produces density estimates from the output.} \item{lambda}{The sequence of mixing proportions over iterations.} \item{lambdahat}{The final mixing proportions if \code{stochastic = FALSE}, or the average mixing proportions if \code{stochastic = TRUE}.} \item{loglik}{The sequence of log-likelihoods over iterations.} } \seealso{ \code{\link{plot.npEM}}, \code{\link{normmixrm.sim}}, \code{\link{spEMsymloc}}, \code{\link{spEM}}, \code{\link{plotseq.npEM}} } \references{ \itemize{ \item Benaglia, T., Chauveau, D., and Hunter, D. R. (2009), An EM-like algorithm for semi- and non-parametric estimation in multivariate mixtures, Journal of Computational and Graphical Statistics, 18, 505-526. \item Benaglia, T., Chauveau, D., Hunter, D. R., and Young, D. (2009), mixtools: An R package for analyzing finite mixture models. Journal of Statistical Software, 32(6):1-29. \item Benaglia, T., Chauveau, D. and Hunter, D.R. (2011), Bandwidth Selection in an EM-like algorithm for nonparametric multivariate mixtures. Nonparametric Statistics and Mixture Models: A Festschrift in Honor of Thomas P. Hettmansperger. World Scientific Publishing Co., pages 15-27. \item Bordes, L., Chauveau, D., and Vandekerkhove, P. (2007), An EM algorithm for a semiparametric mixture model, Computational Statistics and Data Analysis, 51: 5429-5443. } } \examples{ ## Examine and plot water-level task data set. ## First, try a 3-component solution where no two coordinates are ## assumed i.d. data(Waterdata) set.seed(100) \dontrun{ a <- npEM(Waterdata[,3:10], mu0=3, bw=4) # Assume indep but not iid plot(a) # This produces 8 plots, one for each coordinate } ## Next, same thing but pairing clock angles that are directly opposite one ## another (1:00 with 7:00, 2:00 with 8:00, etc.) \dontrun{ b <- npEM(Waterdata[,3:10], mu0=3, blockid=c(4,3,2,1,3,4,1,2), bw=4) # iid in pairs plot(b) # Now only 4 plots, one for each block } } \keyword{file} mixtools/man/plotexpRMM.Rd0000644000175100001440000000467114343144304015267 0ustar hornikusers\name{plotexpRMM} \alias{plotexpRMM} %- Also NEED an '\alias' for EACH other topic documented here. \title{Plot sequences from the EM algorithm for censored mixture of exponentials } \description{Function for plotting sequences of estimates along iterations, from an object returned by the \code{\link{expRMM_EM}}, an EM algorithm for mixture of exponential distributions with randomly right censored data (see reference below). } \usage{ plotexpRMM(a, title=NULL, rowstyle=TRUE, subtitle=NULL, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{a}{An object returned by \code{\link{expRMM_EM}}.} \item{title}{The title of the plot, set to some default value if \code{NULL}.} \item{rowstyle}{Window organization, for plots in rows (the default) or columns.} \item{subtitle}{A subtitle for the plot, set to some default value if \code{NULL}.} \item{...}{Other parameters (such as \code{lwd}) passed to \code{plot}, \code{lines}, and \code{legend} commands.} } \value{The plot returned} \seealso{ Related functions: \code{\link{expRMM_EM}}, \code{\link{summary.mixEM}}, \code{\link{plot.mixEM}}. Other models and algorithms for censored lifetime data (name convention is model_algorithm): \code{\link{weibullRMM_SEM}}, \code{\link{spRMM_SEM}}. } \references{ \itemize{ \item Bordes, L., and Chauveau, D. (2016), Stochastic EM algorithms for parametric and semiparametric mixture models for right-censored lifetime data, Computational Statistics, Volume 31, Issue 4, pages 1513-1538. \url{https://link.springer.com/article/10.1007/s00180-016-0661-7} } } \author{Didier Chauveau} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ n=300 # sample size m=2 # number of mixture components lambda <- c(1/3,1-1/3); rate <- c(1,1/10) # mixture parameters set.seed(1234) x <- rexpmix(n, lambda, rate) # iid ~ exponential mixture cs=runif(n,0,max(x)) # Censoring (uniform) and incomplete data t <- apply(cbind(x,cs),1,min) # observed or censored data d <- 1*(x <= cs) # censoring indicator ###### EM for RMM, exponential lifetimes l0 <- rep(1/m,m); r0 <- c(1, 0.5) # "arbitrary" initial values a <- expRMM_EM(t, d, lambda=l0, rate=r0, k = m) summary(a) # EM estimates etc plotexpRMM(a, lwd=2) # plot of EM sequences %%\dontrun{ %%} } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{file} mixtools/man/plotly_FDR.Rd0000644000175100001440000000747214342375644015254 0ustar hornikusers\name{plotly_FDR} \alias{plotly_FDR} \title{Plot False Discovery Rate (FDR) estimates from output by EM-like strategies using \code{plotly}} \description{This is an updated version of \code{plotFDR}. For more technical details, please refer to \code{plotFDR}.} \usage{ plotly_FDR(post1, post2=NULL, lg1="FDR 1", lg2=NULL, compH0=1, alpha=0.1, complete.data =NULL, pctfdr=0.3, col = NULL, width = 3 , title = NULL , title.size = 15 , title.x = 0.5 , title.y = 0.95, xlab = "Index" , xlab.size = 15 , xtick.size = 15, ylab = "Probability" , ylab.size = 15 , ytick.size = 15, legend.text = "" , legend.text.size = 15 , legend.size = 15) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{post1}{The matrix of posterior probabilities from objects such as the output from \code{\link{spEMsymlocN01}}. The rows need to be sorted by increasing pvalues.} \item{post2}{A second object like \code{post1} if comparison is desired, also sorted by increasing pvalues.} \item{lg1}{Text describing the FDR estimate in \code{post1}.} \item{lg2}{Text describing the FDR estimate in \code{post2} if provided.} \item{compH0}{The component indicator associated to the null hypothesis H0, normally 1 since it is defined in this way in \code{\link{spEMsymlocN01}}, but in case of label switching in other algorithms it can be set to \code{2}.} \item{alpha}{The target FDR level; the index at which the FDR estimate crosses the horizontal line for level \code{alpha} gives the maximum number of cases to reject.} \item{complete.data}{An array with \eqn{n} lines and 2 columns, with the component indicator in column 1 and the p-values in column 2, sorted by p-values.} \item{pctfdr}{The level up to which the FDR is plotted, i.e. the scale of the vertical axis.} \item{col}{Color of traces.} \item{width}{Width of traces.} \item{title}{Text of the main title.} \item{title.size}{Size of the main title.} \item{title.x}{Horsizontal position of the main title.} \item{title.y}{Vertical posotion of the main title.} \item{xlab}{Label of X-axis.} \item{xlab.size}{Size of the lable of X-axis.} \item{xtick.size}{Size of tick lables of X-axis.} \item{ylab}{Label of Y-axis.} \item{ylab.size}{Size of the lable of Y-axis.} \item{ytick.size}{Size of tick lables of Y-axis.} \item{legend.text}{Title of legend.} \item{legend.text.size}{Size of the legend title.} \item{legend.size}{Size of legend.} } \value{A plot of one or two FDR estimates, with the true FDR if available} \references{ \itemize{ \item Chauveau, D., Saby, N., Orton, T. G., Lemercier B., Walter, C. and Arrouys, D. Large-scale simultaneous hypothesis testing in monitoring carbon content from French soil database -- A semi-parametric mixture approach, Geoderma 219-220 (2014), 117-124. } } \author{Didier Chauveau} \seealso{ \code{\link{spEMsymlocN01}}, \code{\link{plotFDR}}} \examples{ ## Probit transform of p-values ## from a Beta-Uniform mixture model ## comparion of parametric and semiparametric EM fit ## Note: in actual situations n=thousands set.seed(50) n=300 # nb of multiple tests m=2 # 2 mixture components a=c(1,0.1); b=c(1,1); lambda=c(0.6,0.4) # parameters z=sample(1:m, n, rep=TRUE, prob = lambda) p <- rbeta(n, shape1 = a[z], shape2 = b[z]) # p-values o <- order(p) cpd <- cbind(z,p)[o,] # sorted complete data, z=1 if H0, 2 if H1 p <- cpd[,2] # sorted p-values y <- qnorm(p) # probit transform of the pvalues # gaussian EM fit with component 1 constrained to N(0,1) s1 <- normalmixEM(y, mu=c(0,-4), mean.constr = c(0,NA), sd.constr = c(1,NA)) s2 <- spEMsymlocN01(y, mu0 = c(0,-3)) # spEM with N(0,1) fit plotly_FDR(s1$post, s2$post, lg1 = "normalmixEM", lg2 = "spEMsymlocN01", complete.data = cpd) # with true FDR computed from z } % \keyword{file}mixtools/man/spEM.Rd0000755000175100001440000001464214342153463014073 0ustar hornikusers\name{spEM} \title{Semiparametric EM-like Algorithm for Mixtures of Independent Repeated Measurements} \alias{spEM} \usage{ spEM(x, mu0, blockid = 1:ncol(x), bw = bw.nrd0(as.vector(as.matrix(x))), constbw = TRUE, h = bw, eps = 1e-8, maxiter = 500, stochastic = FALSE, verb = TRUE) } \description{ Returns semiparametric EM algorithm output (Benaglia et al, 2009) for mixtures of multivariate (repeated measures) data where the coordinates of a row (case) in the data matrix are assumed to be independent, conditional on the mixture component (subpopulation) from which they are drawn. For now, this algorithm only implements model (4.7) in Benaglia et al, in which each component and block has exactly the same (nonparametric) shape and they differ only by location and scale. } \arguments{ \item{x}{An \eqn{n\times r}{n x r} matrix of data. Each of the \eqn{n} rows is a case, and each case has \eqn{r} repeated measurements. These measurements are assumed to be conditionally independent, conditional on the mixture component (subpopulation) from which the case is drawn.} \item{mu0}{Either an \eqn{m\times r}{m x r} matrix specifying the initial centers for the \link{kmeans} function, or an integer \eqn{m} specifying the number of initial centers, which are then choosen randomly in \link{kmeans}} \item{blockid}{A vector of length \eqn{r} identifying coordinates (columns of \code{x}) that are assumed to be identically distributed (i.e., in the same block). For instance, the default has all distinct elements, indicating that no two coordinates are assumed identically distributed and thus a separate set of \eqn{m} density estimates is produced for each column of \eqn{x}. On the other hand, if \code{blockid=rep(1,ncol(x))}, then the coordinates in each row are assumed conditionally i.i.d.} \item{bw}{Bandwidth for density estimation, equal to the standard deviation of the kernel density. By default, a simplistic application of the default \code{\link{bw.nrd0}} bandwidth used by \code{\link{density}} to the entire dataset.} \item{constbw}{Logical: If \code{TRUE}, use the same bandwidth for each iteration and for each component and block. If \code{FALSE}, use a separate bandwidth for each component and block, and update this bandwidth at each iteration of the algorithm using a suitably modified \code{\link{bw.nrd0}} method as described in Benaglia et al (2011).} \item{h}{Alternative way to specify the bandwidth, to provide backward compatibility.} \item{eps}{Tolerance limit for declaring algorithm convergence. Convergence is declared whenever the maximum change in any coordinate of the \code{lambda} vector (of mixing proportion estimates) does not exceed \code{eps}.} \item{maxiter}{The maximum number of iterations allowed, for both stochastic and non-stochastic versions; for non-stochastic algorithms (\code{stochastic = FALSE}), convergence may be declared before \code{maxiter} iterations (see \code{eps} above).} \item{stochastic}{Flag, if FALSE (the default), runs the non-stochastic version of the npEM algorithm, as in Benaglia et al (2009). Set to TRUE to run a stochastic version which simulates the posteriors at each iteration, and runs for \code{maxiter} iterations.} \item{verb}{If TRUE, print updates for every iteration of the algorithm as it runs} } \value{ \code{spEM} returns a list of class \code{spEM} with the following items: \item{data}{The raw data (an \eqn{n\times r}{n x r} matrix).} \item{posteriors}{An \eqn{n\times m}{n x m} matrix of posterior probabilities for observation. If \code{stochastic = TRUE}, this matrix is computed from an average over the \code{maxiter} iterations.} \item{bandwidth}{If \code{constbw==TRUE}, same as the \code{bw} input argument; otherwise, value of \code{bw} matrix at final iteration (since for now this algorithm only implements model (4.7) in Benaglia et al, the bandwidth matrix is reduced to a single bandwith scalar). This information is needed by any method that produces density estimates from the output.} \item{blockid}{Same as the \code{blockid} input argument, but recoded to have positive integer values. Also needed by any method that produces density estimates from the output.} \item{lambda}{The sequence of mixing proportions over iterations.} \item{lambdahat}{The final mixing proportions if \code{stochastic = FALSE}, or the average mixing proportions if \code{stochastic = TRUE}.} \item{mu}{The sequence of location parameters over iterations.} \item{muhat}{The final location parameters if \code{stochastic = FALSE}, or the average location parameters if \code{stochastic = TRUE}.} \item{sigma}{The sequence of scale parameters over iterations.} \item{sigmahat}{The final scale parameters if \code{stochastic = FALSE}, or the average scale parameters if \code{stochastic = TRUE}.} \item{loglik}{The sequence of log-likelihoods over iterations.} } \seealso{ \code{\link{plot.spEM}}, \code{\link{normmixrm.sim}}, \code{\link{spEMsymloc}}, \code{\link{npEM}}, \code{\link{plotseq.npEM}} } \references{ \itemize{ \item Benaglia, T., Chauveau, D., and Hunter, D. R., An EM-like algorithm for semi- and non-parametric estimation in multivariate mixtures, Journal of Computational and Graphical Statistics, 18, 505-526, 2009. \item Benaglia, T., Chauveau, D. and Hunter, D.R. Bandwidth Selection in an EM-like algorithm for nonparametric multivariate mixtures. Nonparametric Statistics and Mixture Models: A Festschrift in Honor of Thomas P. Hettmansperger. World Scientific Publishing Co., pages 15-27, 2011. \item Bordes, L., Chauveau, D., and Vandekerkhove, P., An EM algorithm for a semiparametric mixture model, Computational Statistics and Data Analysis, 51: 5429-5443, 2007. } } \examples{\dontrun{ ## simulate a 2-component gaussian mixture with 3 iid repeated measures set.seed(100) mu <- matrix(c(0, 15), 2, 3) sigma <- matrix(c(1, 5), 2, 3) x <- rmvnormmix(300, lambda = c(.4,.6), mu = mu, sigma = sigma) ## apply spEM with or without an iterative bandwidth selection d <- spEM(x, mu0 = 2, blockid = rep(1,3), constbw = FALSE) d2 <- spEM(x, mu0 = 2, blockid = rep(1,3), constbw = TRUE) plot(d, xlim=c(-10, 40), ylim = c(0, .16), xlab = "", breaks = 30, cex.lab=1.5, cex.axis=1.5, addlegend=FALSE) plot(d2, newplot=FALSE, addlegend=FALSE, lty=2)} } \keyword{file} mixtools/man/summary.spRMM.Rd0000644000175100001440000000317514343144454015716 0ustar hornikusers\name{summary.spRMM} \alias{summary.spRMM} \title{Summarizing fits from Stochastic EM algorithm for semiparametric scaled mixture of censored data} \usage{ \method{summary}{spRMM}(object, digits = 6, ...) } \arguments{ \item{object}{an object of class \code{spRMM} such as a result of a call to \code{\link{spRMM_SEM}}} \item{digits}{Significant digits for printing values} \item{...}{Additional parameters passed to \code{print}.} } \description{ \code{\link[base]{summary}} method for class \code{spRMM}. } \details{ \code{\link{summary.spRMM}} prints scalar parameter estimates for a fitted mixture model: each component weight and the scaling factor, see reference below. The functional (nonparametric) estimates of survival and hazard rate funcions can be obtained using \code{\link{plotspRMM}}. } \value{ The function \code{\link{summary.spRMM}} prints the final loglikelihood value at the solution as well as The estimated mixing weights and the scaling parameter. } \seealso{ Function for plotting functional (nonparametric) estimates: \code{\link{plotspRMM}}. Other models and algorithms for censored lifetime data (name convention is model_algorithm): \code{\link{expRMM_EM}}, \code{\link{weibullRMM_SEM}}. } \references{ \itemize{ \item Bordes, L., and Chauveau, D. (2016), Stochastic EM algorithms for parametric and semiparametric mixture models for right-censored lifetime data, Computational Statistics, Volume 31, Issue 4, pages 1513-1538. \url{https://link.springer.com/article/10.1007/s00180-016-0661-7} } } \author{Didier Chauveau} \examples{ # See example(spRMM_SEM) } \keyword{file} mixtools/man/rmvnormmix.Rd0000755000175100001440000000450114342153463015436 0ustar hornikusers\name{rmvnormmix} \title{Simulate from Multivariate (repeated measures) Mixtures of Normals} \alias{normmixrm.sim} \alias{rmvnormmix} \usage{ rmvnormmix(n, lambda=1, mu=0, sigma=1) } \description{ Simulate from a mixture of multivariate zero-correlation normal distributions } \arguments{ \item{n}{Number of cases to simulate.} \item{lambda}{Vector of mixture probabilities with length equal to \eqn{m}, the desired number of components. This is assumed to sum to 1; if not, it is normalized.} \item{mu}{Matrix of means of dimensions \eqn{m\times r}{m x r}, where \eqn{m} is the number of components (subpopulations) and \eqn{r} is the number of coordinates (repeated measurements) per case. Note: \code{mu} is automatically coerced to a matrix with \eqn{m} rows even if it is not given in this form, which can lead to unexpected behavior in some cases.} \item{sigma}{Matrix of standard deviations, same dimensions as \code{mu}. The coordinates within a case are independent, conditional on the mixture component. (There is marginal correlation among the coordinates, but this is due to the mixture structure only.) Note: \code{sigma} is automatically coerced to a matrix with \eqn{m} rows even if it is not given in this form, which can lead to unexpected behavior in some cases.} } \details{ It is possible to generate univariate standard normal random variables using the default values (but why bother?). The case of conditionally iid coordinates is covered by the situation in which all columns in mu and sigma are identical. } \value{ \code{rmvnormmix} returns an \eqn{n\times r}{n x r} matrix in which each row is a sample from one of the components of a mixture of zero-correlation multivariate normals. The mixture structure induces nonzero correlations among the coordinates. } \seealso{ \code{\link{rnormmix}} } \examples{ ##Generate data from a 2-component mixture of trivariate normals. set.seed(100) n <- 200 lambda <- rep(1, 2)/2 mu <- matrix(2*(1:6), 2, 3) sigma <- matrix(1,2,3) mydata<-rmvnormmix(n, lambda, mu, sigma) ## Now check to see if we can estimate mixture densities well: title <- paste("Does this resemble N(", mu[1,], ",1) and N(", mu[2,],",1)?", sep="") plot(npEM(mydata, 2), title=title) } \keyword{file} mixtools/man/rexpmix.Rd0000644000175100001440000000216314342153463014713 0ustar hornikusers\name{rexpmix} \title{Simulate from Mixtures of Exponentials} \alias{rexpmix} \usage{ rexpmix(n, lambda = 1, rate = 1) } \description{ Simulate from a mixture of univariate exponential distributions. } \arguments{ \item{n}{Number of cases to simulate.} \item{lambda}{Vector of mixture probabilities, with length equal to \eqn{m}, the desired number of components (subpopulations). This is assumed to sum to 1.} \item{rate}{Vector of component rates.} } \value{ \code{rexpmix} returns an \eqn{n}-vector sampled from an \eqn{m}-component mixture of univariate exponential distributions. } %%\details{This function simply calls \code{\link{sample}} and \code{\link{rexp}}.} \seealso{ \code{\link{rnormmix}}, \code{\link{rmvnormmix}} for Gaussian mixtures, \code{\link{rweibullmix}} for mixture of Weibull distributions. } \examples{ ## Generate data from a 2-component mixture of exponentials. n=300 # sample size m=2 # nb components lambda=c(1/3, 2/3); rate = c(1,1/10) # parameters set.seed(1234) x <- rexpmix(n, lambda, rate) # iid ~ exp mixture ## histogram of the simulated data. hist(x, col=8) } \keyword{file} mixtools/man/normalmixMMlc.Rd0000755000175100001440000002060714762771625016020 0ustar hornikusers\name{normalmixMMlc} \title{EC-MM Algorithm for Mixtures of Univariate Normals with linear constraints} \alias{normalmixMMlc} \usage{ normalmixMMlc(x, lambda = NULL, mu = NULL, sigma = NULL, k = 2, mean.constr = NULL, mean.lincstr = NULL, mean.constant = NULL, var.lincstr = NULL, gparam = NULL, epsilon = 1e-08, maxit = 1000, maxrestarts=20, verb = FALSE) } \description{ Return EC-MM (see below) algorithm output for mixtures of normal distributions with linear constraints on the means and variances parameters, as in Chauveau and Hunter (2013). The linear constraint for the means is of the form \eqn{\mu = M \beta + C}, where \eqn{M} and \eqn{C} are matrix and vector specified as parameters. The linear constraints for the variances are actually specified on the inverse variances, by \eqn{\pi = A \gamma}, where \eqn{\pi} is the vector of inverse variances, and \eqn{A} is a matrix specified as a parameter (see below). } \details{ This is a specific "EC-MM" algorithm for normal mixtures with linear constraints on the means and variances parameters. EC-MM here means that this algorithm is similar to an ECM algorithm as in Meng and Rubin (1993), except that it uses conditional MM (Minorization-Maximization)-steps instead of simple M-steps. Conditional means that it alternates between maximizing with respect to the \code{mu} and \code{lambda} while holding \code{sigma} fixed, and maximizing with respect to \code{sigma} and \code{lambda} while holding \code{mu} fixed. This ECM generalization of EM is forced in the case of linear constraints because there is no closed-form EM algorithm. } \arguments{ \item{x}{A vector of length n consisting of the data.} \item{lambda}{Initial value of mixing proportions. Automatically repeated as necessary to produce a vector of length \code{k}, then normalized to sum to 1. If \code{NULL}, then \code{lambda} is random from a uniform Dirichlet distribution (i.e., its entries are uniform random and then it is normalized to sum to 1).} \item{mu}{Starting value of vector of component means. If non-NULL and a vector, \code{k} is set to \code{length(mu)}. If NULL, then the initial value is randomly generated from a normal distribution with center(s) determined by binning the data.} \item{sigma}{Starting value of vector of component standard deviations for algorithm. Obsolete for linear constraints on the inverse variances; use \code{gparam} instead to specify a starting value.} \item{k}{Number of components. Initial value ignored unless \code{mu} and \code{sigma} are both NULL.} \item{mean.constr}{First, simplest way to define equality constraints on the mean parameters, given as a vector of length \code{k}, as in \code{\link{normalmixEM}}. Each vector entry specifies the constraints, if any, on the corresponding mean parameter: If \code{NA}, the corresponding parameter is unconstrained. If numeric, the corresponding parameter is fixed at that value. If a character string consisting of a single character preceded by a coefficient, such as \code{"0.5a"} or \code{"-b"}, all parameters using the same single character in their constraints will fix these parameters equal to the coefficient times some the same free parameter. For instance, if \code{mean.constr = c(NA, 0, "a", "-a")}, then the first mean parameter is unconstrained, the second is fixed at zero, and the third and forth are constrained to be equal and opposite in sign. Note: if there are no linear constraints for the means, it is more efficient to use directly \code{\link{normalmixEM}}.} \item{mean.lincstr}{Matrix \eqn{M} \eqn{(k,p)} in the linear constraint for the means equation \eqn{\mu = M \beta + C}, with \eqn{p \le k}.} \item{mean.constant}{Vector of \eqn{k} constants \eqn{C} in the linear constraint for the means equation \eqn{\mu = M \beta + C}.} \item{var.lincstr}{Matrix \eqn{A} \eqn{(k,q)} in the linear constraint for the inverse variances equation \eqn{\pi = A \gamma}, with \eqn{q \le k}.} \item{gparam}{Vector of \eqn{q} starting values for the \eqn{\gamma} parameter in the linear constraint for the inverse variances; see \code{var.lincstr}. If NULL, a vector of randomly generated standard exponential variables is used.} \item{epsilon}{The convergence criterion. Convergence is declared when the change in the observed data log-likelihood increases by less than epsilon.} \item{maxit}{The maximum allowed number of iterations.} \item{maxrestarts}{The maximum number of restarts allowed in case of a problem with the particular starting values chosen due to one of the variance estimates getting too small (each restart uses randomly chosen starting values). It is well-known that when each component of a normal mixture may have its own mean and variance, the likelihood has no maximizer; in such cases, we hope to find a "nice" local maximum with this algorithm instead, but occasionally the algorithm finds a "not nice" solution and one of the variances goes to zero, driving the likelihood to infinity.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} } \value{ \code{normalmixMMlc} returns a list of class \code{mixEM} with items: \item{x}{The raw data.} \item{lambda}{The final mixing proportions.} \item{mu}{The final mean parameters.} \item{sigma}{The final standard deviation(s)} \item{scale}{Scale factor for the component standard deviations, if applicable.} \item{loglik}{The final log-likelihood.} \item{posterior}{An nxk matrix of posterior probabilities for observations.} \item{all.loglik}{A vector of each iteration's log-likelihood. This vector includes both the initial and the final values; thus, the number of iterations is one less than its length.} \item{restarts}{The number of times the algorithm restarted due to unacceptable choice of initial values.} \item{beta}{The final \eqn{\beta} parameter estimate.} \item{gamma}{The final \eqn{\gamma} parameter estimate.} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{normalmixEM}}, \code{\link{mvnormalmixEM}}, \code{\link{normalmixEM2comp}}, \code{\link{tauequivnormalmixEM}} } \references{ \itemize{ \item McLachlan, G. J. and Peel, D. (2000) \emph{Finite Mixture Models}, John Wiley & Sons, Inc. \item Meng, X.-L. and Rubin, D. B. (1993) Maximum Likelihood Estimation Via the ECM Algorithm: A General Framework, \emph{Biometrika} 80(2): 267-278. \item Chauveau, D. and Hunter, D.R. (2013) ECM and MM algorithms for mixtures with constrained parameters, \emph{preprint \url{https://hal.science/hal-00625285}}. \item Thomas, H., Lohaus, A., and Domsch, H. (2011) Stable Unstable Reliability Theory, \emph{British Journal of Mathematical and Statistical Psychology} 65(2): 201-221. } } \author{Didier Chauveau} \examples{ ## Analyzing synthetic data as in the tau equivalent model ## From Thomas et al (2011), see also Chauveau and Hunter (2013) ## a 3-component mixture of normals with linear constraints. lbd <- c(0.6,0.3,0.1); m <- length(lbd) sigma <- sig0 <- sqrt(c(1,9,9)) # means constaints mu = M beta M <- matrix(c(1,1,1,0,-1,1), 3, 2) beta <- c(1,5) # unknown constrained mean mu0 <- mu <- as.vector(M \%*\% beta) # linear constraint on the inverse variances pi = A.g A <- matrix(c(1,1,1,0,1,0), m, 2, byrow=TRUE) iv0 <- 1/(sig0^2) g0 <- c(iv0[2],iv0[1] - iv0[2]) # gamma^0 init # simulation and EM fits set.seed(50); n=100; x <- rnormmix(n,lbd,mu,sigma) s <- normalmixEM(x,mu=mu0,sigma=sig0,maxit=2000) # plain EM # EM with var and mean linear constraints sc <- normalmixMMlc(x, lambda=lbd, mu=mu0, sigma=sig0, mean.lincstr=M, var.lincstr=A, gparam=g0) # plot and compare both estimates dnormmixt <- function(t, lam, mu, sig){ m <- length(lam); f <- 0 for (j in 1:m) f <- f + lam[j]*dnorm(t,mean=mu[j],sd=sig[j]) f} t <- seq(min(x)-2, max(x)+2, len=200) hist(x, freq=FALSE, col="lightgrey", ylim=c(0,0.3), ylab="density",main="") lines(t, dnormmixt(t, lbd, mu, sigma), col="darkgrey", lwd=2) # true lines(t, dnormmixt(t, s$lambda, s$mu, s$sigma), lty=2) lines(t, dnormmixt(t, sc$lambda, sc$mu, sc$sigma), col=1, lty=3) legend("topleft", c("true","plain EM","constr EM"), col=c("darkgrey",1,1), lty=c(1,2,3), lwd=c(2,1,1)) } \keyword{file} mixtools/man/mixturegram.Rd0000755000175100001440000000742414342153463015573 0ustar hornikusers\name{mixturegram} \title{Mixturegrams} \alias{mixturegram} \usage{ mixturegram(data, pmbs, method = c("pca", "kpca", "lda"), all.n = FALSE, id.con = NULL, score = 1, iter.max = 50, nstart = 25, ...) } \description{ Construct a mixturegram for determining an apporpriate number of components. } \arguments{ \item{data}{The data, which must either be a vector or a matrix. If a matrix, then the rows correspond to the observations.} \item{pmbs}{A list of length (K-1) such that each element is an nxk matrix of the posterior membership probabilities. These are obtained from each of the "best" estimated k-component mixture models, k = 2,...,K. } \item{method}{The dimension reduction method used. \code{method = "pca"} implements principal components analysis. \code{method = "kpca"} implements kernel principal components analysis. \code{method = "lda"} implements reduced rank linear discriminant analysis. } \item{all.n}{A logical specifying whether the mixturegram should plot the profiles of all observations (\code{TRUE}) or just the K-profile summaries (\code{FALSE}). The default is \code{FALSE}.} \item{id.con}{An argument that allows one to impose some sort of (meaningful) identifiability constraint so that the mixture components are in some sort of comparable order between mixture models with different numbers of components. If \code{NULL}, then the components are ordered by the component means for univariate data or ordered by the first dimension of the component means for multivariate data.} \item{score}{The value for the specified dimension reduction technique's score, which is used for constructing the mixturegram. By default, this value is \code{1}, which is the value that will typically be used. Larger values will result in more variability displayed on the mixturegram. Note that the largest value that can be calculated at each value of k>1 on the mixturegram is p+k-1, where p is the number of columns of \code{data}. } \item{iter.max}{The maximum number of iterations allowed for the k-means clustering algorithm, which is passed to the \code{\link{kmeans}} function. The default is \code{50}. } \item{nstart}{The number of random sets chosen based on k centers, which is passed to the \code{\link{kmeans}} function. The default is \code{25}.} \item{...}{Additional arguments that can be passed to the underlying \code{\link{plot}} function.} } \value{ \code{mixturegram} returns a mixturegram where the profiles are plotted over component values of k = 1,...,K. } \seealso{ \code{\link{boot.comp}} } \references{ Young, D. S., Ke, C., and Zeng, X. (2018) The Mixturegram: A Visualization Tool for Assessing the Number of Components in Finite Mixture Models, \emph{Journal of Computational and Graphical Statistics}, \bold{27(3)}, 564--575. } \examples{ ##Data generated from a 2-component mixture of normals. set.seed(100) n <- 100 w <- rmultinom(n,1,c(.3,.7)) y <- sapply(1:n,function(i) w[1,i]*rnorm(1,-6,1) + w[2,i]*rnorm(1,0,1)) selection <- function(i,data,rep=30){ out <- replicate(rep,normalmixEM(data,epsilon=1e-06, k=i,maxit=5000),simplify=FALSE) counts <- lapply(1:rep,function(j) table(apply(out[[j]]$posterior,1, which.max))) counts.length <- sapply(counts, length) counts.min <- sapply(counts, min) counts.test <- (counts.length != i)|(counts.min < 5) if(sum(counts.test) > 0 & sum(counts.test) < rep) out <- out[!counts.test] l <- unlist(lapply(out, function(x) x$loglik)) tmp <- out[[which.max(l)]] } all.out <- lapply(2:5, selection, data = y, rep = 2) pmbs <- lapply(1:length(all.out), function(i) all.out[[i]]$post) mixturegram(y, pmbs, method = "pca", all.n = FALSE, id.con = NULL, score = 1, main = "Mixturegram (Well-Separated Data)") } \keyword{file} mixtools/man/depth.Rd0000755000175100001440000000201014342153463014315 0ustar hornikusers\name{depth} \alias{depth} \title{Elliptical and Spherical Depth} \description{ Computation of spherical or elliptical depth. } \usage{ depth(pts, x, Cx = var(x)) } \arguments{ \item{pts}{A kxd matrix containing the k points that one wants to compute the depth. Each row is a point. } \item{x}{A nxd matrix containing the reference data. Each row is an observation.} \item{Cx}{A dxd scatter matrix for the data x where the default is var(x). When Cx = I(d), it returns the sphercial depth.} } \value{ \code{depth} returns a k-vector where each entry is the elliptical depth of a point in \code{pts}. } \references{ Elmore, R. T., Hettmansperger, T. P. and Xuan, F. (2000) Spherical Data Depth and a Multivariate Median, \emph{Proceedings of Data Depth: Robust Multivariate Statistical Analysis, Computational Geometry and Applications}. } \seealso{\code{\link{regcr}} } \examples{ set.seed(100) x <- matrix(rnorm(200),nc = 2) depth(x[1:3, ], x) } \note{\code{depth} is used in \code{regcr}.} \keyword{file} mixtools/man/RodFramedata.Rd0000755000175100001440000000226514342153463015556 0ustar hornikusers\name{RodFramedata} \docType{data} \title{Rod and Frame Task Data Set} \alias{RodFramedata} \usage{ data(RodFramedata) } \description{ This data set involves assessing children longitudinally at 6 age points from ages 4 through 18 years for the rod and frame task. This task sits the child in a darkened room in front of a luminous square frame tilted at 28 degrees on its axis to the left or right. Centered inside the frame was a luminous rod also tilted 28 degrees to the left or right. The child's task was to adjust the rod to the vertical position and the absolute deviation from the vertical (in degrees) was the measured response. } \format{This data frame consists of 140 children (the rows). Column 1 is the subject number and column 2 is the sex (0=MALE and 1=FEMALE). Columns 3 through 26 give the 8 responses at each of the ages 4, 5, and 7. Columns 27 through 56 give the 10 responses at each of the ages 11, 14, and 18. A value of 99 denotes missing data. } \source{ Thomas, H. and Dahlin, M. P. (2005) Individual Development and Latent Groups: Analytical Tools for Interpreting Heterogeneity, \emph{Developmental Review} \bold{25(2)}, 133--154. } \keyword{datasets} mixtools/man/boot.se.Rd0000755000175100001440000000345514342153463014600 0ustar hornikusers\name{boot.se} \title{Performs Parametric Bootstrap for Standard Error Approximation} \alias{boot.se} \usage{ boot.se(em.fit, B = 100, arbmean = TRUE, arbvar = TRUE, N = NULL, ...) } \description{ Performs a parametric bootstrap by producing B bootstrap samples for the parameters in the specified mixture model. } \arguments{ \item{em.fit}{An object of class \code{mixEM}. The estimates produced in \code{em.fit} will be used as the parameters for the distribution from which we generate the bootstrap data.} \item{B}{The number of bootstrap samples to produce. The default is 100, but ideally, values of 1000 or more would be more acceptable.} \item{arbmean}{If FALSE, then a scale mixture analysis can be performed for \code{mvnormalmix}, \code{normalmix}, \code{regmix}, or \code{repnormmix}. The default is TRUE.} \item{arbvar}{If FALSE, then a location mixture analysis can be performed for \code{mvnormalmix}, \code{normalmix}, \code{regmix}, or \code{repnormmix}. The default is TRUE.} \item{N}{An n-vector of number of trials for the logistic regression type \code{logisregmix}. If NULL, then \code{N} is an n-vector of 1s for binary logistic regression.} \item{...}{Additional arguments passed to the various EM algorithms for the mixture of interest.} } \value{ \code{boot.se} returns a list with the bootstrap samples and standard errors for the mixture of interest. } \references{ McLachlan, G. J. and Peel, D. (2000) \emph{Finite Mixture Models}, John Wiley and Sons, Inc. } \examples{ ## Bootstrapping standard errors for a regression mixture case. data(NOdata) attach(NOdata) set.seed(100) em.out <- regmixEM(Equivalence, NO, arbvar = FALSE) out.bs <- boot.se(em.out, B = 10, arbvar = FALSE) out.bs } \keyword{file} mixtools/man/lambda.pert.Rd0000755000175100001440000000173614342153463015420 0ustar hornikusers\name{lambda.pert} \title{Perturbation of Mixing Proportions} \alias{lambda.pert} \usage{ lambda.pert(lambda, pert) } \description{ Perturbs a set of mixing proportions by first scaling the mixing proportions, then taking the logit of the scaled values, perturbing them, and inverting back to produce a set of new mixing proportions. } \arguments{ \item{lambda}{A vector of length k giving the mixing proportions which are to be perturbed.} \item{pert}{A vector (possibly of length k-1) for which to perturb \code{lambda}. If the length is less than k, then values of the vector are recycled. If length is greater than k, then only the first k values are used.} } \value{ \code{lambda.pert} returns new \code{lambda} values perturbed by \code{pert}. } \details{ This function is called by \code{regmixMH}. } \seealso{ \code{\link{regmixMH}} } \examples{ set.seed(100) x <- c(0.5, 0.2, 0.3) lambda.pert(x, rcauchy(3)) } \keyword{internal} mixtools/man/regmixmodel.sel.Rd0000755000175100001440000000451014342153463016316 0ustar hornikusers\name{regmixmodel.sel} \title{Model Selection in Mixtures of Regressions} \alias{regmixmodel.sel} \usage{ regmixmodel.sel(x, y, w = NULL, k = 2, type = c("fixed", "random", "mixed"), ...) } \description{ Assess the number of components in a mixture of regressions model using the Akaike's information criterion (AIC), Schwartz's Bayesian information criterion (BIC), Bozdogan's consistent AIC (CAIC), and Integrated Completed Likelihood (ICL). } \arguments{ \item{x}{An nxp matrix (or list) of predictors. If an intercept is required, then \code{x} must NOT include a column of 1's! Requiring an intercept may be controlled through arguments specified in \code{...}.} \item{y}{An n-vector (or list) of response values.} \item{w}{An optional list of fixed effects predictors for type "mixed" or "random".} \item{k}{The maximum number of components to assess.} \item{type}{The type of regression mixture to use. If "fixed", then a mixture of regressions with fixed effects will be used. If "random", then a mixture of regressions where the random effects regression coefficients are assumed to come from a mixture will be used. If "mixed", the mixture structure used is the same as "random", except a coefficient of fixed effects is also assumed.} \item{...}{Additional arguments passed to the EM algorithm used for calculating the type of regression mixture specified in \code{type}.} } \value{ \code{regmixmodel.sel} returns a matrix of the AIC, BIC, CAIC, and ICL values along with the winner (i.e., the highest value given by the model selection criterion) for various types of regression mixtures. } \seealso{ \code{\link{regmixEM}}, \code{\link{regmixEM.mixed}} } \references{ Biernacki, C., Celeux, G. and Govaert, G. (2000) Assessing a Mixture Model for Clustering with the Integrated Completed Likelihood, \emph{IEEE Transactions on Pattern Analysis and Machine Intelligence} \bold{22(7)}, 719--725. Bozdogan, H. (1987) Model Selection and Akaike's Information Criterion (AIC): The General Theory and its Analytical Extensions, \emph{Psychometrika} \bold{52}, 345--370. } \examples{ ## Assessing the number of components for NOdata. data(NOdata) attach(NOdata) set.seed(100) regmixmodel.sel(x = NO, y = Equivalence, k = 3, type = "fixed") } \keyword{file} mixtools/man/plotFDR.Rd0000644000175100001440000000457314342153463014540 0ustar hornikusers\name{plotFDR} \alias{plotFDR} \title{Plot False Discovery Rate (FDR) estimates from output by EM-like strategies} \description{Plot FDR\eqn{(p_i)} estimates against index of sorted p-values from, e.g., normalmixEM or the semiparametric mixture model posterior probabilities output by \code{\link{spEMsymlocN01}}, or any EM-algorithm like \code{\link{normalmixEM}} which returns posterior probabilities. The function can simultaneously plot FDR estimates from two strategies for comparison. Plot of the true FDR can be added if complete data are available (typically in simulation studies).} \usage{ plotFDR(post1, post2 = NULL, lg1 = "FDR 1", lg2 = NULL, title = NULL, compH0 = 1, alpha = 0.1, complete.data = NULL, pctfdr = 0.3) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{post1}{The matrix of posterior probabilities from objects such as the output from \code{\link{spEMsymlocN01}}. The rows need to be sorted by increasing pvalues.} \item{post2}{A second object like \code{post1} if comparison is desired, also sorted by increasing pvalues.} \item{lg1}{Text describing the FDR estimate in \code{post1}.} \item{lg2}{Text describing the FDR estimate in \code{post2} if provided.} \item{title}{Plot title, a default is provided if \code{NULL}.} \item{compH0}{The component indicator associated to the null hypothesis H0, normally 1 since it is defined in this way in \code{\link{spEMsymlocN01}}, but in case of label switching in other algorithms it can be set to \code{2}.} \item{alpha}{The target FDR level; the index at which the FDR estimate crosses the horizontal line for level \code{alpha} gives the maximum number of cases to reject.} \item{complete.data}{An array with \eqn{n} lines and 2 columns, with the component indicator in column 1 and the p-values in column 2, sorted by p-values.} \item{pctfdr}{The level up to which the FDR is plotted, i.e. the scale of the vertical axis.} } \value{A plot of one or two FDR estimates, with the true FDR if available} \references{ \itemize{ \item Chauveau, D., Saby, N., Orton, T. G., Lemercier B., Walter, C. and Arrouys, D. Large-scale simultaneous hypothesis testing in monitoring carbon content from French soil database -- A semi-parametric mixture approach, Geoderma 219-220 (2014), 117-124. } } \author{Didier Chauveau} \seealso{ \code{\link{spEMsymlocN01}}} % \keyword{file}mixtools/man/ise.npEM.Rd0000755000175100001440000001027714342153463014645 0ustar hornikusers\name{ise.npEM} \title{Integrated Squared Error for a selected density from npEM output} \alias{ise.npEM} \usage{ ise.npEM(npEMout, component=1, block=1, truepdf, lower=-Inf, upper=Inf, plots = TRUE, ...) } \description{ Computes the integrated squared error for a selected estimated density from \code{\link{npEM}} output (selected by specifying the component and block number), relative to a true pdf that must be specified by the user. The range for the numerical integration must be specified. This function also returns (by default) a plot of the true and estimated densities. } \arguments{ \item{npEMout}{An object of class \code{npEM} such as the output of the \code{\link{npEM}} function} \item{component, block}{Component and block of particular density to analyze from \code{npEMout}.} \item{truepdf}{an \R function taking a numeric first argument and returning a numeric vector of the same length. Returning a non-finite element will generate an error.} \item{lower, upper}{the limits of integration. Can be infinite.} \item{plots}{logical: Should plots be produced?} \item{...}{additional arguments to be passed to \code{truepdf} (and that may be mandatory like, e.g., the \code{df = } argument of \code{dt}). Remember to use argument names not matching those of \code{ise.npRM}.} } \value{ Just as for the \code{\link{integrate}} function, a list of class \code{"integrate"} with components \item{value}{the final estimate of the integral.} \item{abs.error}{estimate of the modulus of the absolute error.} \item{subdivisions}{the number of subintervals produced in the subdivision process.} \item{message}{\code{"OK"} or a character string giving the error message.} \item{call}{the matched call.} } \details{This function calls the \code{\link{wkde}} (weighted kernel density estimate) function. } \seealso{ \code{\link{npEM}}, \code{\link{wkde}}, \code{\link{integrate}} } \references{ \itemize{ \item Benaglia, T., Chauveau, D., and Hunter, D. R. (2009), An EM-like algorithm for semi- and non-parametric estimation in multivariate mixtures, Journal of Computational and Graphical Statistics, 18, 505-526. \item Benaglia, T., Chauveau, D., Hunter, D. R., and Young, D. (2009), mixtools: An R package for analyzing finite mixture models. Journal of Statistical Software, 32(6):1-29. } } \examples{ # Mixture with mv gaussian model set.seed(100) m <- 2 # no. of components r <- 3 # no. of repeated measures (coordinates) lambda <- c(0.4, 0.6) # Note: Need first 2 coordinates conditionally iid due to block structure mu <- matrix(c(0, 0, 0, 3, 3, 5), m, r, byrow=TRUE) # means sigma <- matrix(rep(1, 6), m, r, byrow=TRUE) # stdevs blockid = c(1,1,2) # block structure of coordinates n <- 200 x <- rmvnormmix(n, lambda, mu, sigma) # simulated data # fit the model with "arbitrary" initial centers centers <- matrix(c(0, 0, 0, 4, 4, 4), 2, 3, byrow=TRUE) a <- npEM(x, centers, blockid, eps=1e-8, verb=FALSE) # Calculate integrated squared error for j=2, b=1: j <- 2 # component b <- 1 # block coords <- a$blockid == b ise.npEM(a, j, b, dnorm, lower=0, upper=10, plots=TRUE, mean=mu[j,coords][1], sd=sigma[j, coords][1]) # The following (lengthy) example recreates the normal multivariate # mixture model simulation from Benaglia et al (2009). mu <- matrix(c(0, 0, 0, 3, 4, 5), m, r, byrow=TRUE) nbrep <- 5 # Benaglia et al use 300 replications # matrix for storing sums of Integrated Squared Errors ISE <- matrix(0,m,r,dimnames=list(Components=1:m, Blocks=1:r)) nblabsw <- 0 # no. of label switches for (mc in 1:nbrep) { print(paste("REPETITION", mc)) x <- rmvnormmix(n,lambda,mu,sigma) # simulated data a <- npEM(x, centers, verb=FALSE) #default: if (a$lambda[1] > a$lambda[2]) nblabsw <- nblabsw + 1 for (j in 1:m) { # for each component for (k in 1:r) { # for each coordinate; not assuming iid! # dnorm with correct mean, sd is the true density: ISE[j,k] <- ISE[j,k] + ise.npEM(a, j, k, dnorm, lower=mu[j,k]-5, upper=mu[j,k]+5, plots=FALSE, mean=mu[j,k], sd=sigma[j,k])$value } } MISE <- ISE/nbrep # Mean ISE sqMISE <- sqrt(MISE) # root-mean-integrated-squared error } sqMISE } \keyword{file} mixtools/man/regmixEM.lambda.Rd0000755000175100001440000000675214342153463016166 0ustar hornikusers\name{regmixEM.lambda} \title{EM Algorithm for Mixtures of Regressions with Local Lambda Estimates} \alias{regmixEM.lambda} \usage{ regmixEM.lambda(y, x, lambda = NULL, beta = NULL, sigma = NULL, k = 2, addintercept = TRUE, arbmean = TRUE, arbvar = TRUE, epsilon = 1e-8, maxit = 10000, verb = FALSE) } \description{ Returns output for one step of an EM algorithm output for mixtures of multiple regressions where the mixing proportions are estimated locally. } \arguments{ \item{y}{An n-vector of response values.} \item{x}{An nxp matrix of predictors. See \code{addintercept} below.} \item{lambda}{An nxk matrix of initial local values of mixing proportions. Entries should sum to 1. This determines number of components. If NULL, then \code{lambda} is simply one over the number of components.} \item{beta}{Initial value of \code{beta} parameters. Should be a pxk matrix, where p is the number of columns of x and k is number of components. If NULL, then \code{beta} has uniform standard normal entries. If both \code{lambda} and \code{beta} are NULL, then number of components is determined by \code{sigma}.} \item{sigma}{k-vector of initial global values of standard deviations. If NULL, then \eqn{1/\code{sigma}^2} has random standard exponential entries. If \code{lambda}, \code{beta}, and \code{sigma} are NULL, then number of components is determined by \code{k}.} \item{k}{The number of components. Ignored unless all of \code{lambda}, \code{beta}, and \code{sigma} are NULL.} \item{addintercept}{If TRUE, a column of ones is appended to the x matrix before the value of p is calculated.} \item{arbmean}{If TRUE, each mixture component is assumed to have a different set of regression coefficients (i.e., the \code{beta}s).} \item{arbvar}{If TRUE, each mixture component is assumed to have a different \code{sigma}.} \item{epsilon}{The convergence criterion.} \item{maxit}{The maximum number of iterations.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} } \value{ \code{regmixEM.lambda} returns a list of class \code{mixEM} with items: \item{x}{The set of predictors (which includes a column of 1's if \code{addintercept} = TRUE).} \item{y}{The response values.} \item{lambda}{The inputted mixing proportions.} \item{beta}{The final regression coefficients.} \item{sigma}{The final standard deviations. If \code{arbmean} = FALSE, then only the smallest standard deviation is returned. See \code{scale} below.} \item{scale}{If \code{arbmean} = FALSE, then the scale factor for the component standard deviations is returned. Otherwise, this is omitted from the output.} \item{loglik}{The final log-likelihood.} \item{posterior}{An nxk matrix of posterior probabilities for observations.} \item{all.loglik}{A vector of each iteration's log-likelihood.} \item{restarts}{The number of times the algorithm restarted due to unacceptable choice of initial values.} \item{ft}{A character vector giving the name of the function.} } \details{ Primarily used within \code{regmixEM.loc}. } \seealso{ \code{\link{regmixEM.loc}} } \examples{ ## Compare a 2-component and 3-component fit to NOdata. data(NOdata) attach(NOdata) set.seed(100) out1 <- regmixEM.lambda(Equivalence, NO) out2 <- regmixEM.lambda(Equivalence, NO, k = 3) c(out1$loglik, out2$loglik) } \keyword{file} mixtools/man/plotly_mixEM.Rd0000644000175100001440000001462714342425456015655 0ustar hornikusers\name{plotly_mixEM} \alias{plotly_mixEM} \title{Visualization of output of \code{mixEM} function using \code{plotly}} \description{This is an updated version of \code{plot.mixEM}. For more technical details, please refer to \code{plot.mixEM}.} \usage{ plotly_mixEM(x, loglik = TRUE, density = FALSE, xlab1="Iteration", xlab1.size=15 , xtick1.size=15, ylab1="Log-Likelihood", ylab1.size=15 , ytick1.size=15, title1="Observed Data Log-Likelihood", title1.size=15, title1.x = 0.5,title1.y=0.95, col1="#1f77b4", lwd1=3, cex1=6, xlab2=NULL, xlab2.size=15 , xtick2.size=15, ylab2=NULL, ylab2.size=15 , ytick2.size=15, title2=NULL, title2.size=15, title2.x = 0.5,title2.y=0.95, col.hist = "#1f77b4", col2=NULL, lwd2=3, cex2=6, alpha = 0.05, marginal = FALSE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{An object of class \code{mixEM}.} \item{loglik}{If TRUE, a plot of the log-likelihood versus the EM iterations is given.} \item{density}{Graphics pertaining to certain mixture models. The details are given below.} \item{xlab1}{Label of x-axis to be passed to the loglikelihood plot. Trying to change these parameters using \code{xlab} result in an error.} \item{xlab1.size}{Font of \code{xlab1}.} \item{xtick1.size}{Font of tick labels of x-axis to be passed to the loglikelihood plot.} \item{ylab1}{Label of y-axis to be passed to the loglikelihood plot. Trying to change these parameters using \code{ylab} result in an error.} \item{ylab1.size}{Font of \code{ylab1}.} \item{ytick1.size}{Font of tick labels of y-axis to be passed to the loglikelihood plot.} \item{title1}{Title to be passed to the loglikelihood plot.} \item{title1.size}{Tile size of the loglikelihood plot.} \item{title1.x}{Horizontal position of the loglikelihood plot.} \item{title1.y}{Verticle position of the loglikelihood plot.} \item{col1}{Color of the loglikelihood plot.} \item{lwd1}{Width of the density curve of the loglikelihood plot.} \item{cex1}{Dot size of the loglikelihood plot.} \item{xlab2}{Label of x-axis to be passed to the density plot. Trying to change these parameters using \code{xlab} result in an error.} \item{xlab2.size}{Font of \code{xlab2}.} \item{xtick2.size}{Font of tick labels of x-axis to be passed to the density plot.} \item{ylab2}{Label of y-axis to be passed to the density plot. Trying to change these parameters using \code{ylab} result in an error.} \item{ylab2.size}{Font of \code{ylab2}.} \item{ytick2.size}{Font of tick labels of y-axis to be passed to the density plot.} \item{title2}{Title to be passed to the density plot.} \item{title2.size}{Tile size of the density plot.} \item{title2.x}{Horizontal position of the density plot.} \item{title2.y}{Verticle position of the density plot.} \item{col2}{Color of the density plot.} \item{lwd2}{Width of the density curve of the density plot.} \item{cex2}{Dot size of the density plot.} \item{col.hist}{Color of the histogram of the density plot} \item{alpha}{A vector of significance levels when constructing confidence ellipses and confidence bands for the mixture of multivariate normals and mixture of regressions cases, respectively. The default is 0.05} \item{marginal}{If \code{TRUE}, marginal density is presented on the side of the corresponding variable.} } \value{A plot of the output of \code{mixEM} function is presented depends on output type.} \seealso{ \code{\link{post.beta}}} \examples{ \dontrun{ ## EM output for data generated from a 2-component binary logistic regression model. beta <- matrix(c(-10, .1, 20, -.1), 2, 2) x <- runif(500, 50, 250) x1 <- cbind(1, x) xbeta <- x1%*%beta w <- rbinom(500, 1, .3) y <- w*rbinom(500, size = 1, prob = (1/(1+exp(-xbeta[, 1]))))+ (1-w)*rbinom(500, size = 1, prob = (1/(1+exp(-xbeta[, 2])))) out.2 <- logisregmixEM(y, x, beta = beta, lambda = c(.3, .7), verb = TRUE, epsilon = 1e-01) plotly_mixEM(out.2 , col2 = c("red" , "green") , density = TRUE) ## Fitting randomly generated data with a 2-component location mixture of bivariate normals. set.seed(100) x.1 <- rmvnorm(40, c(0, 0)) x.2 <- rmvnorm(60, c(3, 4)) X.1 <- rbind(x.1, x.2) mu <- list(c(0, 0), c(3, 4)) out.1 <- mvnormalmixEM(X.1, arbvar = FALSE, mu = mu, epsilon = 1e-02) plotly_mixEM(out.1 , col2 = c("brown" , "blue") , alpha = c(0.01 , 0.05 , 0.1), density = TRUE , marginal = FALSE) ## Fitting randomly generated data with a 2-component scale mixture of bivariate normals. x.3 <- rmvnorm(40, c(0, 0), sigma = matrix(c(200, 1, 1, 150), 2, 2)) x.4 <- rmvnorm(60, c(0, 0)) X.2 <- rbind(x.3, x.4) lambda <- c(0.40, 0.60) sigma <- list(diag(1, 2), matrix(c(200, 1, 1, 150), 2, 2)) out.2 <- mvnormalmixEM(X.2, arbmean = FALSE, sigma = sigma, lambda = lambda, epsilon = 1e-02) plotly_mixEM(out.1 , col2 = c("brown" , "blue") , alpha = c(0.01 , 0.05 , 0.1), density = TRUE , marginal = TRUE) ## EM output for simulated data from 2-component mixture of random effects. data(RanEffdata) set.seed(100) x <- lapply(1:length(RanEffdata), function(i) matrix(RanEffdata[[i]][, 2:3], ncol = 2)) x <- x[1:20] y <- lapply(1:length(RanEffdata), function(i) matrix(RanEffdata[[i]][, 1], ncol = 1)) y <- y[1:20] lambda <- c(0.45, 0.55) mu <- matrix(c(0, 4, 100, 12), 2, 2) sigma <- 2 R <- list(diag(1, 2), diag(1, 2)) em.out <- regmixEM.mixed(y, x, sigma = sigma, arb.sigma = FALSE, lambda = lambda, mu = mu, R = R, addintercept.random = FALSE, epsilon = 1e-02, verb = TRUE) plotly_mixEM(em.out , col2 = c("gold" , "purple") , density = TRUE , lwd2 = 1 , cex2 =9) ## Analyzing the Old Faithful geyser data with a 2-component mixture of normals. data(faithful) attach(faithful) set.seed(100) out <- normalmixEM(waiting, arbvar = FALSE, verb = TRUE, epsilon = 1e-04) plotly_mixEM(out, density = TRUE , col2 = c("gold" , "purple")) ## EM output for the water-level task data set. data(Waterdata) set.seed(100) water <- t(as.matrix(Waterdata[,3:10])) em.out <- repnormmixEM(water, k = 2, verb = TRUE, epsilon = 1e-03) plotly_mixEM(em.out, density = TRUE , col2 = c("gold" , "purple")) } } % \keyword{file}mixtools/man/plotly_ellipse.Rd0000644000175100001440000000374714341210764016265 0ustar hornikusers\name{plotly_ellipse} \title{Draw Two-Dimensional Ellipse Based on Mean and Covariance using \code{plotly}} \alias{plotly_ellipse} \usage{ plotly_ellipse(mu, sigma, alpha=.05, npoints=250, draw=TRUE, cex = 3, col = "#1f77b4", lwd = 3, title = "", title.x = 0.5, title.y = 0.95, title.size = 15, xlab = "X", xlab.size = 15, xtick.size = 15, ylab = "Y", ylab.size = 15, ytick.size = 15) } \description{ This is an updated version of \code{ellipse}. For more technical details, please refer to \code{ellipse}. } \arguments{ \item{mu}{A 2-vector giving the mean.} \item{sigma}{A 2x2 matrix giving the covariance matrix.} \item{alpha}{Probability to be excluded from the ellipse. The default value is alpha = .05, which results in a 95\% ellipse.} \item{npoints}{Number of points comprising the border of the ellipse.} \item{draw}{If TRUE, draw the ellipse.} \item{cex}{Size of markers.} \item{lwd}{Line width of the ellipse.} \item{col}{Color of both markers and lines.} \item{title}{Text of the main title.} \item{title.size}{Size of the main title.} \item{title.x}{Horsizontal position of the main title.} \item{title.y}{Vertical posotion of the main title.} \item{xlab}{Label of X-axis.} \item{xlab.size}{Size of the lable of X-axis.} \item{xtick.size}{Size of tick lables of X-axis.} \item{ylab}{Label of Y-axis.} \item{ylab.size}{Size of the lable of Y-axis.} \item{ytick.size}{Size of tick lables of Y-axis.} } \value{ \code{plotly_ellipse} returns an \code{npoints}x2 matrix of the points forming the border of the ellipse. } \references{ Johnson, R. A. and Wichern, D. W. (2002) \emph{Applied Multivariate Statistical Analysis, Fifth Edition}, Prentice Hall. } \seealso{ \code{\link{regcr}}, \code{\link{ellipse}} } \examples{ ## Produce a 95% ellipse with the specified mean and covariance structure. mu <- c(1, 3) sigma <- matrix(c(1, .3, .3, 1.5), 2, 2) plotly_ellipse(mu, sigma, npoints = 200) } \keyword{file} mixtools/man/test.equality.mixed.Rd0000755000175100001440000000523314342153463017143 0ustar hornikusers\name{test.equality.mixed} \title{Performs Chi-Square Test for Mixed Effects Mixtures} \alias{test.equality.mixed} \usage{ test.equality.mixed(y, x, w=NULL, arb.R = TRUE, arb.sigma = FALSE, lambda = NULL, mu = NULL, sigma = NULL, R = NULL, alpha = NULL, ...) } \description{ Performs a likelihood ratio test of either common variance terms between the response trajectories in a mixture of random (or mixed) effects regressions or for common variance-covariance matrices for the random effects mixture distribution.} \arguments{ \item{y}{The responses for \code{regmixEM.mixed}.} \item{x}{The predictors for the random effects in \code{regmixEM.mixed}.} \item{w}{The predictors for the (optional) fixed effects in \code{regmixEM.mixed}.} \item{arb.R}{If FALSE, then a test for different variance-covariance matrices for the random effects mixture is performed.} \item{arb.sigma}{If FALSE, then a test for different variance terms between the response trajectories is performed.} \item{lambda}{A vector of mixing proportions (under the null hypothesis) with same purpose as outlined in \code{regmixEM.mixed}.} \item{mu}{A matrix of the means (under the null hypothesis) with same purpose as outlined in \code{regmixEM.mixed}.} \item{sigma}{A vector of standard deviations (under the null hypothesis) with same purpose as outlined in \code{regmixEM.mixed}.} \item{R}{A list of covariance matrices (under the null hypothesis) with same purpose as outlined in \code{regmixEM.mixed}.} \item{alpha}{An optional vector of fixed effects regression coefficients (under the null hypothesis) with same purpose as outlined in \code{regmixEM.mixed}.} \item{...}{Additional arguments passed to \code{regmixEM.mixed}.} } \value{ \code{test.equality.mixed} returns a list with the following items: \item{chi.sq}{The chi-squared test statistic.} \item{df}{The degrees of freedom for the chi-squared test statistic.} \item{p.value}{The p-value corresponding to this likelihood ratio test.} } \seealso{ \code{\link{test.equality}} } \examples{ ##Test of equal variances in the simulated data set. data(RanEffdata) set.seed(100) x<-lapply(1:length(RanEffdata), function(i) matrix(RanEffdata[[i]][, 2:3], ncol = 2)) x<-x[1:15] y<-lapply(1:length(RanEffdata), function(i) matrix(RanEffdata[[i]][, 1], ncol = 1)) y<-y[1:15] out<-test.equality.mixed(y, x, arb.R = TRUE, arb.sigma = FALSE, epsilon = 1e-1, verb = TRUE, maxit = 50, addintercept.random = FALSE) out } \keyword{file} mixtools/man/Waterdata.Rd0000755000175100001440000000657614342153463015152 0ustar hornikusers\name{Waterdata} \docType{data} \title{Water-Level Task Data Set} \alias{Waterdata} \alias{WaterdataFull} \usage{ data(Waterdata) } \description{ This data set arises from the water-level task proposed by the Swiss psychologist Jean Piaget to assess children's understanding of the physical world. This involves presenting a child with a rectangular vessel with a cap, affixed to a wall, that can be tilted (like the minute hand of a clock) to point in any direction. A separate disk with a water line indicated on it, which can similarly be spun so that the water line may assume any desired angle with the horizontal, is positioned so that by spinning this disk, the child subject may make the hypothetical surface of water inside the vessel assume any desired orientation. For each of eight different orientations of the vessel, corresponding to the clock angles at 1:00, 2:00, 4:00, 5:00, 7:00, 8:00, 10:00, and 11:00, the child subject is asked to position the water level as it would appear in reality if water were in the vessel. The measurement is the acute angle with the horizontal, in degrees, assumed by the water line after it is positioned by the child. A sign is attached to the measurement to indicate whether the line slopes up (positive) or down (negative) from left to right. Thus, each child has 8 repeated measurements, one for each vessel angle, and the range of possible values are from -90 to 90. The setup of the experiment, along with a photograph of the testing apparatus, is given by Thomas and Jamison (1975). A more detailed analysis using a subset of 405 of the original 579 subjects is given by Thomas and Lohaus (1993); further analyses using the functions in \code{mixtools} are given by Benaglia et al (2008) and Levine et al (2011), among others. There are two versions of the dataset included in \code{mixtools}. The full dataset, called \code{WaterdataFull}, has 579 individuals. The dataset called \code{Waterdata} is a subset of 405 individuals, comprising all children aged 11 years or more and omitting any individuals with any observations equal to 100, which in this context indicates a missing value (since all of the degree measurements should be in the range from -90 to +90, 100 is not a possible value). } \format{These data frames consist of 405 or 579 rows, one row for each child. There are ten columns: The age (in years) and sex (where 1=male and 0=female) are given for each individual along with the degree of deviation from the horizontal for 8 specified clock-hour orientations (11, 4, 2, 7, 10, 5, 1, and 8 o'clock, in order). } \source{ Benaglia, T., Chauveau, D., and Hunter, D.R. (2009), An EM-Like Algorithm for Semi- and Non-Parametric Estimation in Multivariate Mixtures, \emph{Journal of Computational and Graphical Statistics}, 18: 505-526. Levine, M., Hunter, D.R., and Chauveau, D. (2011), Maximum Smoothed Likelihood for Multivariate Mixtures, \emph{Biometrika}, 98(2): 403-416. Thomas, H. and Jamison, W. (1975), On the Acquisition of Understanding that Still Water is Horizontal, \emph{Merrill-Palmer Quarterly of Behavior and Development}, 21(1): 31-44. Thomas, H. and Lohaus, A. (1993), \emph{Modeling Growth and Individual Differences in Spatial Tasks}, University of Chicago Press, Chicago, available on JSTOR. } \keyword{datasets} mixtools/man/tauequivnormalmixEM.Rd0000644000175100001440000002055314342153463017236 0ustar hornikusers\name{tauequivnormalmixEM} \title{Special EM Algorithm for three-component tau equivalence model} \alias{tauequivnormalmixEM} \usage{ tauequivnormalmixEM (x, lambda = NULL, mu = NULL, sigma = NULL, k = 3, mean.constr = NULL, sd.constr = NULL, gparam = NULL, epsilon = 1e-08, maxit = 10000, maxrestarts=20, verb = FALSE, fast=FALSE, ECM = TRUE, arbmean = TRUE, arbvar = TRUE) } \description{ Return ECM algorithm output for a specific case of a three-component tau equivalence model } \details{ The \code{tauequivnormalmixEM} function is merely a wrapper for the \code{\link{normalmixMMlc}} function. # This is the standard EM algorithm for normal mixtures that maximizes # the conditional expected complete-data # log-likelihood at each M-step of the algorithm. # If desired, the # EM algorithm may be replaced by an ECM algorithm (see \code{ECM} argument) # that alternates between maximizing with respect to the \code{mu} # and \code{lambda} while holding \code{sigma} fixed, and maximizing with # respect to \code{sigma} and \code{lambda} while holding \code{mu} # fixed. In the case where \code{arbmean} is \code{FALSE} # and \code{arbvar} is \code{TRUE}, there is no closed-form EM algorithm, # so the ECM option is forced in this case. } \arguments{ \item{x}{A vector of length n consisting of the data, passed directly to \code{\link{normalmixMMlc}}.} \item{lambda}{Initial value of mixing proportions, passed directly to \code{\link{normalmixMMlc}}. Automatically repeated as necessary to produce a vector of length \code{k}, then normalized to sum to 1. If \code{NULL}, then \code{lambda} is random from a uniform Dirichlet distribution (i.e., its entries are uniform random and then it is normalized to sum to 1).} \item{mu}{Starting value of vector of component means for algorithm, passed directly to \code{\link{normalmixMMlc}}. If non-NULL and a vector, \code{k} is set to \code{length(mu)}. If NULL, then the initial value is randomly generated from a normal distribution with center(s) determined by binning the data.} \item{sigma}{Starting value of vector of component standard deviations for algorithm, passed directly to \code{\link{normalmixMMlc}}. Obsolete for linear constraint on the inverse variances, use \code{gparam} instead to specify a starting value. Note: This needs more precision} \item{k}{Number of components, passed directly to \code{\link{normalmixMMlc}}. Initial value ignored unless \code{mu} and \code{sigma} are both NULL. Also, initial value is ignored if \code{mean.constr} is NULL, since in that case we presume \code{k=3}.} \item{mean.constr}{If non-NULL, this parameter is passed directly to \code{\link{normalmixMMlc}} and both \code{mean.lincstr} and \code{var.lincstr} are passed as NULL to \code{\link{normalmixMMlc}}. If NULL, then it is assumed that \code{k=3} and the means must take the form \eqn{\alpha}, \eqn{\alpha-\delta}, and \eqn{\alpha+\delta} for unknown parameters \eqn{\alpha} and \eqn{\delta}. Furthermore, the reciprocal variances are assumed to be \eqn{\gamma_1+\gamma_2}, \eqn{\gamma_1}, and \eqn{\gamma_1} for unknown positive parameters \eqn{\gamma_1} and \eqn{\gamma_2}. These constraints are passed to the \code{\link{normalmixMMlc}} function using the \code{mean.lincstr} and \code{var.lincstr} arguments as shown in the examples for the \code{\link{normalmixMMlc}} help file.} \item{sd.constr}{Deprecated.} \item{gparam}{This argument is passed directly to \code{\link{normalmixMMlc}.} } \item{epsilon}{The convergence criterion. Convergence is declared when the change in the observed data log-likelihood increases by less than epsilon.} \item{maxit}{The maximum number of iterations.} \item{maxrestarts}{The maximum number of restarts allowed in case of a problem with the particular starting values chosen due to one of the variance estimates getting too small (each restart uses randomly chosen starting values). It is well-known that when each component of a normal mixture may have its own mean and variance, the likelihood has no maximizer; in such cases, we hope to find a "nice" local maximum with this algorithm instead, but occasionally the algorithm finds a "not nice" solution and one of the variances goes to zero, driving the likelihood to infinity.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} \item{fast}{If TRUE and k==2 and arbmean==TRUE, then use \code{\link{normalmixEM2comp}}, which is a much faster version of the EM algorithm for this case. This version is less protected against certain kinds of underflow that can cause numerical problems and it does not permit any restarts. If k>2, \code{fast} is ignored.} \item{ECM}{logical: Should this algorithm be an ECM algorithm in the sense of Meng and Rubin (1993)? If FALSE, the algorithm is a true EM algorithm; if TRUE, then every half-iteration alternately updates the means conditional on the variances or the variances conditional on the means, with an extra E-step in between these updates. For \code{tauequivnormalmixEM}, it must be TRUE.} \item{arbmean}{Deprecated.} \item{arbvar}{Deprecated.} } \value{ \code{normalmixEM} returns a list of class \code{mixEM} with items: \item{x}{The raw data.} \item{lambda}{The final mixing proportions.} \item{mu}{The final mean parameters.} \item{sigma}{The final standard deviation(s)} \item{scale}{Scale factor for the component standard deviations, if applicable.} \item{loglik}{The final log-likelihood.} \item{posterior}{An nxk matrix of posterior probabilities for observations.} \item{all.loglik}{A vector of each iteration's log-likelihood. This vector includes both the initial and the final values; thus, the number of iterations is one less than its length.} \item{restarts}{The number of times the algorithm restarted due to unacceptable choice of initial values.} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{normalmixMMlc}}, \code{\link{normalmixEM}}, \code{\link{mvnormalmixEM}}, \code{\link{normalmixEM2comp}} } \references{ \itemize{ \item Thomas, H., Lohaus, A., and Domsch, H. (2011) Stable Unstable Reliability Theory, \emph{British Journal of Mathematical and Statistical Psychology} 65(2): 201-221. \item Meng, X.-L. and Rubin, D. B. (1993) Maximum Likelihood Estimation Via the ECM Algorithm: A General Framework, \emph{Biometrika} 80(2): 267-278. } } \examples{ ## Analyzing synthetic data as in the tau equivalent model ## From Thomas et al (2011), see also Chauveau and Hunter (2013) ## a 3-component mixture of normals with linear constraints. lbd <- c(0.6,0.3,0.1); m <- length(lbd) sigma <- sig0 <- sqrt(c(1,9,9)) # means constaints mu = M beta M <- matrix(c(1,1,1,0,1,-1), 3, 2) beta <- c(1,5) # unknown constained mean mu0 <- mu <- as.vector(M \%*\% beta) # linear constraint on the inverse variances pi = A.g A <- matrix(c(1,1,1,0,1,0), m, 2, byrow=TRUE) iv0 <- 1/(sig0^2) g0 <- c(iv0[2],iv0[1] - iv0[2]) # gamma^0 init # simulation and EM fits set.seed(40); n=100; x <- rnormmix(n,lbd,mu,sigma) s <- normalmixEM(x,mu=mu0,sigma=sig0,maxit=2000) # plain EM # EM with var and mean linear constraints sc <- normalmixMMlc(x, lambda=lbd, mu=mu0, sigma=sig0, mean.lincstr=M, var.lincstr=A, gparam=g0) # Using tauequivnormalmixEM function to call normalmixMMlc tau <- tauequivnormalmixEM (x, lambda=lbd, mu=mu0, gparam=g0) # plot and compare both estimates dnormmixt <- function(t, lam, mu, sig){ m <- length(lam); f <- 0 for (j in 1:m) f <- f + lam[j]*dnorm(t,mean=mu[j],sd=sig[j]) f} t <- seq(min(x)-2, max(x)+2, len=200) hist(x, freq=FALSE, col="lightgrey", ylim=c(0,0.3), ylab="density",main="") lines(t, dnormmixt(t, lbd, mu, sigma), col="darkgrey", lwd=2) # true lines(t, dnormmixt(t, s$lambda, s$mu, s$sigma), lty=2) lines(t, dnormmixt(t, sc$lambda, sc$mu, sc$sigma), col=1, lty=3) lines(t, dnormmixt(t, tau$lambda, tau$mu, tau$sigma), col=2, lty=4) legend("topleft", c("true","plain EM","constr EM", "Tau Equiv"), col=c("darkgrey",1,1,2), lty=c(1,2,3,4), lwd=c(2,1,1,1)) } \keyword{file} mixtools/man/plotly_mixturegram.Rd0000644000175100001440000001117014342426212017157 0ustar hornikusers\name{plotly_mixturegram} \title{Mixturegrams} \alias{plotly_mixturegram} \usage{ plotly_mixturegram(data, pmbs, method=c("pca","kpca","lda"), all.n=FALSE, id.con=NULL, score=1, iter.max=50, nstart=25, xlab = "K", xlab.size = 15, xtick.size = 15, ylab = NULL, ylab.size = 15, ytick.size = 15, cex = 12, col.dot = "red", width = 1, title = "Mixturegram", title.size = 15, title.x = 0.5, title.y = 0.95) } \description{ Construct a mixturegram for determining an apporpriate number of components using \code{plotly}. } \arguments{ \item{data}{The data, which must either be a vector or a matrix. If a matrix, then the rows correspond to the observations.} \item{pmbs}{A list of length (K-1) such that each element is an nxk matrix of the posterior membership probabilities. These are obtained from each of the "best" estimated k-component mixture models, k = 2,...,K. } \item{method}{The dimension reduction method used. \code{method = "pca"} implements principal components analysis. \code{method = "kpca"} implements kernel principal components analysis. \code{method = "lda"} implements reduced rank linear discriminant analysis. } \item{all.n}{A logical specifying whether the mixturegram should plot the profiles of all observations (\code{TRUE}) or just the K-profile summaries (\code{FALSE}). The default is \code{FALSE}.} \item{id.con}{An argument that allows one to impose some sort of (meaningful) identifiability constraint so that the mixture components are in some sort of comparable order between mixture models with different numbers of components. If \code{NULL}, then the components are ordered by the component means for univariate data or ordered by the first dimension of the component means for multivariate data.} \item{score}{The value for the specified dimension reduction technique's score, which is used for constructing the mixturegram. By default, this value is \code{1}, which is the value that will typically be used. Larger values will result in more variability displayed on the mixturegram. Note that the largest value that can be calculated at each value of k>1 on the mixturegram is p+k-1, where p is the number of columns of \code{data}. } \item{iter.max}{The maximum number of iterations allowed for the k-means clustering algorithm, which is passed to the \code{\link{kmeans}} function. The default is \code{50}. } \item{nstart}{The number of random sets chosen based on k centers, which is passed to the \code{\link{kmeans}} function. The default is \code{25}.} \item{title}{Text of the main title.} \item{title.size}{Size of the main title.} \item{title.x}{Horsizontal position of the main title.} \item{title.y}{Vertical posotion of the main title.} \item{xlab}{Label of X-axis.} \item{xlab.size}{Size of the lable of X-axis.} \item{xtick.size}{Size of tick lables of X-axis.} \item{ylab}{Label of Y-axis.} \item{ylab.size}{Size of the lable of Y-axis.} \item{ytick.size}{Size of tick lables of Y-axis.} \item{cex}{Size of dots.} \item{col.dot}{Color of dots.} \item{width}{Line width.} } \value{ \code{plotly_mixturegram} returns a mixturegram where the profiles are plotted over component values of k = 1,...,K. } \seealso{ \code{\link{boot.comp}}, \code{\link{mixturegram}} } \references{ Young, D. S., Ke, C., and Zeng, X. (2018) The Mixturegram: A Visualization Tool for Assessing the Number of Components in Finite Mixture Models, \emph{Journal of Computational and Graphical Statistics}, \bold{27(3)}, 564--575. } \examples{ \dontrun{ ##Data generated from a 2-component mixture of normals. set.seed(100) n <- 100 w <- rmultinom(n,1,c(.3,.7)) y <- sapply(1:n,function(i) w[1,i]*rnorm(1,-6,1) + w[2,i]*rnorm(1,0,1)) selection <- function(i,data,rep=30){ out <- replicate(rep,normalmixEM(data,epsilon=1e-06, k=i,maxit=5000),simplify=FALSE) counts <- lapply(1:rep,function(j) table(apply(out[[j]]$posterior,1, which.max))) counts.length <- sapply(counts, length) counts.min <- sapply(counts, min) counts.test <- (counts.length != i)|(counts.min < 5) if(sum(counts.test) > 0 & sum(counts.test) < rep) out <- out[!counts.test] l <- unlist(lapply(out, function(x) x$loglik)) tmp <- out[[which.max(l)]] } all.out <- lapply(2:5, selection, data = y, rep = 2) pmbs <- lapply(1:length(all.out), function(i) all.out[[i]]$post) plotly_mixturegram(y, pmbs, method = "pca", all.n = TRUE, id.con = NULL, score = 1, title = "Mixturegram (Well-Separated Data)") } } \keyword{file}mixtools/man/print.mvnpEM.Rd0000755000175100001440000000211014342153463015547 0ustar hornikusers\name{print.mvnpEM} \alias{print.mvnpEM} \title{Printing of Results from the mvnpEM Algorithm Output} \usage{ \method{print}{mvnpEM}(x, \dots) } \arguments{ \item{x}{an object of class \code{mvnpEM} such as a result of a call to \code{\link{mvnpEM}}} \item{\dots}{Additional arguments to \code{\link{print}}} } \description{ \code{\link[base]{print}} method for class \code{mvnpEM}. } \details{ \code{print.mvnpEM} prints the elements of an \code{mvnpEM} object without printing the data or the posterior probabilities. (These may still be accessed as \code{x$data} and \code{x$posteriors}.) } \value{ \code{print.mvnpEM} returns (invisibly) the full value of \code{x} itself, including the \code{data} and \code{posteriors} elements. } \seealso{ \code{\link{mvnpEM}}, \code{\link{plot.mvnpEM}} \code{\link{summary.mvnpEM}} } \examples{ # Example as in Chauveau and Hoang (2015) with 6 coordinates \dontrun{ m=2; r=6; blockid <-c(1,1,2,2,3,3) # 3 bivariate blocks # generate some data x ... a <- mvnpEM(x, mu0=2, blockid, samebw=F) # adaptive bandwidth print(a)} } \keyword{file} mixtools/man/Habituationdata.Rd0000755000175100001440000000276714342153463016335 0ustar hornikusers\name{Habituationdata} \alias{Habituationdata} \docType{data} \title{Infant habituation data} \author{Hoben Thomas} \description{ From Thomas et al (2011): "Habituation is a standard method of studying infant behaviors. Indeed, much of what is known about infant memory and perception rests on habituation methods. Six-month infants (n = 51) were habituated to a checker-board pattern on two occasions, one week apart. On each occasion, the infant was presented with the checkerboard pattern and the length of time the infant viewed the pattern before disengaging was recorded; this denoted the end of a trial. After disengagement, another trial was presented. The procedure was implemented for eleven trials. The conventional index of habituation performance is the summed observed fixation to the checkerboard pattern over the eleven trials. Thus, an index of reliability focuses on how these fixation times, in seconds, on the two assessment occasions correlate: \eqn{r = .29}."} \usage{data(Habituationdata)} \format{A data frame with two variables, \code{m1} and \code{m2}, and 51 cases. The two variables are the summed observations times for the two occasions described above.} \source{ Original source: Thomas et al. (2011). See references section. } \references{ Thomas, H., Lohaus, A., and Domsch, H. (2011), Extensions of Reliability Theory, in Nonparametric Statistics and Mixture Models: A Festschrift in Honor of Thomas Hettmansperger (Singapore: World Scientific), pp. 309-316. } \keyword{datasets} mixtools/man/weibullRMM_SEM.Rd0000644000175100001440000001102614343144476015745 0ustar hornikusers\name{weibullRMM_SEM} \title{St-EM algorithm for Reliability Mixture Models (RMM) of Weibull with right Censoring} \alias{weibullRMM_SEM} \usage{ weibullRMM_SEM(x, d = NULL, lambda = NULL, shape = NULL, scale = NULL, k = 2, maxit = 200, maxit.survreg = 200, epsilon = 1e-03, averaged = TRUE, verb = FALSE) } \description{ Parametric Stochastic EM (St-EM) algorithm for univariate finite mixture of Weibull distributions with randomly right censored data. } \arguments{ \item{x}{A vector of \eqn{n}{n} real positive lifetime (possibly censored) durations. If \code{d} is not \code{NULL} then a vector of random censoring times \code{c} occured, so that \eqn{x= min(x,c)} and \eqn{d = I(x <= c)}.} \item{d}{The vector of censoring indication, where 1 means observed lifetime data, and 0 means censored lifetime data.} \item{lambda}{Initial value of mixing proportions. If \code{NULL}, then \code{lambda} is set to \code{rep(1/k,k)}.} \item{shape}{Initial value of Weibull component shapes, all set to 1 if \code{NULL}.} \item{scale}{Initial value of Weibull component scales, all set to 1 if \code{NULL}.} \item{k}{Number of components of the mixture.} \item{maxit}{The number of iterations allowed, since for St-EM algorithms convergence is not based on stabilization, exactly \code{maxit} iterations are performed (see Bordes L. and Chauveau D. (2016) reference below).} \item{maxit.survreg}{The number of iterations allowed in the computations of the MLE for censored weibull data from the \code{survival} package (see Bordes L. and Chauveau D. (2016) reference below).} \item{epsilon}{Tolerance parameter used in the numerical computations of the MLE for censored weibull data by \code{survreg} from the \code{survival} package (see Bordes L. and Chauveau D. (2016) reference below).} \item{averaged}{The way of updating parameters at each iteration: if \code{TRUE}, current values of the parameters are obtained by averaging the sequence (see Bordes L. and Chauveau D. (2016) reference below).} \item{verb}{If TRUE, print updates for every iteration of the algorithm as it runs} } \details{This St-EM algorithm calls functions from the \code{survival} package to compute parametric MLE for censored weibull data.} \value{ \code{weibullRMM_SEM} returns a list of class "mixEM" with the following items: \item{x}{The input data.} \item{d}{The input censoring indicator.} \item{lambda}{The estimates for the mixing proportions.} \item{scale}{The estimates for the Weibull component scales.} \item{shape}{The estimates for the Weibull component shapes.} \item{loglik}{The log-likelihood value at convergence of the algorithm.} \item{posterior}{An \eqn{n\times k}{n x k} matrix of posterior probabilities for observation, after convergence of the algorithm.} \item{all.loglik}{The sequence of log-likelihoods over iterations.} \item{all.lambda}{The sequence of mixing proportions over iterations.} \item{all.scale}{The sequence of component scales over iterations.} \item{all.shape}{The sequence of component shapes over iterations.} \item{ft}{A character vector giving the name of the function called.} } \seealso{ Related functions: \code{\link{plotweibullRMM}}, \code{\link{summary.mixEM}}. Other models and algorithms for censored lifetime data (name convention is model_algorithm): \code{\link{expRMM_EM}}, \code{\link{spRMM_SEM}}. } \references{ \itemize{ \item Bordes, L., and Chauveau, D. (2016), Stochastic EM algorithms for parametric and semiparametric mixture models for right-censored lifetime data, Computational Statistics, Volume 31, Issue 4, pages 1513-1538. \url{https://link.springer.com/article/10.1007/s00180-016-0661-7} } } \author{Didier Chauveau} \examples{ n = 500 # sample size m = 2 # nb components lambda=c(0.4, 0.6) shape <- c(0.5,5); scale <- c(1,20) # model parameters set.seed(321) x <- rweibullmix(n, lambda, shape, scale) # iid ~ weibull mixture cs=runif(n,0,max(x)+10) # iid censoring times t <- apply(cbind(x,cs),1,min) # censored observations d <- 1*(x <= cs) # censoring indicator ## set arbitrary or "reasonable" (e.g., data-driven) initial values l0 <- rep(1/m,m); sh0 <- c(1, 2); sc0 <- c(2,10) # Stochastic EM algorithm a <- weibullRMM_SEM(t, d, lambda = l0, shape = sh0, scale = sc0, maxit = 200) summary(a) # Parameters estimates etc plotweibullRMM(a) # plot of St-EM sequences plot(a, which=2) # or equivalently, S3 method for "mixEM" object %%\dontrun{ %%} } \keyword{file} mixtools/man/plotseq.npEM.Rd0000644000175100001440000000277614342153463015556 0ustar hornikusers\name{plotseq.npEM} \alias{plotseq.npEM} \title{Plotting sequences of estimates from non- or semiparametric EM-like Algorithm} \usage{ \method{plotseq}{npEM}(x, \dots) } \description{ Returns plots of the sequences of scalar parameter estimates along iterations from an object of class \code{npEM}. } \arguments{ \item{x}{an object of class \code{npEM}, as output by \code{\link{npEM}} or \code{\link{spEMsymloc}}} \item{\dots}{further parameters that are passed to \code{\link{plot}}} } \details{ \code{plotseq.npEM} returns a figure with one plot for each component proportion, and, in the case of \code{\link{spEMsymloc}}, one plot for each component mean. } \seealso{ \code{\link{plot.npEM}}, \code{\link{rnormmix}}, \code{\link{npEM}}, \code{\link{spEMsymloc}} } \references{ \itemize{ \item Benaglia, T., Chauveau, D., and Hunter, D. R. (2009), An EM-like algorithm for semi- and non-parametric estimation in multivariate mixtures, Journal of Computational and Graphical Statistics (to appear). \item Bordes, L., Chauveau, D., and Vandekerkhove, P. (2007), An EM algorithm for a semiparametric mixture model, Computational Statistics and Data Analysis, 51: 5429-5443. } } \examples{ ## Example from a normal location mixture n <- 200 set.seed(100) lambda <- c(1/3,2/3) mu <- c(0, 4); sigma<-rep(1, 2) x <- rnormmix(n, lambda, mu, sigma) b <- spEMsymloc(x, mu0=c(-1, 2), stochastic=FALSE) plotseq(b) bst <- spEMsymloc(x, mu0=c(-1, 2), stochastic=TRUE) plotseq(bst) } \keyword{file} mixtools/man/normalmixEM.Rd0000755000175100001440000001624414342153463015457 0ustar hornikusers\name{normalmixEM} \title{EM Algorithm for Mixtures of Univariate Normals} \alias{normalmixEM} \usage{ normalmixEM(x, lambda = NULL, mu = NULL, sigma = NULL, k = 2, mean.constr = NULL, sd.constr = NULL, epsilon = 1e-08, maxit = 1000, maxrestarts = 20, verb = FALSE, fast = FALSE, ECM = FALSE, arbmean = TRUE, arbvar = TRUE) } \description{ Return EM algorithm output for mixtures of normal distributions. } \details{ This is the standard EM algorithm for normal mixtures that maximizes the conditional expected complete-data log-likelihood at each M-step of the algorithm. If desired, the EM algorithm may be replaced by an ECM algorithm (see \code{ECM} argument) that alternates between maximizing with respect to the \code{mu} and \code{lambda} while holding \code{sigma} fixed, and maximizing with respect to \code{sigma} and \code{lambda} while holding \code{mu} fixed. In the case where \code{arbmean} is \code{FALSE} and \code{arbvar} is \code{TRUE}, there is no closed-form EM algorithm, so the ECM option is forced in this case. } \arguments{ \item{x}{A vector of length n consisting of the data.} \item{lambda}{Initial value of mixing proportions. Automatically repeated as necessary to produce a vector of length \code{k}, then normalized to sum to 1. If \code{NULL}, then \code{lambda} is random from a uniform Dirichlet distribution (i.e., its entries are uniform random and then it is normalized to sum to 1).} \item{mu}{Starting value of vector of component means. If non-NULL and a scalar, \code{arbmean} is set to \code{FALSE}. If non-NULL and a vector, \code{k} is set to \code{length(mu)}. If NULL, then the initial value is randomly generated from a normal distribution with center(s) determined by binning the data.} \item{sigma}{Starting value of vector of component standard deviations for algorithm. If non-NULL and a scalar, \code{arbvar} is set to \code{FALSE}. If non-NULL and a vector, \code{arbvar} is set to \code{TRUE} and \code{k} is set to \code{length(sigma)}. If NULL, then the initial value is the reciprocal of the square root of a vector of random exponential-distribution values whose means are determined according to a binning method done on the data.} \item{k}{Number of components. Initial value ignored unless \code{mu} and \code{sigma} are both NULL.} \item{mean.constr}{Equality constraints on the mean parameters, given as a vector of length \code{k}. Each vector entry helps specify the constraints, if any, on the corresponding mean parameter: If \code{NA}, the corresponding parameter is unconstrained. If numeric, the corresponding parameter is fixed at that value. If a character string consisting of a single character preceded by a coefficient, such as \code{"0.5a"} or \code{"-b"}, all parameters using the same single character in their constraints will fix these parameters equal to the coefficient times some the same free parameter. For instance, if \code{mean.constr = c(NA, 0, "a", "-a")}, then the first mean parameter is unconstrained, the second is fixed at zero, and the third and forth are constrained to be equal and opposite in sign.} \item{sd.constr}{Equality constraints on the standard deviation parameters. See \code{mean.constr}.} \item{epsilon}{The convergence criterion. Convergence is declared when the change in the observed data log-likelihood increases by less than epsilon.} \item{maxit}{The maximum number of iterations.} \item{maxrestarts}{The maximum number of restarts allowed in case of a problem with the particular starting values chosen due to one of the variance estimates getting too small (each restart uses randomly chosen starting values). It is well-known that when each component of a normal mixture may have its own mean and variance, the likelihood has no maximizer; in such cases, we hope to find a "nice" local maximum with this algorithm instead, but occasionally the algorithm finds a "not nice" solution and one of the variances goes to zero, driving the likelihood to infinity.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} \item{fast}{If TRUE and k==2 and arbmean==TRUE, then use \code{\link{normalmixEM2comp}}, which is a much faster version of the EM algorithm for this case. This version is less protected against certain kinds of underflow that can cause numerical problems and it does not permit any restarts. If k>2, \code{fast} is ignored.} \item{ECM}{logical: Should this algorithm be an ECM algorithm in the sense of Meng and Rubin (1993)? If FALSE, the algorithm is a true EM algorithm; if TRUE, then every half-iteration alternately updates the means conditional on the variances or the variances conditional on the means, with an extra E-step in between these updates.} \item{arbmean}{If TRUE, then the component densities are allowed to have different \code{mu}s. If FALSE, then a scale mixture will be fit. Initial value ignored unless \code{mu} is NULL.} \item{arbvar}{If TRUE, then the component densities are allowed to have different \code{sigma}s. If FALSE, then a location mixture will be fit. Initial value ignored unless \code{sigma} is NULL.} } \value{ \code{normalmixEM} returns a list of class \code{mixEM} with items: \item{x}{The raw data.} \item{lambda}{The final mixing proportions.} \item{mu}{The final mean parameters.} \item{sigma}{The final standard deviations. If \code{arbmean} = FALSE, then only the smallest standard deviation is returned. See \code{scale} below.} \item{scale}{If \code{arbmean} = FALSE, then the scale factor for the component standard deviations is returned. Otherwise, this is omitted from the output.} \item{loglik}{The final log-likelihood.} \item{posterior}{An nxk matrix of posterior probabilities for observations.} \item{all.loglik}{A vector of each iteration's log-likelihood. This vector includes both the initial and the final values; thus, the number of iterations is one less than its length.} \item{restarts}{The number of times the algorithm restarted due to unacceptable choice of initial values.} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{mvnormalmixEM}}, \code{\link{normalmixEM2comp}}, \code{\link{normalmixMMlc}}, \code{\link{spEMsymloc}} } \references{ \itemize{ \item McLachlan, G. J. and Peel, D. (2000) \emph{Finite Mixture Models}, John Wiley and Sons, Inc. \item Meng, X.-L. and Rubin, D. B. (1993) Maximum Likelihood Estimation Via the ECM Algorithm: A General Framework, \emph{Biometrika} 80(2): 267-278. \item Benaglia, T., Chauveau, D., Hunter, D. R., and Young, D. mixtools: An R package for analyzing finite mixture models. Journal of Statistical Software, 32(6):1-29, 2009. } } \examples{ ##Analyzing the Old Faithful geyser data with a 2-component mixture of normals. data(faithful) attach(faithful) set.seed(100) system.time(out<-normalmixEM(waiting, arbvar = FALSE, epsilon = 1e-03)) out system.time(out2<-normalmixEM(waiting, arbvar = FALSE, epsilon = 1e-03, fast=TRUE)) out2 # same thing but much faster } \keyword{file} mixtools/man/aug.x.Rd0000755000175100001440000000236314342153463014246 0ustar hornikusers\name{aug.x} \title{Augmented Predictor Function} \alias{aug.x} \usage{ aug.x(X, cp.locs, cp, delta = NULL) } \description{ Creates the augmented predictor matrix based on an appropriately defined changepoint structure. } \arguments{ \item{X}{The raw matrix of predictor values. Note that the raw data matrix should not include a columns of 1's.} \item{cp.locs}{The locations of the changepoints. The length of this vector must be equal to the sum of the entries of \code{cp}.} \item{cp}{A vector having length equal to the number of predictors.} \item{delta}{A vector to accommodate discontinuities. If NULL, then no discontinuities are included. Otherwise, this must be a vector of the same length as \code{cp.locs}.} } \value{ \code{aug.x} returns a matrix of the original matrix \code{X} with the predictor adjusted for changepoints and (optional) discontinuities. } \details{ This function is called by \code{segregmixEM} and the associated internal functions. } \seealso{ \code{\link{segregmixEM}} } \examples{ x <- matrix(1:30, nrow = 10) cp <- c(1, 3, 0) cp.locs <- c(3, 12, 14, 16) d <- rep(0, 4) x1 <- aug.x(x, cp.locs, cp, delta = NULL) x1 x2 <- aug.x(x, cp.locs, cp, delta = d) x2 } \keyword{internal} mixtools/man/plotly_ise.npEM.Rd0000644000175100001440000000651614343061463016245 0ustar hornikusers\name{plotly_ise.npEM} \title{Visualization of Integrated Squared Error for a selected density from npEM output using \code{plotly}} \alias{plotly_ise.npEM} \usage{ plotly_ise.npEM(npEMout, component=1, block=1, truepdf=dnorm, lower=-Inf, upper=Inf, plots = TRUE , col = NULL , width = 3, title = NULL , title.size = 15 , title.x = 0.5 , title.y = 0.95, xlab = "t" , xlab.size = 15 , xtick.size = 15, ylab = "" , ylab.size = 15 , ytick.size = 15, legend.text = "" , legend.text.size = 15 , legend.size = 15, ...) } \description{ This is an updated visualization function for \code{ise.npEM}. For more technical details, please refer to \code{ise.npEM}. } \arguments{ \item{npEMout}{An object of class \code{npEM} such as the output of the \code{\link{npEM}} function} \item{component, block}{Component and block of particular density to analyze from \code{npEMout}.} \item{truepdf}{an \R function taking a numeric first argument and returning a numeric vector of the same length. Returning a non-finite element will generate an error.} \item{lower, upper}{the limits of integration. Can be infinite.} \item{plots}{logical: Should plots be produced?} \item{...}{additional arguments to be passed to \code{truepdf} (and that may be mandatory like, e.g., the \code{df = } argument of \code{dt}). Remember to use argument names not matching those of \code{ise.npRM}.} \item{col}{Color of traces.} \item{width}{Line width of traces.} \item{title}{Text of the main title.} \item{title.size}{Size of the main title.} \item{title.x}{Horsizontal position of the main title.} \item{title.y}{Vertical posotion of the main title.} \item{xlab}{Label of X-axis.} \item{xlab.size}{Size of the lable of X-axis.} \item{xtick.size}{Size of tick lables of X-axis.} \item{ylab}{Label of Y-axis.} \item{ylab.size}{Size of the lable of Y-axis.} \item{ytick.size}{Size of tick lables of Y-axis.} \item{legend.text}{Title of legend.} \item{legend.text.size}{Size of the legend title.} \item{legend.size}{Size of legend.} } \value{ Just as for the \code{\link{integrate}} function, a list of class \code{"integrate"} with components \item{value}{the final estimate of the integral.} \item{abs.error}{estimate of the modulus of the absolute error.} \item{subdivisions}{the number of subintervals produced in the subdivision process.} \item{message}{\code{"OK"} or a character string giving the error message.} \item{call}{the matched call.} } \details{This function calls the \code{\link{wkde}} (weighted kernel density estimate) function. } \seealso{ \code{\link{npEM}}, \code{\link{wkde}}, \code{\link{integrate}}, \code{\link{ise.npEM}} } \references{ \itemize{ \item Benaglia, T., Chauveau, D., and Hunter, D. R. (2009), An EM-like algorithm for semi- and non-parametric estimation in multivariate mixtures, Journal of Computational and Graphical Statistics, 18, 505-526. \item Benaglia, T., Chauveau, D., Hunter, D. R., and Young, D. (2009), mixtools: An R package for analyzing finite mixture models. Journal of Statistical Software, 32(6):1-29. } } \examples{ \dontrun{ data(Waterdata) set.seed(100) a <- npEM(Waterdata[,3:10], mu0=3, bw=4) # Assume indep but not iid plotly_ise.npEM(a , plots = TRUE) } } \keyword{file} mixtools/man/regmixEM.loc.Rd0000755000175100001440000000723414342153463015517 0ustar hornikusers\name{regmixEM.loc} \title{Iterative Algorithm Using EM Algorithm for Mixtures of Regressions with Local Lambda Estimates} \alias{regmixEM.loc} \usage{ regmixEM.loc(y, x, lambda = NULL, beta = NULL, sigma = NULL, k = 2, addintercept = TRUE, kern.l = c("Gaussian", "Beta", "Triangle", "Cosinus", "Optcosinus"), epsilon = 1e-08, maxit = 10000, kernl.g = 0, kernl.h = 1, verb = FALSE) } \description{ Iterative algorithm returning EM algorithm output for mixtures of multiple regressions where the mixing proportions are estimated locally. } \arguments{ \item{y}{An n-vector of response values.} \item{x}{An nxp matrix of predictors. See \code{addintercept} below.} \item{lambda}{An nxk matrix of initial local values of mixing proportions. Entries should sum to 1. This determines number of components. If NULL, then \code{lambda} is simply one over the number of components.} \item{beta}{Initial global values of \code{beta} parameters. Should be a pxk matrix, where p is the number of columns of x and \code{k} is number of components. If NULL, then \code{beta} has uniform standard normal entries. If both \code{lambda} and \code{beta} are NULL, then number of components is determined by \code{sigma}.} \item{sigma}{A k-vector of initial global values of standard deviations. If NULL, then \eqn{1/\code{sigma}^2} has random standard exponential entries. If \code{lambda}, \code{beta}, and \code{sigma} are NULL, then number of components determined by \code{k}.} \item{k}{Number of components. Ignored unless all of \code{lambda}, \code{beta}, and \code{sigma} are NULL.} \item{addintercept}{If TRUE, a column of ones is appended to the x matrix before the value of p is calculated.} \item{kern.l}{The type of kernel to use in the local estimation of \code{lambda}.} \item{epsilon}{The convergence criterion.} \item{maxit}{The maximum number of iterations.} \item{kernl.g}{A shape parameter required for the symmetric beta kernel for local estimation of \code{lambda}. The default is g = 0 which yields the uniform kernel. Some common values are g = 1 for the Epanechnikov kernel, g = 2 for the biweight kernel, and g = 3 for the triweight kernel.} \item{kernl.h}{The bandwidth controlling the size of the window used in the local estimation of lambda around x.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} } \value{ \code{regmixEM.loc} returns a list of class \code{mixEM} with items: \item{x}{The set of predictors (which includes a column of 1's if \code{addintercept} = TRUE).} \item{y}{The response values.} \item{lambda.x}{The final local mixing proportions.} \item{beta}{The final global regression coefficients.} \item{sigma}{The final global standard deviations.} \item{loglik}{The final log-likelihood.} \item{posterior}{An nxk matrix of posterior probabilities for observations.} \item{all.loglik}{A vector of each iteration's log-likelihood.} \item{restarts}{The number of times the algorithm restarted due to unacceptable choice of initial values.} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{regmixEM.lambda}} } \examples{ ## Compare a 2-component and 3-component fit to NOdata. data(NOdata) attach(NOdata) set.seed(100) out1 <- regmixEM.loc(Equivalence, NO, kernl.h = 2, epsilon = 1e-02, verb = TRUE) out2 <- regmixEM.loc(Equivalence, NO, kernl.h = 2, k = 3, epsilon = 1e-02, verb = TRUE) c(out1$loglik, out2$loglik) } \keyword{file} mixtools/man/wkde.Rd0000755000175100001440000000355214342153463014157 0ustar hornikusers\name{wkde} \title{Weighted Univariate (Normal) Kernel Density Estimate} \alias{wkde} \alias{wkde.symm} \usage{ wkde(x, u=x, w=rep(1, length(x)), bw=bw.nrd0(as.vector(x)), sym=FALSE) } \description{ Evaluates a weighted kernel density estimate, using a Gaussian kernel, at a specified vector of points. } \arguments{ \item{x}{Data} \item{u}{Points at which density is to be estimated} \item{w}{Weights (same length as \code{x})} \item{bw}{Bandwidth} \item{sym}{Logical: Symmetrize about zero?} } \value{A vector of the same length as \code{u} } \seealso{ \code{\link{npEM}}, \code{\link{ise.npEM}} } \references{ \itemize{ \item Benaglia, T., Chauveau, D., and Hunter, D. R. (2009), An EM-like algorithm for semi- and non-parametric estimation in multivariate mixtures, Journal of Computational and Graphical Statistics, 18, 505-526. \item Benaglia, T., Chauveau, D., Hunter, D. R., and Young, D. (2009), mixtools: An R package for analyzing finite mixture models. Journal of Statistical Software, 32(6):1-29. } } \examples{ # Mixture with mv gaussian model set.seed(100) m <- 2 # no. of components r <- 3 # no. of repeated measures (coordinates) lambda <- c(0.4, 0.6) mu <- matrix(c(0, 0, 0, 4, 4, 6), m, r, byrow=TRUE) # means sigma <- matrix(rep(1, 6), m, r, byrow=TRUE) # stdevs centers <- matrix(c(0, 0, 0, 4, 4, 4), 2, 3, byrow=TRUE) # initial centers for est blockid = c(1,1,2) # block structure of coordinates n = 100 x <- rmvnormmix(n, lambda, mu, sigma) # simulated data a <- npEM(x, centers, blockid, eps=1e-8, verb=FALSE) par(mfrow=c(2,2)) u <- seq(min(x), max(x), len=200) for(j in 1:2) { for(b in 1:2) { xx <- as.vector(x[,a$blockid==b]) wts <- rep(a$post[,j], length.out=length(xx)) bw <- a$bandwidth title <- paste("j =", j, "and b =", b) plot(u, wkde(xx, u, wts, bw), type="l", main=title) } } } \keyword{file} mixtools/man/CO2data.Rd0000755000175100001440000000154114762771725014453 0ustar hornikusers\name{CO2data} \docType{data} \title{GNP and CO2 Data Set} \alias{CO2data} \usage{ data(CO2data) } \description{ This data set gives the gross national product (GNP) per capita in 1996 for various countries as well as their estimated carbon dioxide (CO2) emission per capita for the same year. } \format{This data frame consists of 28 countries and the following columns: \describe{ \item{\code{GNP}}{The gross national product per capita in 1996.} \item{\code{CO2}}{The estimated carbon dioxide emission per capita in 1996.} \item{\code{country}}{An abbreviation pertaining to the country measured (e.g., "GRC" = Greece and "CH" = Switzerland).} } } \references{ Hurn, M., Justel, A. and Robert, C. P. (2003) Estimating Mixtures of Regressions, \emph{Journal of Computational and Graphical Statistics} \bold{12(1)}, 55--79. } \keyword{datasets} mixtools/man/spregmix.Rd0000755000175100001440000001321214342153463015055 0ustar hornikusers\name{spregmix} \title{EM-like Algorithm for Semiparametric Mixtures of Regressions} \alias{spregmix} \usage{ spregmix(lmformula, bw = NULL, constbw = FALSE, bwmult = 0.9, z.hat = NULL, symm = TRUE, betamethod = "LS", m = ifelse(is.null(z.hat), 2, ncol(z.hat)), epsilon = 1e-04, maxit = 1000, verbose = FALSE, \dots) } \description{ Returns parameter estimates for finite mixtures of linear regressions with unspecified error structure. Based on Hunter and Young (2012). } \arguments{ \item{lmformula}{Formula for a linear model, in the same format used by \code{\link{lm}}. Additional parameters may be passed to \code{\link{lm}} via the \code{...} argument.} \item{bw}{Initial bandwidth value. If NULL, this will be chosen automatically by the algorithm.} \item{constbw}{Logical: If TRUE, the bandwidth is held constant throughout the algorithm; if FALSE, it adapts at each iteration according to the rules given in Hunter and Young (2012).} \item{bwmult}{ Whenever it is updated automatically, the bandwidth is equal to \code{bwmult} divided by the fifth root of \eqn{n} times the smaller of s and IQR/1.34, where s and IQR are estimates of the standard deviation and interquartile range of the residuals, as explained in Hunter and Young (2012). The value of 0.9 gives the rule of Silverman (1986) and the value of 1.06 gives the rule of Scott (1992). Larger values lead to greater smoothing, whereas smaller values lead to less smoothing. } \item{z.hat}{Initial nxm matrix of posterior probabilities. If NULL, this is initialized randomly. As long as a parametric estimation method like least squares is used to estimate \code{beta} in each M-step, the \code{z.hat} values are the only values necessary to begin the EM iterations.} \item{symm}{Logical: If TRUE, the error density is assumed symmetric about zero. If FALSE, it is not. WARNING: If FALSE, the intercept parameter is not uniquely identifiable if it is included in the linear model.} \item{betamethod}{Method of calculating beta coefficients in the M-step. Current possible values are "LS" for least-squares; "L1" for least absolute deviation; "NP" for fully nonparametric; and "transition" for a transition from least squares to fully nonparametric. If something other than these four possibilities is used, then "NP" is assumed. For details of these methods, see Hunter and Young (2012).} \item{m}{Number of components in the mixture.} \item{epsilon}{Convergence is declared if the largest change in any lambda or beta coordinate is smaller than \code{epsilon}.} \item{maxit}{The maximum number of iterations; if convergence is never declared based on comparison with \code{epsilon}, then the algorithm stops after \code{maxit} iterations.} \item{verbose}{Logical: If TRUE, then various updates are printed during each iteration of the algorithm.} \item{\dots}{Additional parameters passed to the \code{\link{model.frame}} and \code{\link{model.matrix}} functions, which are used to obtain the response and predictor of the regression.} } \value{ \code{regmixEM} returns a list of class \code{npEM} with items: \item{x}{The set of predictors (which includes a column of 1's if \code{addintercept} = TRUE).} \item{y}{The response values.} \item{lambda}{The mixing proportions for every iteration in the form of a matrix with m columns and (#iterations) rows} \item{beta}{The final regression coefficients.} \item{posterior}{An nxm matrix of posterior probabilities for observations.} \item{np.stdev}{Nonparametric estimate of the standard deviation, as given in Hunter and Young (2012)} \item{bandwidth}{Final value of the bandwidth} \item{density.x}{Points at which the error density is estimated} \item{density.y}{Values of the error density at the points \code{density.x}} \item{symmetric}{Logical: Was the error density assumed symmetric?} \item{loglik}{A quantity similar to a log-likelihood, computed just like a standard loglikelihood would be, conditional on the component density functions being equal to the final density estimates.} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{regmixEM}}, \code{\link{spEMsymloc}}, \code{\link{lm}} } \references{ Hunter, D. R. and Young, D. S. (2012) Semi-parametric Mixtures of Regressions, Journal of Nonparametric Statistics 24(1): 19-38. Scott, D. W. (1992) \emph{Multivariate Density Estimation}, John Wiley & Sons Inc., New York. Silverman, B. W. (1986). \emph{Density Estimation for Statistics and Data Analysis}, Chapman & Hall, London. } \examples{ data(tonedata) ## By default, the bandwidth will adapt and the error density is assumed symmetric set.seed(100) a=spregmix(tuned~stretchratio, bw=.2, data=tonedata, verb=TRUE) ## Look at the sp mixreg solution: plot(tonedata) abline(a=a$beta[1,1],b=a$beta[2,1], col=2) abline(a=a$beta[1,2],b=a$beta[2,2], col=3) ## Look at the nonparametric KD-based estimate of the error density, ## constrained to be zero-symmetric: plot(xx<-a$density.x, yy<-a$density.y, type="l") ## Compare to a normal density with mean 0 and NP-estimated stdev: z <- seq(min(xx), max(xx), len=200) lines(z, dnorm(z, sd=sqrt((a$np.stdev)^2+a$bandwidth^2)), col=2, lty=2) # Add bandwidth^2 to variance estimate to get estimated var of KDE ## Now add the sp mixreg estimate without assuming symmetric errors: b=spregmix(tuned~stretchratio, bw=.2, , symm=FALSE, data=tonedata, verb=TRUE) lines(b$density.x, b$density.y, col=3) } \keyword{file} mixtools/man/plot.mvnpEM.Rd0000755000175100001440000000344614342153463015406 0ustar hornikusers\name{plot.mvnpEM} \title{Plots of Marginal Density Estimates from the mvnpEM Algorithm Output} \alias{plot.mvnpEM} \usage{ \method{plot}{mvnpEM}(x, truenorm = FALSE, lambda = NULL, mu = NULL, v = NULL, lgdcex = 1, \dots) } \description{ Takes an object of class \code{mvnpEM}, as the one returned by the \code{\link{mvnpEM}} algorithm, and returns a set of plots of the density estimates for each coordinate within each multivariate block. All the components are displayed on each plot so it is possible to see the mixture structure for each coordinate and block. The final bandwidth values are also displayed, in a format depending on the bandwidth strategy . } \arguments{ \item{x}{An object of class \code{mvnpEM} such as the output of the \code{\link{mvnpEM}} function} \item{truenorm}{Mostly for checking purpose, if the nonparametric model is to be compared with a multivariate Gaussian mixture as the true model.} \item{lambda}{true weight parameters, for Gaussian models only (see above)} \item{mu}{true mean parameters, for Gaussian models only (see above)} \item{v}{true covariance matrices, for Gaussian models only (see above)} \item{lgdcex}{Character expansion factor for \code{\link{legend}}.} \item{\dots}{Any remaining arguments are passed to \code{\link{hist}}.} } \value{ \code{plot.mvnpEM} currently just plots the figure. } \seealso{ \code{\link{mvnpEM}}, \code{\link{npEM}}, \code{\link{density.npEM}} } \examples{ # example as in Chauveau and Hoang (2015) with 6 coordinates \dontrun{ m=2; r=6; blockid <-c(1,1,2,2,3,3) # 3 bivariate blocks # generate some data x ... a <- mvnpEM(x, mu0=2, blockid, samebw=F) # adaptive bandwidth plot(a) # this S3 method produces 6 plots of univariate marginals summary(a)} } \keyword{file} mixtools/man/dmvnorm.Rd0000755000175100001440000000235414342153463014706 0ustar hornikusers\name{dmvnorm} \alias{dmvnorm} \alias{logdmvnorm} \title{The Multivariate Normal Density} \description{ Density and log-density for the multivariate normal distribution with mean equal to \code{mu} and variance matrix equal to \code{sigma}. } \usage{ dmvnorm(y, mu=NULL, sigma=NULL) logdmvnorm(y, mu=NULL, sigma=NULL) } \arguments{ \item{y}{Either a \eqn{d} - vector or an \eqn{n\times d}{n x d} matrix, where \eqn{d} is the dimension of the normal distribution and \eqn{n} is the number of points at which the density is to be evaluated.} \item{mu}{\eqn{d} - vector: Mean of the normal distribution (or NULL uses the origin as default)} \item{sigma}{This \eqn{d\times d}{d x d} matrix is the variance matrix of the normal distribution (or NULL uses the identity matrix as default)} } \value{ \code{dmvnorm} gives the densities, while \code{logdmvnorm} gives the logarithm of the densities. } \details{ This code is written to be efficient, using the qr-decomposition of the covariance matrix (and using it only once, rather than recalculating it for both the determinant and the inverse of \code{sigma}). } \seealso{ \code{\link{qr}}, \code{\link{qr.solve}}, \code{\link{dnorm}}, \code{\link{rmvnorm}} } \keyword{distribution} mixtools/man/regmixEM.Rd0000755000175100001440000000732514342153463014744 0ustar hornikusers\name{regmixEM} \title{EM Algorithm for Mixtures of Regressions} \alias{regmixEM} \usage{ regmixEM(y, x, lambda = NULL, beta = NULL, sigma = NULL, k = 2, addintercept = TRUE, arbmean = TRUE, arbvar = TRUE, epsilon = 1e-08, maxit = 10000, verb = FALSE) } \description{ Returns EM algorithm output for mixtures of multiple regressions with arbitrarily many components. } \arguments{ \item{y}{An n-vector of response values.} \item{x}{An nxp matrix of predictors. See \code{addintercept} below.} \item{lambda}{Initial value of mixing proportions. Entries should sum to 1. This determines number of components. If NULL, then \code{lambda} is random from uniform Dirichlet and number of components is determined by \code{beta}.} \item{beta}{Initial value of \code{beta} parameters. Should be a pxk matrix, where p is the number of columns of x and k is number of components. If NULL, then \code{beta} has standard normal entries according to a binning method done on the data. If both \code{lambda} and \code{beta} are NULL, then number of components is determined by \code{sigma}.} \item{sigma}{A vector of standard deviations. If NULL, then 1/\code{sigma}^2 has random standard exponential entries according to a binning method done on the data. If \code{lambda}, \code{beta}, and \code{sigma} are NULL, then number of components is determined by \code{k}.} \item{k}{Number of components. Ignored unless all of \code{lambda}, \code{beta}, and \code{sigma} are NULL.} \item{addintercept}{If TRUE, a column of ones is appended to the x matrix before the value of p is calculated.} \item{arbmean}{If TRUE, each mixture component is assumed to have a different set of regression coefficients (i.e., the \code{beta}s).} \item{arbvar}{If TRUE, each mixture component is assumed to have a different \code{sigma}.} \item{epsilon}{The convergence criterion.} \item{maxit}{The maximum number of iterations.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} } \value{ \code{regmixEM} returns a list of class \code{mixEM} with items: \item{x}{The set of predictors (which includes a column of 1's if \code{addintercept} = TRUE).} \item{y}{The response values.} \item{lambda}{The final mixing proportions.} \item{beta}{The final regression coefficients.} \item{sigma}{The final standard deviations. If \code{arbmean} = FALSE, then only the smallest standard deviation is returned. See \code{scale} below.} \item{scale}{If \code{arbmean} = FALSE, then the scale factor for the component standard deviations is returned. Otherwise, this is omitted from the output.} \item{loglik}{The final log-likelihood.} \item{posterior}{An nxk matrix of posterior probabilities for observations.} \item{all.loglik}{A vector of each iteration's log-likelihood.} \item{restarts}{The number of times the algorithm restarted due to unacceptable choice of initial values.} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{regcr}}, \code{\link{regmixMH}} } \references{ de Veaux, R. D. (1989), Mixtures of Linear Regressions, \emph{Computational Statistics and Data Analysis} 8, 227-245. Hurn, M., Justel, A. and Robert, C. P. (2003) Estimating Mixtures of Regressions, \emph{Journal of Computational and Graphical Statistics} \bold{12(1)}, 55--79. McLachlan, G. J. and Peel, D. (2000) \emph{Finite Mixture Models}, John Wiley and Sons, Inc. } \examples{ ## EM output for NOdata. data(NOdata) attach(NOdata) set.seed(100) em.out <- regmixEM(Equivalence, NO, verb = TRUE, epsilon = 1e-04) em.out[3:6] } \keyword{file} mixtools/man/boot.comp.Rd0000755000175100001440000001153214342153463015122 0ustar hornikusers\name{boot.comp} \title{Performs Parametric Bootstrap for Sequentially Testing the Number of Components in Various Mixture Models} \alias{boot.comp} \usage{ boot.comp(y, x = NULL, N = NULL, max.comp = 2, B = 100, sig = 0.05, arbmean = TRUE, arbvar = TRUE, mix.type = c("logisregmix", "multmix", "mvnormalmix", "normalmix", "poisregmix", "regmix", "regmix.mixed", "repnormmix"), hist = TRUE, ...) } \description{ Performs a parametric bootstrap by producing B bootstrap realizations of the likelihood ratio statistic for testing the null hypothesis of a k-component fit versus the alternative hypothesis of a (k+1)-component fit to various mixture models. This is performed for up to a specified number of maximum components, k. A p-value is calculated for each test and once the p-value is above a specified significance level, the testing terminates. An optional histogram showing the distribution of the likelihood ratio statistic along with the observed statistic can also be produced. } \arguments{ \item{y}{The raw data for \code{multmix}, \code{mvnormalmix}, \code{normalmix}, and \code{repnormmix} and the response values for \code{logisregmix}, \code{poisregmix}, and \code{regmix}. See the documentation concerning their respective EM algorithms for specific structure of the raw data.} \item{x}{The predictor values required only for the regression mixtures \code{logisregmix}, \code{poisregmix}, and \code{regmix}. A column of 1s for the intercept term must not be included! See the documentation concerning their respective EM algorithms for specific structure of the predictor values.} \item{N}{An n-vector of number of trials for the logistic regression type \code{logisregmix}. If NULL, then \code{N} is an n-vector of 1s for binary logistic regression.} \item{max.comp}{The maximum number of components to test for. The default is 2. This function will perform a test of k-components versus (k+1)-components sequentially until we fail to reject the null hypothesis. This decision rule is governed by the calculated p-value and \code{sig}.} \item{B}{The number of bootstrap realizations of the likelihood ratio statistic to produce. The default is 100, but ideally, values of 1000 or more would be more acceptable.} \item{sig}{The significance level for which to compare the p-value against when performing the test of k-components versus (k+1)-components.} \item{arbmean}{If FALSE, then a scale mixture analysis can be performed for \code{mvnormalmix}, \code{normalmix}, \code{regmix}, or \code{repnormmix}. The default is TRUE.} \item{arbvar}{If FALSE, then a location mixture analysis can be performed for \code{mvnormalmix}, \code{normalmix}, \code{regmix}, or \code{repnormmix}. The default is TRUE.} \item{mix.type}{The type of mixture analysis you wish to perform. The data inputted for \code{y} and \code{x} depend on which type of mixture is selected. \code{logisregmix} corresponds to a mixture of logistic regressions. \code{multmix} corresponds to a mixture of multinomials with data determined by the cut-point method. \code{mvnormalmix} corresponds to a mixture of multivariate normals. \code{normalmix} corresponds to a mixture of univariate normals. \code{poisregmix} corresponds to a mixture of Poisson regressions. \code{regmix} corresponds to a mixture of regressions with normal components. \code{regmix.mixed} corresponds to a mixture of regressions with random or mixed effects. \code{repnormmix} corresponds to a mixture of normals with repeated measurements.} \item{hist}{An argument to provide a matrix plot of histograms for the boostrapped likelihood ratio statistic.} \item{...}{Additional arguments passed to the various EM algorithms for the mixture of interest.} } \value{ \code{boot.comp} returns a list with items: \item{p.values}{The p-values for each test of k-components versus (k+1)-components.} \item{log.lik}{The B bootstrap realizations of the likelihood ratio statistic.} \item{obs.log.lik}{The observed likelihood ratio statistic for each test which is used in determining the p-values.} } \seealso{ \code{\link{logisregmixEM}}, \code{\link{multmixEM}}, \code{\link{mvnormalmixEM}}, \code{\link{normalmixEM}}, \code{\link{poisregmixEM}}, \code{\link{regmixEM}}, \code{\link{regmixEM.mixed}}, \code{\link{repnormmixEM}} } \references{ McLachlan, G. J. and Peel, D. (2000) \emph{Finite Mixture Models}, John Wiley and Sons, Inc. } \examples{ ## Bootstrapping to test the number of components on the RTdata. data(RTdata) set.seed(100) x <- as.matrix(RTdata[, 1:3]) y <- makemultdata(x, cuts = quantile(x, (1:9)/10))$y a <- boot.comp(y = y, max.comp = 1, B = 5, mix.type = "multmix", epsilon = 1e-3) a$p.values } \keyword{file} mixtools/man/spEMsymlocN01.Rd0000644000175100001440000001257714342153463015603 0ustar hornikusers\name{spEMsymlocN01} \alias{spEMsymlocN01} \title{semiparametric EM-like algorithm for univariate mixture in False Discovery Rate (FDR) estimation} \description{Return semiparametric EM-like algorithm output for a 2-components mixture model with one component set to Normal(0,1), and the other component being a unspecified but symmetric density with a location parameter. This model is tailored to FDR estimation on probit transform (\code{qnorm}) of p-values arising from multiple testing.} \usage{ spEMsymlocN01(x, mu0 = 2, bw = bw.nrd0(x), h=bw, eps = 1e-8, maxiter = 100, verbose = FALSE, plotf = FALSE)} \arguments{ \item{x}{A vector of length n consisting of the data, probit transform of pvalues, preferably sorted.} \item{mu0}{Starting value of vector of component means. If not set then the initial value is randomly generated by a \code{kmeans} of the data in two bins. Since component 1 is theoretically normal(0,1), \code{mu[1]} must be 0 and \code{mu[2]} some negative value (see details).} \item{bw}{Bandwidth for weighted kernel density estimation.} \item{h}{Alternative way to specify the bandwidth, to provide backward compatibility.} \item{eps}{Tolerance limit for declaring algorithm convergence. Convergence is declared before \code{maxiter} iterations whenever the maximum change in any coordinate of the \code{lambda} (mixing proportion estimates) and \code{mu} (mean of the semiparametric component) vector does not exceed \code{eps}} \item{maxiter}{The maximum number of iterations allowed; convergence may be declared before \code{maxiter} iterations (see \code{eps} above).} \item{verbose}{If TRUE, print updates for every iteration of the algorithm as it runs.} \item{plotf}{If TRUE, plots successive updates of the nonparametric density estimate over iterations. Mostly for testing purpose.} } \details{This algorithm is a specific version of semiparametric EM-like algorithm similar in spirit to \code{\link{spEMsymloc}}, but specialized for FDR estimation on probit transform (\code{qnorm}) of p-values in multiple testing framework. In this model, component 1 corresponds to the individuals under the null hypothesis, i.e. theoretically normal(0,1) distributed, whereas component 2 corresponds to individuals in the alternative hypothesis, with typically very small p-values and consequently negative values for probit(p) data. This model only assumes that these individuals come from an unspecified but symmetric density with a location parameter, as in Bordes and Vandekerkhove (2010) and Chauveau et al. (2014).} \value{ \code{spEMsymlocN01} returns a list of class \code{spEMN01} with the following items: \item{data}{The raw data (an \eqn{n\times r}{n x r} matrix).} \item{posteriors}{An \eqn{n\times 2}{n x 2} matrix of posterior probabilities for observations. This can be used in, e.g., \code{\link{plotFDR}} to plot False Discovery Rate estimates.} \item{bandwidth}{Same as the \code{bw} input argument, returned because this information is needed by any method that produces density estimates from the output.} \item{lambda}{The sequence of mixing proportions over iterations.} \item{lambdahat}{The final estimate for mixing proportions.} \item{mu}{the sequence of second component mean over iterations.} \item{muhat}{the final estimate of second component mean.} \item{symmetric}{Flag indicating that the kernel density estimate is using a symmetry assumption.} } \references{ \itemize{ \item Bordes, L. and Vandekerkhove, P. (2010). Semiparametric two-component mixture model with a known component: an asymptotically normal estimator. Mathematical Methods of Statistics, 19(1):22-41 \item Chauveau, D., Saby, N., Orton, T. G., Lemercier B., Walter, C. and Arrouys, D. (2014) Large-scale simultaneous hypothesis testing in monitoring carbon content from french soil database: A semi-parametric mixture approach. Geoderma 219-220 (2014): 117-124. } } \author{Didier Chauveau} \seealso{ \code{\link{spEMsymloc}}, \code{\link{normalmixEM}}, \code{\link{npEM}}, \code{\link{plot.spEMN01}}, \code{\link{plotFDR}} } \examples{ ## Probit transform of p-values ## from a Beta-Uniform mixture model ## comparion of parametric and semiparametric EM fit ## Note: in actual situations n=thousands set.seed(50) n=300 # nb of multiple tests m=2 # 2 mixture components a=c(1,0.1); b=c(1,1); lambda=c(0.6,0.4) # parameters z=sample(1:m, n, rep=TRUE, prob = lambda) p <- rbeta(n, shape1 = a[z], shape2 = b[z]) # p-values o <- order(p) cpd <- cbind(z,p)[o,] # sorted complete data, z=1 if H0, 2 if H1 p <- cpd[,2] # sorted p-values y <- qnorm(p) # probit transform of the pvalues # gaussian EM fit with component 1 constrained to N(0,1) s1 <- normalmixEM(y, mu=c(0,-4), mean.constr = c(0,NA), sd.constr = c(1,NA)) s2 <- spEMsymlocN01(y, mu0 = c(0,-3)) # spEM with N(0,1) fit hist(y, freq = FALSE, col = 8, main = "histogram of probit(pvalues)") plot(s2, add.plot = TRUE, lwd = 2) # Exemples of plot capabilities # Note: posteriors must be ordered by p for plot.FDR # plotFDR(s1$post) # when true complete data not observed # plotFDR(s1$post, s2$post) # comparing 2 strategies plotFDR(s1$post, s2$post, lg1 = "normalmixEM", lg2 = "spEMsymlocN01", complete.data = cpd) # with true FDR computed from z } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{file} mixtools/man/summary.npEM.Rd0000644000175100001440000000367014342153463015556 0ustar hornikusers\name{summary.npEM} \alias{summary.npEM} \alias{print.summary.npEM} \title{Summarizing non- and semi-parametric multivariate mixture model fits} \usage{ \method{summary}{npEM}(object, \dots) \method{print}{summary.npEM}(x, digits=3, \dots) } \arguments{ \item{object,x}{an object of class \code{npEM} such as a result of a call to \code{\link{npEM}}} \item{digits}{Significant digits for printing values} \item{\dots}{further arguments passed to or from other methods.} } \description{ \code{\link[base]{summary}} method for class \code{npEM}. } \details{ \code{\link{summary.npEM}} prints means and variances of each block for each component. These quantities might not be part of the model, but they are estimated nonparametrically based on the posterior probabilities and the data. } \value{ The function \code{\link{summary.npEM}} returns a list of type \code{summary.npEM} with the following components: \item{n}{The number of observations} \item{m}{The number of mixture components} \item{B}{The number of blocks} \item{blockid}{The block ID (from 1 through B) for each of the coordinates of the multivariate observations. The \code{blockid} component is of length \eqn{r}, the dimension of each observation.} \item{means}{A \eqn{B\times m}{B x m} matrix giving the estimated mean of each block in each component.} \item{variances}{Same as \code{means} but giving the estimated variances instead.} } \references{ Benaglia, T., Chauveau, D., and Hunter, D. R. (2009), An EM-like algorithm for semi- and non-parametric estimation in multivariate mixtures, \emph{Journal of Computational and Graphical Statistics}, \bold{18(2)}, 505--526. } \seealso{ \code{\link{npEM}}, \code{\link{plot.npEM}} } \examples{ data(Waterdata) set.seed(100) \dontrun{ a <- npEM(Waterdata[,3:10], 3, bw=4) # Assume indep but not iid summary(a) b <- npEM(Waterdata[,3:10], 3, bw=4, blockid=rep(1,8)) # Now assume iid summary(b) } } \keyword{file} mixtools/man/multmixEM.Rd0000755000175100001440000000602614342153463015145 0ustar hornikusers\name{multmixEM} \title{EM Algorithm for Mixtures of Multinomials} \alias{multmixEM} \usage{ multmixEM(y, lambda = NULL, theta = NULL, k = 2, maxit = 10000, epsilon = 1e-08, verb = FALSE) } \description{ Return EM algorithm output for mixtures of multinomial distributions. } \arguments{ \item{y}{Either An nxp matrix of data (multinomial counts), where n is the sample size and p is the number of multinomial bins, or the output of the \code{\link{makemultdata}} function. It is not necessary that all of the rows contain the same number of multinomial trials (i.e., the row sums of \code{y} need not be identical).} \item{lambda}{Initial value of mixing proportions. Entries should sum to 1. This determines number of components. If NULL, then \code{lambda} is random from uniform Dirichlet and number of components is determined by \code{theta}.} \item{theta}{Initial value of \code{theta} parameters. Should be a kxp matrix, where p is the number of columns of y and k is number of components. Each row of \code{theta} should sum to 1. If NULL, then each row is random from uniform Dirichlet. If both \code{lambda} and \code{theta} are NULL, then number of components is determined by k.} \item{k}{Number of components. Ignored unless \code{lambda} and \code{theta} are NULL.} \item{epsilon}{The convergence criterion.} \item{maxit}{The maximum number of iterations.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} } \value{ \code{multmixEM} returns a list of class \code{mixEM} with items: \item{y}{The raw data.} \item{lambda}{The final mixing proportions.} \item{theta}{The final multinomial parameters.} \item{loglik}{The final log-likelihood.} \item{posterior}{An nxk matrix of posterior probabilities for observations.} \item{all.loglik}{A vector of each iteration's log-likelihood.} \item{restarts}{The number of times the algorithm restarted due to unacceptable choice of initial values.} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{compCDF}}, \code{\link{makemultdata}}, \code{\link{multmixmodel.sel}} } \references{ \itemize{ \item McLachlan, G. J. and Peel, D. (2000) \emph{Finite Mixture Models}, John Wiley and Sons, Inc. \item Elmore, R. T., Hettmansperger, T. P. and Xuan, F. (2004) The Sign Statistic, One-Way Layouts and Mixture Models, \emph{Statistical Science} \bold{19(4)}, 579--587. } } \examples{ ## The sulfur content of the coal seams in Texas set.seed(100) A <- c(1.51, 1.92, 1.08, 2.04, 2.14, 1.76, 1.17) B <- c(1.69, 0.64, .9, 1.41, 1.01, .84, 1.28, 1.59) C <- c(1.56, 1.22, 1.32, 1.39, 1.33, 1.54, 1.04, 2.25, 1.49) D <- c(1.3, .75, 1.26, .69, .62, .9, 1.2, .32) E <- c(.73, .8, .9, 1.24, .82, .72, .57, 1.18, .54, 1.3) dis.coal <- makemultdata(A, B, C, D, E, cuts = median(c(A, B, C, D, E))) em.out <- multmixEM(dis.coal) em.out[1:4] } \keyword{file} mixtools/man/NOdata.Rd0000755000175100001440000000147214762771742014406 0ustar hornikusers\name{NOdata} \docType{data} \alias{NOdata} \title{Ethanol Fuel Data Set} \description{ This data set gives the equivalence ratios and peak nitrogen oxide emissions in a study using pure ethanol as a spark-ignition engine fuel. } \usage{ data(NOdata) } \format{This data frame consists of: \describe{ \item{\code{NO}}{The peak nitrogen oxide emission levels.} \item{\code{Equivalence}}{The equivalence ratios for the engine at compression ratios from 7.5 to 18.} } } \source{Brinkman, N. D. (1981) Ethanol Fuel -- A Single-Cylinder Engine Study of Efficiency and Exhaust Emissions, \emph{S.A.E. Transactions}, 68. } \references{ Hurn, M., Justel, A. and Robert, C. P. (2003) Estimating Mixtures of Regressions, \emph{Journal of Computational and Graphical Statistics} \bold{12(1)}, 55--79. } \keyword{datasets} mixtools/man/ldmult.Rd0000755000175100001440000000145014342153463014521 0ustar hornikusers\name{ldmult} \title{Log-Density for Multinomial Distribution} \alias{ldmult} \usage{ ldmult(y, theta) } \description{ Return the logarithm of the multinomial density function. } \arguments{ \item{y}{A vector of multinomial counts.} \item{theta}{A vector of multinomial probabilities. May have same number of components as or one fewer component than \code{y}. In the latter case, an extra component is appended so that theta sums to one.} } \value{ \code{ldmult} returns the logarithm of the multinomial density with parameter \code{theta}, evaluated at \code{y}. } \details{ This function is called by \code{multmixEM}. } \seealso{ \code{\link{multmixEM}} } \examples{ y <- c(2, 2, 10) theta <- c(0.2, 0.3, 0.5) ldmult(y, theta) } \keyword{internal} mixtools/man/poisregmixEM.Rd0000755000175100001440000000554414342153463015640 0ustar hornikusers\name{poisregmixEM} \title{EM Algorithm for Mixtures of Poisson Regressions} \alias{poisregmixEM} \usage{ poisregmixEM(y, x, lambda = NULL, beta = NULL, k = 2, addintercept = TRUE, epsilon = 1e-08, maxit = 10000, verb = FALSE) } \description{ Returns EM algorithm output for mixtures of Poisson regressions with arbitrarily many components. } \arguments{ \item{y}{An n-vector of response values.} \item{x}{An nxp matrix of predictors. See \code{addintercept} below.} \item{lambda}{Initial value of mixing proportions. Entries should sum to 1. This determines number of components. If NULL, then \code{lambda} is random from uniform Dirichlet and number of components is determined by \code{beta}.} \item{beta}{Initial value of \code{beta} parameters. Should be a pxk matrix, where p is the number of columns of x and k is number of components. If NULL, then \code{beta} is generated by binning the data into k bins and using \code{glm} on the values in each of the bins. If both \code{lambda} and \code{beta} are NULL, then number of components is determined by \code{k}.} \item{k}{Number of components. Ignored unless \code{lambda} and \code{beta} are both NULL.} \item{addintercept}{If TRUE, a column of ones is appended to the x matrix before the value of p is calculated.} \item{epsilon}{The convergence criterion.} \item{maxit}{The maximum number of iterations.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} } \value{ \code{poisregmixEM} returns a list of class \code{mixEM} with items: \item{x}{The predictor values.} \item{y}{The response values.} \item{lambda}{The final mixing proportions.} \item{beta}{The final Poisson regression coefficients.} \item{loglik}{The final log-likelihood.} \item{posterior}{An nxk matrix of posterior probabilities for observations.} \item{all.loglik}{A vector of each iteration's log-likelihood.} \item{restarts}{The number of times the algorithm restarted due to unacceptable choice of initial values.} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{logisregmixEM}} } \references{ McLachlan, G. J. and Peel, D. (2000) \emph{Finite Mixture Models}, John Wiley and Sons, Inc. Wang, P., Puterman, M. L., Cockburn, I. and Le, N. (1996) Mixed Poisson Regression Models with Covariate Dependent Rates, \emph{Biometrics}, \bold{52(2)}, 381--400. } \examples{ ## EM output for data generated from a 2-component model. set.seed(100) beta <- matrix(c(1, .5, .7, -.8), 2, 2) x <- runif(50, 0, 10) xbeta <- cbind(1, x)\%*\%beta w <- rbinom(50, 1, .5) y <- w*rpois(50, exp(xbeta[, 1]))+(1-w)*rpois(50, exp(xbeta[, 2])) out <- poisregmixEM(y, x, verb = TRUE, epsilon = 1e-03) out } \keyword{file} mixtools/man/expRMM_EM.Rd0000644000175100001440000000716414343144253014754 0ustar hornikusers\name{expRMM_EM} \title{EM algorithm for Reliability Mixture Models (RMM) with right Censoring} \alias{expRMM_EM} \usage{ expRMM_EM(x, d=NULL, lambda = NULL, rate = NULL, k = 2, complete = "tdz", epsilon = 1e-08, maxit = 1000, verb = FALSE) } \description{ Parametric EM algorithm for univariate finite mixture of exponentials distributions with randomly right censored data. } \arguments{ \item{x}{A vector of \eqn{n}{n} real positive lifetime (possibly censored) durations. If \code{d} is not \code{NULL} then a vector of random censoring times \code{c} occurred, so that \eqn{x= min(x,c)} and \eqn{d = I(x <= c)}.} \item{d}{The vector of censoring indication, where 1 means observed lifetime data, and 0 means censored lifetime data.} \item{lambda}{Initial value of mixing proportions. If \code{NULL}, then \code{lambda} is set to \code{rep(1/k,k)}.} \item{rate}{Initial value of component exponential rates, all set to 1 if \code{NULL}.} \item{k}{Number of components of the mixture.} \item{complete}{Nature of complete data involved within the EM machinery, can be "tdz" for \code{(t,d,z)} (the default), or "xz" for \code{(x,z)} (see Bordes L. and Chauveau D. (2016) reference below).} \item{epsilon}{Tolerance limit for declaring algorithm convergence based on the change between two consecutive iterations.} \item{maxit}{The maximum number of iterations allowed, convergence may be declared before \code{maxit} iterations (see \code{epsilon} above).} \item{verb}{If TRUE, print updates for every iteration of the algorithm as it runs} } \value{ \code{expRMM_EM} returns a list of class "mixEM" with the following items: \item{x}{The input data.} \item{d}{The input censoring indicator.} \item{lambda}{The estimates for the mixing proportions.} \item{rate}{The estimates for the component rates.} \item{loglik}{The log-likelihood value at convergence of the algorithm.} \item{posterior}{An \eqn{n\times k}{n x k} matrix of posterior probabilities for observation, after convergence of the algorithm.} \item{all.loglik}{The sequence of log-likelihoods over iterations.} \item{all.lambda}{The sequence of mixing proportions over iterations.} \item{all.rate}{The sequence of component rates over iterations.} \item{ft}{A character vector giving the name of the function.} } \seealso{ Related functions: \code{\link{plotexpRMM}}, \code{\link{summary.mixEM}}. Other models and algorithms for censored lifetime data: \code{\link{weibullRMM_SEM}}, \code{\link{spRMM_SEM}}. } \references{ \itemize{ \item Bordes, L., and Chauveau, D. (2016), Stochastic EM algorithms for parametric and semiparametric mixture models for right-censored lifetime data, Computational Statistics, Volume 31, Issue 4, pages 1513-1538. \url{https://link.springer.com/article/10.1007/s00180-016-0661-7} } } \author{Didier Chauveau} \examples{ n <- 300 # sample size m <- 2 # number of mixture components lambda <- c(1/3,1-1/3); rate <- c(1,1/10) # mixture parameters set.seed(1234) x <- rexpmix(n, lambda, rate) # iid ~ exponential mixture cs <- runif(n,0,max(x)) # Censoring (uniform) and incomplete data t <- apply(cbind(x,cs),1,min) # observed or censored data d <- 1*(x <= cs) # censoring indicator ###### EM for RMM, exponential lifetimes l0 <- rep(1/m,m); r0 <- c(1, 0.5) # "arbitrary" initial values a <- expRMM_EM(t, d, lambda = l0, rate = r0, k = m) summary(a) # EM estimates etc plotexpRMM(a, lwd=2) # default plot of EM sequences plot(a, which=2) # or equivalently, S3 method for "mixEM" object %%\dontrun{ %%} } \keyword{file} mixtools/man/regcr.Rd0000755000175100001440000000652014342153463014325 0ustar hornikusers\name{regcr} \title{Add a Confidence Region or Bayesian Credible Region for Regression Lines to a Scatterplot} \alias{regcr} \usage{ regcr(beta, x, em.beta = NULL, em.sigma = NULL, alpha = .05, nonparametric = FALSE, plot = FALSE, xyaxes = TRUE, ...) } \description{ Produce a confidence or credible region for regression lines based on a sample of bootstrap beta values or posterior beta values. The beta parameters are the intercept and slope from a simple linear regression. } \arguments{ \item{beta}{An nx2 matrix of regression parameters. The first column gives the intercepts and the second column gives the slopes.} \item{x}{An n-vector of the predictor variable which is necessary when nonparametric = TRUE.} \item{em.beta}{The estimates for beta required when obtaining confidence regions. This is required for performing the standardization necessary when obtaining nonparametric confidence regions.} \item{em.sigma}{The estimates for the regression standard deviation required when obtaining confidence regions. This is required for performing the standardization necessary when obtaining nonparametric confidence regions.} \item{alpha}{The proportion of the beta sample to remove. In other words, 1-alpha is the level of the credible region.} \item{nonparametric}{ If nonparametric = TRUE, then the region is based on the convex hull of the remaining beta after trimming, which is accomplished using a data depth technique. If nonparametric = FALSE, then the region is based on the asymptotic normal approximation.} \item{plot}{If plot = TRUE, lines are added to the existing plot. The type of plot created depends on the value of xyaxes.} \item{xyaxes}{If xyaxes = TRUE and plot = TRUE, then a confidence or credible region for the regression lines is plotted on the x-y axes, presumably overlaid on a scatterplot of the data. If xyaxes = FALSE and plot = TRUE, the (convex) credible region for the regression line is plotted on the beta, or intercept-slope, axes, presumably overlaid on a scatterplot of beta.} \item{...}{Graphical parameters passed to \code{lines} or \code{plot} command.} } \value{ \code{regcr} returns a list containing the following items: \item{boundary}{A matrix of points in beta, or intercept-slope, space arrayed along the boundary of the confidence or credible region.} \item{upper}{A matrix of points in x-y space arrayed along the upper confidence or credible limit for the regression line.} \item{lower}{A matrix of points in x-y space arrayed along the lower confidence or credible limit for the regression line.} } \seealso{ \code{\link{regmixEM}}, \code{\link{regmixMH}} } \examples{ ## Nonparametric credible regions fit to NOdata. data(NOdata) attach(NOdata) set.seed(100) beta <- matrix(c(1.3, -0.1, 0.6, 0.1), 2, 2) sigma <- c(.02, .05) MH.out <- regmixMH(Equivalence, NO, beta = beta, s = sigma, sampsize = 2500, omega = .0013) attach(data.frame(MH.out$theta)) beta.c1 <- cbind(beta0.1[2400:2499], beta1.1[2400:2499]) beta.c2 <- cbind(beta0.2[2400:2499], beta1.2[2400:2499]) plot(NO, Equivalence) regcr(beta.c1, x = NO, nonparametric = TRUE, plot = TRUE, col = 2) regcr(beta.c2, x = NO, nonparametric = TRUE, plot = TRUE, col = 3) } \keyword{file} mixtools/man/spRMM_SEM.Rd0000644000175100001440000001041214343144436014716 0ustar hornikusers\name{spRMM_SEM} \title{Stochastic EM algorithm for semiparametric scaled mixture of censored data} \alias{spRMM_SEM} \usage{ spRMM_SEM(t, d = NULL, lambda = NULL, scaling = NULL, centers = 2, kernelft = triang_wkde, bw = rep(bw.nrd0(t),length(t)), averaged = TRUE, epsilon = 1e-08, maxit = 100, batchsize = 1, verb = FALSE) } \description{ Stochastic EM algorithm for semiparametric scaled mixture for randomly right censored data. } \arguments{ \item{t}{A vector of \eqn{n}{n} real positive lifetime (possibly censored) durations. If \code{d} is not \code{NULL} then a vector of random censoring times \code{c} occurred, so that \eqn{x= min(x,c)} and \eqn{d = I(x <= c)}.} \item{d}{The vector of censoring indication, where 1 means observed lifetime data, and 0 means censored lifetime data.} \item{lambda}{Initial value of mixing proportions. If \code{NULL}, then \code{lambda} is set to \code{rep(1/k,k)}.} \item{scaling}{Initial value of scaling between components, set to 1 if \code{NULL}.} \item{centers}{initial centers for initial call to kmeans for initialization.} \item{kernelft}{.} \item{bw}{Bandwidth in the kernel hazard estimates.} \item{averaged}{averaged.} \item{epsilon}{Tolerance limit.} \item{maxit}{The number of iterations allowed.} \item{batchsize}{The batchsize (see reference below).} \item{verb}{If TRUE, print updates for every iteration of the algorithm as it runs} } \value{ \code{spRMM_SEM} returns a list of class \code{"spRMM"} with the following items: \item{t}{The input data.} \item{d}{The input censoring indicator.} \item{lambda}{The estimates for the mixing proportions.} \item{scaling}{The estimates for the components scaling.} \item{posterior}{An \eqn{n\times k}{n x 2} matrix of posterior probabilities for observation, after convergence of the algorithm.} \item{loglik}{The (pseudo) log-likelihood value at convergence of the algorithm.} \item{all.loglik}{The sequence of log-likelihood values over iterations.} \item{all.lambda}{The sequence of mixing proportions over iterations.} \item{all.scaling}{The sequence of scaling parameter over iterations.} \item{meanpost}{Posterior probabilities averaged over iterations.} \item{survival}{Kaplan-Meier last iteration estimate (a \code{stepfun} object).} \item{hazard}{Hazard rate last iteration estimate evaluated at \code{final.t}.} \item{final.t}{Last iteration unscaled sample (see reference).} \item{s.hat}{Kaplan-Meier average estimate.} \item{t.hat}{Ordered unscaled sample, for testing purpose.} \item{avg.od}{For testing purpose only.} \item{hazard.hat}{Hazard rate average estimate on \code{t.hat}.} \item{batch.t}{Batch sample (not ordered), see reference.} \item{batch.d}{Associated event indicators just \code{rep(d,batchsize)}, for testing purpose.} \item{sumNaNs}{Internal control of numerical stability.} \item{ft}{A character vector giving the name of the function.} } \seealso{ Related functions: \code{\link{plotspRMM}}, \code{\link{summary.spRMM}}. Other models and algorithms for censored lifetime data (name convention is model_algorithm): \code{\link{expRMM_EM}}, \code{\link{weibullRMM_SEM}}. } \references{ \itemize{ \item Bordes, L., and Chauveau, D. (2016), Stochastic EM algorithms for parametric and semiparametric mixture models for right-censored lifetime data, Computational Statistics, Volume 31, Issue 4, pages 1513-1538. \url{https://link.springer.com/article/10.1007/s00180-016-0661-7} } } \author{Didier Chauveau} \examples{ \dontrun{ n=500 # sample size m=2 # nb components lambda=c(0.4, 0.6) # parameters meanlog=3; sdlog=0.5; scale=0.1 set.seed(12) # simulate a scaled mixture of lognormals x <- rlnormscalemix(n, lambda, meanlog, sdlog, scale) cs=runif(n,20,max(x)+400) # Censoring (uniform) and incomplete data t <- apply(cbind(x,cs),1,min) d <- 1*(x <= cs) tauxc <- 100*round( 1-mean(d),3) cat(tauxc, "percents of data censored.\n") c0 <- c(25, 180) # data-driven initial centers (visible modes) sc0 <- 25/180 # and scaling s <- spRMM_SEM(t, d, scaling = sc0, centers = c0, bw = 15, maxit = 100) plotspRMM(s) # default summary(s) # S3 method for class "spRMM" } } \keyword{file} mixtools/man/plotly_spRMM.Rd0000644000175100001440000000532714343144347015627 0ustar hornikusers\name{plotly_spRMM} \alias{plotly_spRMM} %- Also NEED an '\alias' for EACH other topic documented here. \title{Plot output from Stochastic EM algorithm for semiparametric scaled mixture of censored data using \code{plotly}. } \description{This is an updated version of \code{plotspRMM} function. For technical details, please refer to \code{\link{plotspRMM}. }} \usage{ plotly_spRMM(sem, tmax = NULL, width = 3 , col = '#1f77b4', cex = 3, title.size = 15 , title.x = 0.5 , title.y = 0.95, xlab.size = 15 , xtick.size=15 , ylab.size = 15 , ytick.size=15) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{sem}{An object returned by \code{\link{spRMM_SEM}}.} \item{tmax}{The max time for \eqn{x} axis, set to some default value if \code{NULL}.} \item{width}{Width of lines.} \item{col}{Color of lines.} \item{cex}{Size of dots.} \item{title.size}{Size of the main title.} \item{title.x}{Horizontal position of the main title.} \item{title.y}{Vertical position of the main title.} \item{xlab.size}{Size of the label of X-axis.} \item{xtick.size}{Size of the tick of X-axis.} \item{ylab.size}{Size of the label of Y-axis.} \item{ytick.size}{Size of the tick of Y-axis.} } \value{The four plots returned.} \seealso{ Related functions: \code{\link{spRMM_SEM}} , \code{\link{plotspRMM}}. Other models and algorithms for censored lifetime data (name convention is model_algorithm): \code{\link{expRMM_EM}}, \code{\link{weibullRMM_SEM}}. } \references{ \itemize{ \item Bordes, L., and Chauveau, D. (2016), Stochastic EM algorithms for parametric and semiparametric mixture models for right-censored lifetime data, Computational Statistics, Volume 31, Issue 4, pages 1513-1538. \url{https://link.springer.com/article/10.1007/s00180-016-0661-7} } } \author{Didier Chauveau} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ \dontrun{ n=500 # sample size m=2 # nb components lambda=c(0.4, 0.6) # parameters meanlog=3; sdlog=0.5; scale=0.1 set.seed(12) # simulate a scaled mixture of lognormals x <- rlnormscalemix(n, lambda, meanlog, sdlog, scale) cs=runif(n,20,max(x)+400) # Censoring (uniform) and incomplete data t <- apply(cbind(x,cs),1,min) d <- 1*(x <= cs) tauxc <- 100*round( 1-mean(d),3) cat(tauxc, "percents of data censored.\n") c0 <- c(25, 180) # data-driven initial centers (visible modes) sc0 <- 25/180 # and scaling s <- spRMM_SEM(t, d, scaling = sc0, centers = c0, bw = 15, maxit = 100) plotly_spRMM(s) # default summary(s) # S3 method for class "spRMM" } } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{file} mixtools/man/repnormmixmodel.sel.Rd0000755000175100001440000000323114342153463017222 0ustar hornikusers\name{repnormmixmodel.sel} \title{Model Selection in Mixtures of Normals with Repeated Measures} \alias{repnormmixmodel.sel} \usage{ repnormmixmodel.sel(x, k = 2, ...) } \description{ Assess the number of components in a mixture model with normal components and repeated measures using the Akaike's information criterion (AIC), Schwartz's Bayesian information criterion (BIC), Bozdogan's consistent AIC (CAIC), and Integrated Completed Likelihood (ICL). } \arguments{ \item{x}{An mxn matrix of observations. The rows correspond to the repeated measures and the columns correspond to the subject.} \item{k}{The maximum number of components to assess.} \item{...}{Additional arguments passed to \code{repnormmixEM}.} } \value{ \code{repnormmixmodel.sel} returns a matrix of the AIC, BIC, CAIC, and ICL values along with the winner (i.e., the highest value given by the model selection criterion) for a mixture of normals with repeated measures. } \seealso{ \code{\link{repnormmixEM}} } \references{ Biernacki, C., Celeux, G., and Govaert, G. (2000). Assessing a Mixture Model for Clustering with the Integrated Completed Likelihood. \emph{IEEE Transactions on Pattern Analysis and Machine Intelligence}, 22(7):719-725. Bozdogan, H. (1987). Model Selection and Akaike's Information Criterion (AIC): The General Theory and its Analytical Extensions. \emph{Psychometrika}, 52:345-370. } \examples{ ## Assessing the number of components for the water-level task data set. data(Waterdata) water<-t(as.matrix(Waterdata[,3:10])) set.seed(100) out <- repnormmixmodel.sel(water, k = 3, epsilon = 5e-01) out } \keyword{file} mixtools/man/regmixMH.Rd0000755000175100001440000000661014342153463014743 0ustar hornikusers\name{regmixMH} \title{Metropolis-Hastings Algorithm for Mixtures of Regressions} \alias{regmixMH} \usage{ regmixMH(y, x, lambda = NULL, beta = NULL, s = NULL, k = 2, addintercept = TRUE, mu = NULL, sig = NULL, lam.hyp = NULL, sampsize = 1000, omega = 0.01, thin = 1) } \description{ Return Metropolis-Hastings (M-H) algorithm output for mixtures of multiple regressions with arbitrarily many components. } \arguments{ \item{y}{An n-vector of response values.} \item{x}{An nxp matrix of predictors. See \code{addintercept} below.} \item{lambda}{Initial value of mixing proportions. Entries should sum to 1. This determines number of components. If NULL, then \code{lambda} is random from uniform Dirichlet and number of components is determined by \code{beta}.} \item{beta}{Initial value of \code{beta} parameters. Should be a pxk matrix, where p is the number of columns of x and k is number of components. If NULL, then \code{beta} has uniform standard normal entries. If both \code{lambda} and \code{beta} are NULL, then number of components is determined by \code{s}.} \item{s}{k-vector of standard deviations. If NULL, then \eqn{1/\code{s}^2} has random standard exponential entries. If \code{lambda}, \code{beta}, and \code{s} are NULL, then number of components determined by \code{k}.} \item{k}{Number of components. Ignored unless all of \code{lambda}, \code{beta}, and \code{s} are NULL.} \item{addintercept}{If TRUE, a column of ones is appended to the x matrix before the value of p is calculated.} \item{mu}{The prior hyperparameter of same size as \code{beta}; the means of \code{beta} components. If NULL, these are set to zero.} \item{sig}{The prior hyperparameter of same size as \code{beta}; the standard deviations of \code{beta} components. If NULL, these are all set to five times the overall standard deviation of y.} \item{lam.hyp}{The prior hyperparameter of length \code{k} for the mixing proportions (i.e., these are hyperparameters for the Dirichlet distribution). If NULL, these are generated from a standard uniform distribution and then scaled to sum to 1.} \item{sampsize}{Size of posterior sample returned.} \item{omega}{Multiplier of step size to control M-H acceptance rate. Values closer to zero result in higher acceptance rates, generally.} \item{thin}{Lag between parameter vectors that will be kept.} } \value{ \code{regmixMH} returns a list of class \code{mixMCMC} with items: \item{x}{A nxp matrix of the predictors.} \item{y}{A vector of the responses.} \item{theta}{A (\code{sampsize}/\code{thin}) x q matrix of MCMC-sampled q-vectors, where q is the total number of parameters in \code{beta}, \code{s}, and \code{lambda}.} \item{k}{The number of components.} } \seealso{ \code{\link{regcr}} } \references{ Hurn, M., Justel, A. and Robert, C. P. (2003) Estimating Mixtures of Regressions, \emph{Journal of Computational and Graphical Statistics} \bold{12(1)}, 55--79. } \examples{ ## M-H algorithm for NOdata with acceptance rate about 40\%. data(NOdata) attach(NOdata) set.seed(100) beta <- matrix(c(1.3, -0.1, 0.6, 0.1), 2, 2) sigma <- c(.02, .05) MH.out <- regmixMH(Equivalence, NO, beta = beta, s = sigma, sampsize = 2500, omega = .0013) MH.out$theta[2400:2499,] } \keyword{file} mixtools/man/plotly_compCDF.Rd0000644000175100001440000000636614342374741016112 0ustar hornikusers\name{plotly_compCDF} \title{Plot the Component CDF using \code{plotly}} \alias{plotly_compCDF} \usage{ plotly_compCDF(data, weights, x=seq(min(data, na.rm=TRUE), max(data, na.rm=TRUE), len=250), comp=1:NCOL(weights), makeplot=TRUE, cex = 3, width = 3, legend.text = "Composition", legend.text.size = 15, legend.size = 15, title = "Empirical CDF", title.x = 0.5, title.y = 0.95, title.size = 15, xlab = "Data", xlab.size = 15, xtick.size = 15, ylab = "Probability", ylab.size = 15, ytick.size = 15, col.comp = NULL) } \description{ Plot the components' CDF via the posterior probabilities using \code{plotly}. } \arguments{ \item{data}{A matrix containing the raw data. Rows are subjects and columns are repeated measurements.} \item{weights}{The weights to compute the empirical CDF; however, most of time they are the posterior probabilities.} \item{x}{The points at which the CDFs are to be evaluated.} \item{comp}{The mixture components for which CDFs are desired.} \item{makeplot}{Logical: Should a plot be produced as a side effect?} \item{cex}{Size of markers.} \item{width}{Line width.} \item{title}{Text of the main title.} \item{title.size}{Size of the main title.} \item{title.x}{Horsizontal position of the main title.} \item{title.y}{Vertical posotion of the main title.} \item{xlab}{Label of X-axis.} \item{xlab.size}{Size of the lable of X-axis.} \item{xtick.size}{Size of tick lables of X-axis.} \item{ylab}{Label of Y-axis.} \item{ylab.size}{Size of the lable of Y-axis.} \item{ytick.size}{Size of tick lables of Y-axis.} \item{legend.text}{Title of legend.} \item{legend.text.size}{Size of the legend title.} \item{legend.size}{Size of legend.} \item{col.comp}{Color of compositions. Number of color specified needs to be consistent with number of compositions.} } \value{ A matrix with \code{length(comp)} rows and \code{length(x)} columns in which each row gives the CDF evaluated at each point of \code{x}. } \details{ When \code{makeplot} is \code{TRUE}, a line plot is produced of the CDFs evaluated at \code{x}. The plot is not a step function plot; the points \eqn{(x, CDF(x))} are simply joined by line segments. } \references{ McLachlan, G. J. and Peel, D. (2000) \emph{Finite Mixture Models}, John Wiley and Sons, Inc. Elmore, R. T., Hettmansperger, T. P. and Xuan, F. (2004) The Sign Statistic, One-Way Layouts and Mixture Models, \emph{Statistical Science} \bold{19(4)}, 579--587. } \seealso{ \code{\link{makemultdata}}, \code{\link{multmixmodel.sel}}, \code{\link{multmixEM}}, \code{\link{compCDF}}. } \examples{ ## The sulfur content of the coal seams in Texas set.seed(100) A <- c(1.51, 1.92, 1.08, 2.04, 2.14, 1.76, 1.17) B <- c(1.69, 0.64, .9, 1.41, 1.01, .84, 1.28, 1.59) C <- c(1.56, 1.22, 1.32, 1.39, 1.33, 1.54, 1.04, 2.25, 1.49) D <- c(1.3, .75, 1.26, .69, .62, .9, 1.2, .32) E <- c(.73, .8, .9, 1.24, .82, .72, .57, 1.18, .54, 1.3) dis.coal <- makemultdata(A, B, C, D, E, cuts = median(c(A, B, C, D, E))) temp <- multmixEM(dis.coal) ## Now plot the components' CDF via the posterior probabilities plotly_compCDF(dis.coal$x, temp$posterior, xlab="Sulfur") } \keyword{file} mixtools/man/density.spEM.Rd0000755000175100001440000000365014342153463015546 0ustar hornikusers\name{density.spEM} \title{Normal kernel density estimate for semiparametric EM output} \alias{density.spEM} \usage{ \method{density}{spEM}(x, u=NULL, component=1, block=1, scale=FALSE, \dots) } \description{ Takes an object of class \code{spEM} and returns an object of class \code{\link{density}} giving the kernel density estimate. } \arguments{ \item{x}{An object of class \code{npEM} such as the output of the \code{\link{npEM}} or \code{\link{spEMsymloc}} functions.} \item{u}{Vector of points at which the density is to be evaluated} \item{component}{Mixture component number; should be an integer from 1 to the number of columns of \code{x$posteriors}.} \item{block}{Block of repeated measures. Only applicable in repeated measures case, for which \code{x$blockid} exists; should be an integer from 1 to \code{max(x$blockid)}.} \item{scale}{Logical: If TRUE, multiply the density values by the corresponding mixing proportions found in \code{x$lambdahat}} \item{\dots}{Additional arguments; not used by this method.} } \details{ The bandwidth is taken to be the same as that used to produce the \code{npEM} object, which is given by \code{x$bandwidth}. } \value{ \code{density.spEM} returns a list of type \code{"density"}. See \code{\link{density}} for details. In particular, the output of \code{density.spEM} may be used directly by functions such as \code{\link{plot}} or \code{\link{lines}}. } \seealso{ \code{\link{spEM}}, \code{\link{spEMsymloc}}, \code{\link{plot.spEM}} } \examples{ set.seed(100) mu <- matrix(c(0, 15), 2, 3) sigma <- matrix(c(1, 5), 2, 3) x <- rmvnormmix(300, lambda = c(.4,.6), mu = mu, sigma = sigma) d <- spEM(x, mu0 = 2, blockid = rep(1,3), constbw = TRUE) plot(d, xlim=c(-10, 40), ylim = c(0, .16), xlab = "", breaks = 30, cex.lab=1.5, cex.axis=1.5) # plot.spEM calls density.spEM here } \keyword{file} mixtools/man/print.npEM.Rd0000755000175100001440000000171114342153463015212 0ustar hornikusers\name{print.npEM} \alias{print.npEM} \title{Printing non- and semi-parametric multivariate mixture model fits} \usage{ \method{print}{npEM}(x, \dots) } \arguments{ \item{x}{an object of class \code{npEM} such as a result of a call to \code{\link{npEM}}} \item{\dots}{Additional arguments to \code{\link{print}}} } \description{ \code{\link[base]{print}} method for class \code{npEM}. } \details{ \code{print.npEM} prints the elements of an \code{npEM} object without printing the data or the posterior probabilities. (These may still be accessed as \code{x$data} and \code{x$posteriors}.) } \value{ \code{print.npEM} returns (invisibly) the full value of \code{x} itself, including the \code{data} and \code{posteriors} elements. } \seealso{ \code{\link{npEM}}, \code{\link{plot.npEM}} \code{\link{summary.npEM}} } \examples{ data(Waterdata) set.seed(100) \dontrun{npEM(Waterdata[,3:10], 3, bw=4, verb=FALSE) # Assume indep but not iid} } \keyword{file} mixtools/man/segregmixEM.Rd0000755000175100001440000001747014342153463015445 0ustar hornikusers\name{segregmixEM} \title{ECM Algorithm for Mixtures of Regressions with Changepoints} \alias{segregmixEM} \alias{regmixEM.chgpt} \usage{ segregmixEM(y, x, lambda = NULL, beta = NULL, sigma = NULL, k = 2, seg.Z, psi, psi.locs = NULL, delta = NULL, epsilon = 1e-08, maxit = 10000, verb = FALSE, max.restarts = 15) } \description{ Returns ECM algorithm output for mixtures of multiple regressions with changepoints and arbitrarily many components. } \arguments{ \item{y}{An n-vector of response values.} \item{x}{An nxp matrix of predictors. Note that this model assumes the presence of an intercept.} \item{lambda}{Initial value of mixing proportions. Entries should sum to 1. This determines number of components. If NULL, then \code{lambda} is random from uniform Dirichlet and the number of components is determined by \code{beta}.} \item{beta}{Initial value of \code{beta} parameters. This is a list of length \code{k} such that each element must contain a vector having length consistent with the defined changepoint structure. See \code{seg.Z}, \code{psi}, and \code{psi.loc} below. If NULL, then \code{beta} has standard normal entries according to a binning method done on the data. If both \code{lambda} and \code{beta} are NULL, then number of components is determined by \code{sigma}.} \item{sigma}{A vector of standard deviations. If NULL, then 1/\code{sigma}^2 has random standard exponential entries according to a binning method done on the data. If \code{lambda}, \code{beta}, and \code{sigma} are NULL, then number of components is determined by \code{k}.} \item{k}{Number of components. Ignored unless all of \code{lambda}, \code{beta}, and \code{sigma} are NULL.} \item{seg.Z}{A list of length \code{k} whose elements are right-hand side formulas, which are additive linear models of the predictors that have changepoints in their respective components. See below for more details.} \item{psi}{A kxp matrix specifying the number of changepoints for each predictor in each component. See below for more details.} \item{psi.locs}{A list of length \code{k} that has initial estimates for the changepoint locations. Each element of the list must have length equal to the number of chanegpoints specified in the corresponding row of the \code{psi} matrix. For components with no changepoints, simply set that element equal to NULL. See below for more details.} \item{delta}{An optional list of values quantifying the amount of separation at each changepoint if assuming discontinuities at the changepoints. This has the same dimensions as \code{psi.locs}.} \item{epsilon}{The convergence criterion.} \item{maxit}{The maximum number of iterations.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} \item{max.restarts}{The number of times to try restarting the ECM algorithm if estimation problems occur - such as choice of poor initial values or a poorly chosen changepoint structure.} } \value{ \code{segregmixEM} returns a list of class \code{segregmixEM} with items: \item{x}{The set of predictors.} \item{y}{The response values.} \item{lambda}{The final mixing proportions.} \item{beta}{The final regression coefficients.} \item{sigma}{The final standard deviations.} \item{seg.Z}{The list of right-hand side formulas as defined by the user.} \item{psi.locs}{A list of length k with the final estimates for the changepoint locations.} \item{delta}{A list of the delta values that were optionally specified by the user.} \item{loglik}{The final log-likelihood.} \item{posterior}{An nxk matrix of posterior probabilities for observations.} \item{all.loglik}{A vector of each iteration's log-likelihood.} \item{restarts}{The number of times the algorithm restarted due to unacceptable choice of initial values.} \item{ft}{A character vector giving the name of the function.} } \details{ \code{seg.Z} is defined as a list of right-hand side linear model formulas that are used to identify which predictors have changepoints in each component. For example, suppose you have a dataframe with three predictors: \code{V1}, \code{V2}, \code{V3}. Suppose now that you wish to model a 3-component mixture of regressions with changepoints structure such that the first component has changepoints in V1 and V2, the second component has changepoints in \code{V3}, and the third component has no changepoints. Then you would define \code{seg.Z = list(~V1+V2, ~V3, NULL)}. Note that you MUST place the variables in order with respect to how they appear in the predictor matrix \code{x}. \code{psi} is a kxp matrix specifying the number of changepoints for each predictor in each component. For the example given above, suppose there are three changepoints for \code{V1}, two changepoints for \code{V2}, and four changepoints for \code{V3}. Then you would define \code{psi = rbind(c(3, 2, 0), c(0, 0, 4), c(0, 0, 0))}. \code{psi.locs} is a list of length k whose elements give the initial locations of the changepoints for each component. Each element of the list must have length equal to the total number of changepoints for that component's regression equation. For the example given above, in component 1, assume that the three changepoints for \code{V1} are at 3, 7, and 10 and the two changepoints for \code{V1} are at 5, 20, and 30. In component 2, assume that the four changepoints for \code{V3} are at 2, 4, 6, and 8. Then you would define \code{psi.locs = list(c(3, 7, 10, 5, 20, 30), c(2, 4, 6, 8), NULL)}. Note that the order of the changepoints is determined by first sorting the predictors by how they appear in the formulas in \code{seg.Z} and then sorting in increasing order within each predictor. } \seealso{ \code{\link{regmixEM}} } \references{ Young, D. S. (2014) Mixtures of Regressions with Changepoints, \emph{Statistics and Computing}, \bold{24(2)}, 265--281. } \note{ As of version 0.4.6, this more general function has replaced the now defunct \code{regmixEM.chgpt} and associated internal functions. } \examples{ \dontrun{ ## Simulated example. set.seed(100) x <- 1:20 y1 <- 3 + x + rnorm(20) y2 <- 3 - x - 5*(x - 15)*(x > 15) + rnorm(20) y <- c(y1, y2) x <- c(x, x) set.seed(100) be <- list(c(3, -1, -5), c(3, 1)) s <- c(1, 1) psi.locs <- list(comp.1 = list(x = 15), comp.2 = NULL) out <- segregmixEM(y, cbind(1,x), verb = TRUE, k = 2, beta = be, sigma = s, lambda = c(1, 1)/2, seg.Z = list(~x, NULL), psi = rbind(1, 0), psi.locs = psi.locs, epsilon = 0.9) z <- seq(0, 21, len = 40) plot(x, y, col = apply(out$post, 1, which.max) + 1, pch = 19, cex.lab = 1.4, cex = 1.4) b <- out$beta d <- out$psi.locs lines(z, b[[1]][1] + b[[1]][2] * z + b[[1]][3] * (z - d[[1]][[1]]) * (z > d[[1]][[1]]) , col = 2, lwd = 2) lines(z, b[[2]][1] + b[[2]][2] * z, col = 3, lwd = 2) abline(v = out$psi.locs[[1]][1], col = 2, lty = 2) } \dontrun{ ## Example using the NOdata. data(NOdata) attach(NOdata) set.seed(100) be <- list(c(1.30, -0.13, 0.08), c(0.56, 0.09)) s <- c(0.02, 0.04) psi.locs <- list(comp.1 = list(NO = 1.57), comp.2 = NULL) out <- segregmixEM(Equivalence, cbind(NO), verb = TRUE, k = 2, beta = be, sigma = s, lambda = c(1, 1)/2, seg.Z = list(~NO, NULL), psi = rbind(1, 0), psi.locs = psi.locs, epsilon = 0.1) z <- seq(0, 5, len = 1000) plot(NOdata, col = apply(out$post, 1, which.max) + 1, pch = 19, cex.lab = 1.4, cex = 1.4, ylab = "Equivalence Ratio") b <- out$beta d <- out$psi.locs lines(z, b[[1]][1] + b[[1]][2] * z + b[[1]][3] * (z - d[[1]][[1]]) * (z > d[[1]][[1]]) , col = 2, lwd = 2) lines(z, b[[2]][1] + b[[2]][2] * z, col = 3, lwd = 2) abline(v = out$psi.locs[[1]][1], col = 2, lty = 2) detach(NOdata) } } \keyword{file} mixtools/man/multmixmodel.sel.Rd0000755000175100001440000000313014342153463016517 0ustar hornikusers\name{multmixmodel.sel} \title{Model Selection Mixtures of Multinomials} \alias{multmixmodel.sel} \usage{ multmixmodel.sel(y, comps = NULL, ...) } \description{ Assess the number of components in a mixture of multinomials model using the Akaike's information criterion (AIC), Schwartz's Bayesian information criterion (BIC), Bozdogan's consistent AIC (CAIC), and Integrated Completed Likelihood (ICL). } \arguments{ \item{y}{Either An nxp matrix of data (multinomial counts), where n is the sample size and p is the number of multinomial bins, or the output of the \code{\link{makemultdata}} function. It is not necessary that all of the rows contain the same number of multinomial trials (i.e., the row sums of \code{y} need not be identical).} \item{comps}{Vector containing the numbers of components to consider. If NULL, this is set to be 1:(max possible), where (max possible) is floor((m+1)/2) and m is the minimum row sum of y.} \item{...}{Arguments passed to \code{multmixEM} that control convergence of the underlying EM algorithm.} } \value{ \code{multmixmodel.sel} returns a table summarizing the AIC, BIC, CAIC, ICL, and log-likelihood values along with the winner (the number with the lowest aforementioned values). } \seealso{ \code{\link{compCDF}}, \code{\link{makemultdata}}, \code{\link{multmixEM}} } \examples{ ##Data generated using the multinomial cutpoint method. set.seed(100) x <- matrix(rpois(70, 6), 10, 7) x.new <- makemultdata(x, cuts = 5) multmixmodel.sel(x.new$y, comps = c(1,2), epsilon = 1e-03) } \keyword{file} mixtools/man/plotly_spEMN01.Rd0000644000175100001440000000620414342453732015747 0ustar hornikusers\name{plotly_spEMN01} \alias{plotly_spEMN01} \title{Plot mixture pdf for the semiparametric mixture model output by \code{spEMsymlocN01} using \code{plotly}.} \description{This is an updated version of \code{plotlspEMN01} function by using \code{plotly}. For technical details, please refer to \code{\link{plot.spEMN01}}.} \usage{ plotly_spEMN01(x, bw=x$bandwidth, knownpdf=dnorm, add.plot=FALSE, width = 3 , col.dens = NULL, col.hist = '#1f77b4', title = NULL , title.size = 15 , title.x = 0.5 , title.y = 0.95, xlab = "t" , xlab.size = 15 , xtick.size = 15, ylab = "Density" , ylab.size = 15 , ytick.size = 15, legend.text = "Densities" , legend.text.size = 15 , legend.size = 15) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{An object of class "spEMN01" as returned by spEMsymlocN01} \item{bw}{Bandwidth for weighted kernel density estimation.} \item{knownpdf}{The known density of component 1, default to \code{dnorm}.} \item{add.plot}{Set to TRUE to add to an existing plot.} \item{width}{Line width.} \item{col.dens}{Color of density lines. Number of colors specified needs to be consistent with number of components.} \item{col.hist}{Color of histogram.} \item{title}{Text of the main title.} \item{title.size}{Size of the main title.} \item{title.x}{Horsizontal position of the main title.} \item{title.y}{Vertical posotion of the main title.} \item{xlab}{Label of X-axis.} \item{xlab.size}{Size of the lable of X-axis.} \item{xtick.size}{Size of tick lables of X-axis.} \item{ylab}{Label of Y-axis.} \item{ylab.size}{Size of the lable of Y-axis.} \item{ytick.size}{Size of tick lables of Y-axis.} \item{legend.text}{Title of legend.} \item{legend.text.size}{Size of the legend title.} \item{legend.size}{Size of legend.} } \value{A plot of the density of the mixture} \references{ \itemize{ \item Chauveau, D., Saby, N., Orton, T. G., Lemercier B., Walter, C. and Arrouys, D. Large-scale simultaneous hypothesis testing in soil monitoring: A semi-parametric mixture approach, preprint (2013). } } \author{Didier Chauveau} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{spEMsymlocN01}}, \code{\link{plot.spEMN01}}} % \examples{ ## Probit transform of p-values ## from a Beta-Uniform mixture model ## comparion of parametric and semiparametric EM fit ## Note: in actual situations n=thousands set.seed(50) n=300 # nb of multiple tests m=2 # 2 mixture components a=c(1,0.1); b=c(1,1); lambda=c(0.6,0.4) # parameters z=sample(1:m, n, rep=TRUE, prob = lambda) p <- rbeta(n, shape1 = a[z], shape2 = b[z]) # p-values o <- order(p) cpd <- cbind(z,p)[o,] # sorted complete data, z=1 if H0, 2 if H1 p <- cpd[,2] # sorted p-values y <- qnorm(p) # probit transform of the pvalues # gaussian EM fit with component 1 constrained to N(0,1) s1 <- normalmixEM(y, mu=c(0,-4), mean.constr = c(0,NA), sd.constr = c(1,NA)) s2 <- spEMsymlocN01(y, mu0 = c(0,-3)) # spEM with N(0,1) fit plotly_spEMN01(s2 , add.plot = FALSE) %%\dontrun{ %%} } \keyword{file}mixtools/man/normalmixEM2comp.Rd0000755000175100001440000000633514342153463016420 0ustar hornikusers\name{normalmixEM2comp} \title{Fast EM Algorithm for 2-Component Mixtures of Univariate Normals} \alias{normalmixEM2comp} \usage{ normalmixEM2comp(x, lambda, mu, sigsqrd, eps= 1e-8, maxit = 1000, verb=FALSE) } \description{ Return EM algorithm output for mixtures of univariate normal distributions for the special case of 2 components, exploiting the simple structure of the problem to speed up the code. } \arguments{ \item{x}{A vector of length \eqn{n} consisting of the data.} \item{lambda}{Initial value of first-component mixing proportion.} \item{mu}{A 2-vector of initial values for the mean parameters.} \item{sigsqrd}{Either a scalar or a 2-vector with initial value(s) for the variance parameters. If a scalar, the algorithm assumes that the two components have equal variances; if a 2-vector, it assumes that the two components do not have equal variances.} \item{eps}{The convergence criterion. Convergence is declared when the change in the observed data log-likelihood increases by less than epsilon.} \item{maxit}{The maximum possible number of iterations.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} } \details{ This code is written to be very fast, sometimes more than an order of magnitude faster than \code{\link{normalmixEM}} for the same problem. It is less numerically stable that \code{\link{normalmixEM}} in the sense that it does not safeguard against underflow as carefully. Note that when the two components are assumed to have unequal variances, the loglikelihood is unbounded. However, in practice this is rarely a problem and quite often the algorithm converges to a "nice" local maximum. } \value{ \code{normalmixEM2comp} returns a list of class \code{mixEM} with items: \item{x}{The raw data.} \item{lambda}{The final mixing proportions (lambda and 1-lambda).} \item{mu}{The final two mean parameters.} \item{sigma}{The final one or two standard deviations. } \item{loglik}{The final log-likelihood.} \item{posterior}{An nx2 matrix of posterior probabilities for observations.} \item{all.loglik}{A vector of each iteration's log-likelihood. This vector includes both the initial and the final values; thus, the number of iterations is one less than its length.} \item{restarts}{The number of times the algorithm restarted due to unacceptable choice of initial values (always zero).} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{mvnormalmixEM}}, \code{\link{normalmixEM}} } \references{ McLachlan, G. J. and Peel, D. (2000) \emph{Finite Mixture Models}, John Wiley and Sons, Inc. } \examples{ ##Analyzing the Old Faithful geyser data with a 2-component mixture of normals. data(faithful) attach(faithful) set.seed(100) system.time(out <- normalmixEM2comp(waiting, lambda=.5, mu=c(50,80), sigsqrd=100)) out$all.loglik # Note: must be monotone increasing # Compare elapsed time with more general version system.time(out2 <- normalmixEM(waiting, lambda=c(.5,.5), mu=c(50,80), sigma=c(10,10), arbvar=FALSE)) out2$all.loglik # Values should be identical to above } \keyword{file} mixtools/man/rnormmix.Rd0000755000175100001440000000214014342153463015070 0ustar hornikusers\name{rnormmix} \title{Simulate from Mixtures of Normals} \alias{normmix.sim} \alias{rnormmix} \usage{ rnormmix(n, lambda=1, mu=0, sigma=1) } \description{ Simulate from a mixture of univariate normal distributions. } \arguments{ \item{n}{Number of cases to simulate.} \item{lambda}{Vector of mixture probabilities, with length equal to \eqn{m}, the desired number of components (subpopulations). This is assumed to sum to 1; if not, it is normalized.} \item{mu}{Vector of means.} \item{sigma}{Vector of standard deviations.} } \value{ \code{rnormmix} returns an \eqn{n}-vector sampled from an \eqn{m}-component mixture of univariate normal distributions. } \details{This function simply calls \code{\link{rmvnormmix}}.} \seealso{ \code{\link{makemultdata}}, \code{\link{rmvnormmix}} } \examples{ ##Generate data from a 2-component mixture of normals. set.seed(100) n <- 500 lambda <- rep(1, 2)/2 mu <- c(0, 5) sigma <- rep(1, 2) mixnorm.data <- rnormmix(n, lambda, mu, sigma) ##A histogram of the simulated data. hist(mixnorm.data) } \keyword{file} mixtools/man/plotly_mixMCMC.Rd0000644000175100001440000000770114343037574016067 0ustar hornikusers\name{plotly_mixMCMC} \title{Various Plots Pertaining to Mixture Model Output Using MCMC Methods using \code{plotly}} \alias{plotly_mixMCMC} \usage{ plotly_mixMCMC(x, trace.plot = TRUE, summary.plot = FALSE, burnin = 2000, credit.region = 0.95, col.cr = NULL, cex.trace = 3, width.trace = 3, cex.summary = 3, width.summary = 1, title.trace = "", title.trace.x = 0.5, title.trace.y = 0.95, title.trace.size = 15, xlab.trace = "Index", xlab.trace.size = 15, xtick.trace.size = 15, ylab.trace = NULL, ylab.trace.size = 15, ytick.trace.size = 15, title.summary = "Credible Regions", title.summary.x = 0.5, title.summary.y = 0.95, title.summary.size = 15, xlab.summary = "Predictor", xlab.summary.size = 15, xtick.summary.size = 15, ylab.summary = "Response", ylab.summary.size = 15, ytick.summary.size = 15 ) } \description{ This is an updated version of \code{plot.mixMCMC}. For technical details, please refer to \code{plot.mixMCMC}. } \arguments{ \item{x}{An object of class \code{mixMCMC}.} \item{trace.plot}{If TRUE, trace plots of the various parameters estimated by the MCMC methods is given.} \item{summary.plot}{Graphics pertaining to certain mixture models. The details are given below.} \item{burnin}{The values 1 to \code{burnin} are dropped when producing the plots in \code{summary.plots}.} \item{credit.region}{Confidence level of credit region.} \item{col.cr}{Color of credit region. Number of color specified needs to be consistent with number of components.} \item{cex.trace}{Dot size of trace plots.} \item{width.trace}{Line width of trace plots.} \item{cex.summary}{Dot size of summary plots.} \item{width.summary}{Line width of summary plots.} \item{title.trace}{Text of the main title of trace plots.} \item{title.trace.x}{Horizontal position of main title of trace plots.} \item{title.trace.y}{Vertical position of main title of trace plots.} \item{title.trace.size}{Text sise of main title of trace plots.} \item{xlab.trace}{Label of X-axis of trace plots.} \item{xlab.trace.size}{Size of the lable of X-axis of trace plots.} \item{xtick.trace.size}{Size of tick lables of X-axis of trace plots.} \item{ylab.trace}{Label of Y-axis of trace plots.} \item{ylab.trace.size}{Size of the lable of Y-axis of trace plots.} \item{ytick.trace.size}{Size of tick lables of Y-axis of trace plots.} \item{title.summary}{Text of the main title of summar plot.} \item{title.summary.x}{Horizontal position of main title of summary plot.} \item{title.summary.y}{Vertical position of main title of summary plot.} \item{title.summary.size}{Text sise of main title of summary plot.} \item{xlab.summary}{Label of X-axis of summary plot.} \item{xlab.summary.size}{Size of the lable of X-axis of summary plot.} \item{xtick.summary.size}{Size of tick lables of X-axis of summary plot.} \item{ylab.summary}{Label of Y-axis of summary plot.} \item{ylab.summary.size}{Size of the lable of Y-axis of summary plot.} \item{ytick.summary.size}{Size of tick lables of Y-axis of summary plot.} } \value{ \code{plotly_mixMCMC} returns trace plots of the various parameters estimated by the MCMC methods for all objects of class \code{mixMCMC}. In addition, other plots may be produced for the following k-component mixture model functions: \item{regmixMH}{Credible bands for the regression lines in a mixture of linear regressions. See \code{regcr} for more details.} } \seealso{ \code{\link{regcr}}, \code{plot.mixMCMC} } \examples{ \dontrun{ data(NOdata) attach(NOdata) set.seed(100) beta <- matrix(c(1.3, -0.1, 0.6, 0.1), 2, 2) sigma <- c(.02, .05) MH.out <- regmixMH(Equivalence, NO, beta = beta, s = sigma, sampsize = 2500, omega = .0013) plotly_mixMCMC(x = MH.out, summary.plot = TRUE, col.cr = c("red", "green")) } } \keyword{file} mixtools/man/hmeEM.Rd0000755000175100001440000000627214342153463014222 0ustar hornikusers\name{hmeEM} \title{EM Algorithm for Mixtures-of-Experts} \alias{hmeEM} \usage{ hmeEM(y, x, lambda = NULL, beta = NULL, sigma = NULL, w = NULL, k = 2, addintercept = TRUE, epsilon = 1e-08, maxit = 10000, verb = FALSE) } \description{ Returns EM algorithm output for a mixture-of-experts model. Currently, this code only handles a 2-component mixture-of-experts, but will be extended to the general k-component hierarchical mixture-of-experts. } \arguments{ \item{y}{An n-vector of response values.} \item{x}{An nxp matrix of predictors. See \code{addintercept} below.} \item{lambda}{Initial value of mixing proportions, which are modeled as an inverse logit function of the predictors. Entries should sum to 1. If NULL, then \code{lambda} is taken as 1/\code{k} for each \code{x}.} \item{beta}{Initial value of \code{beta} parameters. Should be a pxk matrix, where p is the number of columns of x and k is number of components. If NULL, then \code{beta} has standard normal entries according to a binning method done on the data.} \item{sigma}{A vector of standard deviations. If NULL, then \eqn{1/\code{sigma}^2} has random standard exponential entries according to a binning method done on the data.} \item{w}{A p-vector of coefficients for the way the mixing proportions are modeled. See \code{lambda}.} \item{k}{Number of components. Currently, only \code{k}=2 is accepted.} \item{addintercept}{If TRUE, a column of ones is appended to the x matrix before the value of p is calculated.} \item{epsilon}{The convergence criterion.} \item{maxit}{The maximum number of iterations.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} } \value{ \code{hmeEM} returns a list of class \code{mixEM} with items: \item{x}{The set of predictors (which includes a column of 1's if \code{addintercept} = TRUE).} \item{y}{The response values.} \item{w}{The final coefficients for the functional form of the mixing proportions.} \item{lambda}{An nxk matrix of the final mixing proportions.} \item{beta}{The final regression coefficients.} \item{sigma}{The final standard deviations. If \code{arbmean} = FALSE, then only the smallest standard deviation is returned. See \code{scale} below.} \item{loglik}{The final log-likelihood.} \item{posterior}{An nxk matrix of posterior probabilities for observations.} \item{all.loglik}{A vector of each iteration's log-likelihood.} \item{restarts}{The number of times the algorithm restarted due to unacceptable choice of initial values.} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{regmixEM}} } \references{ Jacobs, R. A., Jordan, M. I., Nowlan, S. J. and Hinton, G. E. (1991) Adaptive Mixtures of Local Experts, \emph{Neural Computation} \bold{3(1)}, 79--87. McLachlan, G. J. and Peel, D. (2000) \emph{Finite Mixture Models}, John Wiley and Sons, Inc. } \examples{ ## EM output for NOdata. data(NOdata) attach(NOdata) set.seed(100) em.out <- regmixEM(Equivalence, NO) hme.out <- hmeEM(Equivalence, NO, beta = em.out$beta) hme.out[3:7] } \keyword{file} mixtools/man/matsqrt.Rd0000755000175100001440000000076514342153463014723 0ustar hornikusers\name{matsqrt} \title{Calculates the Square Root of a Diagonalizable Matrix} \alias{matsqrt} \usage{ matsqrt(x) } \description{ Returns the square root of a diagonalizable matrix. } \arguments{ \item{x}{An nxn diagonalizable matrix.} } \value{ \code{matsqrt} returns the square root of \code{x}. } \details{ This function is called by \code{regcr}. } \seealso{ \code{\link{regcr}} } \examples{ a <- matrix(c(1, -0.2, -0.2, 1), 2, 2) matsqrt(a) } \keyword{internal} mixtools/man/wquantile.Rd0000644000175100001440000000261614342153463015233 0ustar hornikusers\name{wquantile} \alias{wIQR} \alias{wquantile} \title{Weighted quantiles} \description{ Functions to compute weighted quantiles and the weighted interquartile range. } \usage{ wquantile(wt = rep(1,length(x)), x, probs, already.sorted = FALSE, already.normalized = FALSE) wIQR(wt = rep(1,length(x)), x, already.sorted = FALSE, already.normalized = FALSE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{wt}{ Vector of weights } \item{x}{ Vector of data, same length as \code{wt} } \item{probs}{ Numeric vector of probabilities with values in [0,1].} \item{already.sorted}{ If FALSE, sort \code{wt} and \code{x} in increasing order of \code{x}. If TRUE, it is assumed that \code{wt} and \code{x} are already sorted.} \item{already.normalized}{ If FALSE, normalize \code{wt} by diving each entry by the sum of all entries. If TRUE, it is assumed that \code{sum(wt)==1}} } \details{ \code{wquantile} uses the \code{\link{findInterval}} function. \code{wIQR} calls the \code{wquantile} function. } \value{ Returns the sample quantiles or interquartile range of a discrete distribution with support points \code{x} and corresponding probability masses \code{wt} } \seealso{ \code{\link{npEM}}} \examples{ IQR(1:10) wIQR(x=1:10) # Note: Different algorithm than IQR function wIQR(1:10,1:10) # Weighted quartiles are now 4 and 8 } \keyword{robust} mixtools/man/figures/0000755000175100001440000000000014343400152014361 5ustar hornikusersmixtools/man/figures/mixtools.png0000644000175100001440000005542214342153463016766 0ustar hornikusersÿØÿàJFIFØØÿá€ExifMM*JR(‡iZØØ ð ÿí8Photoshop 3.08BIM8BIM%ÔŒÙ²é€ ˜ìøB~ÿâèICC_PROFILEØappl mntrRGB XYZ Ù  acspAPPLapplöÖÓ-appl descodscmxœcprt8wtptLrXYZ`gXYZtbXYZˆrTRCœchad¬,bTRCœgTRCœdescGeneric RGB ProfileGeneric RGB Profilemluc skSK(„daDK.¬caES$ÚviVN$þptBR&"ukUA*HfrFU(rhuHU(šzhTWÂnbNO&ØcsCZ"þheIL itIT(>roRO$fdeDE,ŠkoKR¶svSE&ØzhCNÌjaJPâelGR"üptPO&nlNL(DesES&thTH$ltrTR"fiFI(²hrHR(ÚplPL,ruRU".arEG&PenUS&vVaeobecný RGB profilGenerel RGB-beskrivelsePerfil RGB genèricC¥u hình RGB ChungPerfil RGB Genérico030;L=89 ?@>D09; RGBProfil générique RVBÁltalános RGB profilu( RGB ‚r_icÏðGenerisk RGB-profilObecný RGB profiläèÕäÙÜ RGB ÛÜÜÙProfilo RGB genericoProfil RGB genericAllgemeines RGB-ProfilÇ|¼ RGB Õ¸\Ó Ç|fn RGB cÏðe‡NöN‚, RGB 0×0í0Õ0¡0¤0듵½¹ºÌ ÀÁ¿Æ¯» RGBPerfil RGB genéricoAlgemeen RGB-profielB#D%L RGB 1H'DGenel RGB ProfiliYleinen RGB-profiiliGeneri ki RGB profilUniwersalny profil RGB1I89 ?@>D8;L RGBEDA *91JA RGB 'D9'EGeneric RGB ProfiletextCopyright 2007 Apple Inc., all rights reserved.XYZ óRÏXYZ tM=îÐXYZ Zu¬s4XYZ (Ÿ¸6curvÍsf32 BÞÿÿó&’ý‘ÿÿû¢ÿÿý£ÜÀlÿÀð"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÛC ÿÛC  ÿÝÿÚ ?þþ(¢Š(¢Š(¢Š(¢Š(¢Š(¢¼ÏâÏÆO…¿¼qñ âö»gáí×ïÜÞHKvD³¹þ@ÌÝ­hP©Z¤iQ‹”¤ì’WmöIjÙp„§%+·²[ž˜N95ñçícûvþͱ‡N­ñ§^Hu c2Zhö˜ŸR»Çüó„…'2B‘ƒÁl×óÍûtÁÀÞ(Õ÷cËC iª¬²ø›SEû[¯ µ¼˜à_I%Üø?qWñÕñóöìŸ_ñ¡¬é7Óx·_Ô$2]ê÷ó<èò 4ŒKÎÜáxûÕû>Wáf-ÃG4ãLOÕ¨½cIkZ~IkËç£kírn}¶„éai¬VyWÙC¤³—Ë[~-u¶çô5ÿÿ‚î|zøÓ¥^i¾ÕáVøqF†Îà­ýÒƒÇv»_æòÊ«ÎÖ/Ö¯Á>ÿà¾> i¶7oÿáiøáÜ\îÔ­S8"¶Ë6ÑŸÝO» UdüQ|CñŠüu|5ïÞK}p ŸîÆdQò ú{“Xž ñï‹~êÃYð•ô–soÛÊHiü®>£>„W©xYÿÂ<²8fmÿO¯ÿ?9¯ñ[KssÓËht®+ʿܞ}Wÿ*_ù¯ßÊ÷þõ´?ÚöQý¹f¿Û;Ã?Ûßòʤ<$äŒ1*sŒšþÅ¿`ÿø8¯ZÒ¢²ðí½fuk& ‘x«J‰~Ы†º¶L$£¹’ ­þ­ÉÍpf¾ÑÌpÒÍx'±T²¤ô­'9¼´ŒŸÙRÜÃÂÅRx¼Š¯¶¦·†Õ#òÒÿƒ}Üþ¾h¯5øMñ‹áoÇ_ÚüGø=¯YxC½º¼±”Kጣc”uÎSÁ×¥WâuèT£RT«EÆQvi«4×Fž©Ÿ8Jpš³[§º (¢² (¢Š(¢Š(¢Š(¢ŠÿÐþþ(¢Š(¢Š(¢Š(¢œPÕ-CQ°ÒlfÔõIã¶¶·F’Ye`‰(Éfc€$“_›¿¶?ü?ölý‘–ïÃ2ÝÿÂWãDÓ$Vh\tS|Én=T†“„s_ÈíñÿhøÁñ÷ÌOŒÞ G‡ÙËÚxkKܰ>Ó•-%çqÇÏ)*§%BŽ+ô®ðË0Ìhhãæ°¸%««SK¯î§kߣmEômè}>UÂØœT>³ˆj•«œ´ÓÉiÁyŸÒí™ÿÇøKð¥.¼û/ÃuõÝÕ$$i6T‡º ÿp¬g9•üjþÙÿðQ¯|SñÍlj¾6x–ëÆ~$Œ²ÃfŽjÄŠ‹ˆm“¡*ƒqë‚y¯ÏO‰¿´Ç|sæišmLo”¤Mþ‘"ÿ· û£ý”Çûƾ=¹Cĉ·oÌÇÇSœþ5ôµx÷$áªrÂðvš¶ÒÄÕW“ïÉ´^©-5„·=Iq+‹£’Ó¼öuf®ÿíÕ¥¾v]â÷=âoÅÏüXcŠg aœ¥Œ[uôÈë!¯ø_?ßéÚÎ1*Ã8=¿ìëYVóñÆÍ~?™f˜¼Ã,V:¬ªT–ò“mÿÀK¢Z.ˆøÌN*¶"£­^nR{¶îÌPªÜqé\ί¥[G]ÁòÆTt9þUÓÖf°¬ÚtFO>µÀsœqȯ[øoñ«Ç? ¤X4k>Ã9k+Œ´$g½ã>ëÇû&¼’Šô²œç•âcŒËëJXí(»?O4ú§£êŽœ&2¾ª­†›Œ×Tíý/-™û×û ÿÁO~!|ñ´^+ýŸ¼UuáHT\éÒ²µ½ê©$£ÄÙ†åzà½z§šþÙÿaoø8 à_Æõ²ðíS |O&؆¤êCÜÈù{B}&-ÇúÞq_äöìñ\1 ¬Hö9àûCÖ¾²øQû[x×Á^V“âýÚÖš¿(.عx,‡‡ÏÏûUû}8w‹)Ç Æ¸gˆÚ8ªJÒòö‘IÝ|¤»FŸwOˆ²ÜÞ*Ž{O–¦Ê¬Ÿý¼ºýÍvQÜÿn[û-NÎ-GN™.-îdŠXØ::0ʲ°à‚A·_æ“ÿéÿ‚Ñ|wý™ÄüñøÂ1¶nü-«–h#Éù¼µ'͵sÎ#å±å•Åm?°ÏüÛöRý·ãµð΋ÿ§eQ»ÃÚ´Š“HýþË7ÜŽí—-Šù>.ð—4Ê(i`d±x®«RÕ%ÞI7ËæÓ”VÎWÐò3žÅàéýkÕl;ÕNéæ•íëªó?Sh¤”µùQòAEPEPEPÿÑþþ(¢Š(¢Š(®â/Äχÿü%u㿉ºÅ¦…£ÙŒÍw{*Å“ÑA=XôUf<M7_¶gü‚âê¿~Ç–Ÿdƒ ¯â]N n>õµ´œ î$œŒþìpkë8_‚s~ «É—ѼWÅ7¤#ë.þJòò=|«"Æf3åÃCN²zEz¿Ñ]ù¼Ÿ´§íðöMðÈñÆz+ &BÖ¶~öúïbæaž ¨§ï0¯åKöâÿ‚Ü|aø¿a}¡|;¼ÿ…kà¬2I,scR¹NF%¹òà ~î H.⿟?Úöã½ñ7‰ïõÙ5+xŠñɹԯ&ycßÓæ•‰i1Ð*ü£ȯÎÿxÓÅž<Õαâ»É/%\숢ÏdAò¯óõ&¿CöÜ'ÂQK0Ç®¯øß–êMys;­é³é9ò|›à¶#ºýˆ¿Öß?X³ë¯‰_µ}åá—KøiÚ…ÂæV'¼q·O÷ŸŸökâ½gíåìÚ¶§<“]ÌwI4Œ]Üû“’}‡nÕ-#Té_šñ/æÙõo™Vr¶ÑZB?áŽËÕÞO«gÌf™Î/0©ÏŠû-’ô_®ýÙÍG GÏSëQÝYÛÞ&É×>‡¸«] óG–p÷|v· KÓ>ôÇ$C€Tõ¥iê`‹Æ$uÇò¬úãu2 %Y $8ÛéX5×ø›XñÙò*ä(RÒmfîyn9=EqC‘šô›¯øö²•y£2Æ…¤!BŒ’x´ ö°\®%ú÷®Zæo;BqÞº„½±•ÄqO±è©"±?€$×;¨Ç㟧ò  ômoVðö£¯¢\Éks ÊKuÇ¡½AÈ=Å}Ûð›öÔŸM’ ‰ÊÊÑSRµ\8+Îé#^sßt|÷Ú+óúª]»ë_eÂ<{pÝk•×j/âƒÖõê­%Ñ£Úɸƒ•ÔçÂT²ë¬_ªýUŸf~ðOø8;ãÁm/Nð߯›“ñSÀÄ*Evg «ZÆ?wrÇ…äùw@$P1_ØçìµûhþζOƒÿá0øâK}XB ÝØ¿îoìØöžÝ¾tç 6 6Öa͉'€þ'x×á¶¥ý§á+ç¶,A’?½£<‡Œü­Ÿ^v5ú«û4ÁB5øªÃÅ:³uà_Xmµ +—… žË*È)'ÊÀãšý[þ0®9í–æRÿÁ%ø(¶ÿÂõÿ—ŒúÿøBÏûaqOÿÉþoåÿo3ý‹h¯äKö ÿƒ>K‡Ÿ·U˜¤,kâÍ&qýû»HÆ©’Øz(òkú¯økñKáÏÆ?YüAøW­ÙxƒD¿]Ð^ØL³Âþ£r“†^Œ§ §‚¯ÊøÃÃüï†k{,ÒƒQ Ö´åé.ýy]¤–é%pî?+©É‹§dö’Ö/ÑþŽÏÈï¨¢Šø³Ã (¢€?ÿÒþþ(£8ë_œß¶Güÿöcýã—Ãþ%Ô·üZîô-ÖK„'¡¸|ì·^A;ÎòU½,§'Çfxˆá2ú2©QôŠ¿ÍôIunÉu:°˜*øªŠŽR}õ¢óØý¹¹·³·’îíÖ(¢RîîBªªŒ’Ià:“_ˆ?¶_üßàÁ/µø'ö{H|wâX÷Fn•ÈÒ-¤²®àŽ>XHCÿ=¯æûöûÿ‚½|døÿo5¿Äíq<1á9XýŸÃº[0IÀÎ<Ì~ö鱂wâ0FB->ŸjøÇÌÓ<*EÓÛ*J°7R/»Ž{'?íWë”ø3‡ø^+Å•ý®&×XjNþžÒJÖ_8®Î{c.Ê’©œTç©Ò”þ”ÿἜ¶?Y?loø(§Ž¾/ø¡¼MñÛÄ·>'ÖqµÒà!-ìÕ ‘."€c’ ¶9Ükò'âGÆO|Ng¶Ö¦úy?-”ˆ¿àg¬‡ýî?Ùä'6ˆ{‘“êIêO©=Éæ­WÉñG‰žoOêTRÃàÖŠ=#nÒjÜÞ–QëË}O#6â|V2šTè­¡¼ûþ ÈŠ 6)³´v­¤"]‘€ ªÖƒï¥\¯ÏO›+½²1ÊñR$IùG>µ%RâÊ ž\a½GZådO.F®ÒGå]­q·?ñðÿï«,1Ì»%Èêñ}†EŽ#ÃŒóÚ»*ä¼Iþº#Ûi­sógw9¬ RÎ-Úê/”ŽÝ¹­úËÖrtéäñüè†yC–5ô—ìSim7í£ðx˶|yá`r^ÌAÈ5óU};ûÉè|ÿ±÷¿úw³ ô#ÿƒ­´Ãþ C=ÕœÈ|oáÀY"Unn¸×ùtˆÑâUqž©güƒÿ(š—þÇéCWùkGþ­~‚€05 ÛH#¸Îk(’NMjêç7 îÖME<†(÷šÉi¥fÜO=? Ñ»ÂqëY4ïß ¿hŸü0‘,­¦ûnš6w JÇú¶ûÑÿÀr¿ì×îì ÿTø£ð#ÅÉâŸÙ»Å·>Ôå Þè·L$µ½U8"H˜§Ì@~R¦¿›*¡ousi*Ëd`Àƒ‚t õzŽkõ®ñ{4Éèÿfãâ±x¬èÕ÷•»E´ù|•œzòßSì2^2Åà©ýW•l;ÑÂz«y7{zj¼®¯/ìÿ~Îß´{YøöŒX>xº]±‹‰¤'E»œ|“¹Í¹8'dÿ(à XœWômuo{]ZºÉŠH!•¹Á±Wøs|#ý±¼Wá$‹Gñʾ³c %Ü>Ö€Ìp$ú>ûF¿§/ø&ïüÿã÷ì¿cmað×^Oøo ê²3%¸î c™m®æ"NY¾º¿‡œ7ÅÔåŒàŒO²ÄZòÂÕv~~ÎM»¯œ—yCcÙ©Ãyfs[!«ÉSwFo_ûuÿîî;é]E~e~ÃðVÙ?ö豃HðV«ýƒâò¹›Ãš«,W„Ž¦Ý³²å:c;ÂŒ².q_¦€ƒÒ¿ Î2L~UŠ–2£*Uc¼d¬ýWtú5tú3àq¸F«¡‰ƒŒ×F­ÿ¼Ö‡ÿÓúwöèÿ‚÷|Yøµ¥áOó†¾ Uu—Ri‚j×z´Àí¶s¶\<Â+ùdø¯ûbÝ_\ÏeðÝI%f2jwŠK31壹bN~y>¸5Ÿû_ãþßnéý£'çä>+áÚþñŠjp–&|1Ã4c†¦£*‘֬ܢž²z­í}eü®+Cô®&Í¥“Ö–U•ÁRŠJò_®¯»Û^ÍlnÞx—\Õ55mjê[뙿ÖK;vöÉè=ÂŽÀWY(ƒ=MyµzrT9¿jT•I9Í·'«oVÛÝ·ÕŸ›JNMÊNí’¤ÊWC`Ä>sú‘¥suÒi}—ä1¨¨Š)2Á  ð3E#“@²LòuàzUi"IF~5%ËÞ³C3B‡ßëY®« *ã úÖ†¤A¼|sÓùU嵋d²Ešã8Áí\Ó39Ë×Yâ6_³Ä™çvqøW#@wÖ4m:¬ ž:W´~Ã÷MûjüÝÀÿ„ó¼Ü^μŽñ•-$f8O_¥})ÿïøYñÆÿµ·ÃxSHž÷NÑ|sáw½¹M«[u;YHË2—a—eŒ3*|Ì )ÒIrÓ‹o²Wýàëå ÿ”ú<7ÿ¥ _å‘zïo)µC€3ߥ©Çüyÿ(ž“þÇ ÿéKWùbê‡7ÎGCåYœ@o½ÍPž%{Ö…T»<@ª•żeL‹ÁÕÚŠsˆ[>”‰Q¼I ù‡>µ%’뵊úWAáÏøƒÂz¤Zχî峺‡îK m`3œg¸8åNAô¬Nd$zÔuµ EZ#VŒœdÓNÍ5Õ>Œºu'NJpvkª?N> þÜ-í­·ÄÖWP:,ìà—Î…eÆ7 â¬G#ÄÛã8#Ò¨Ø2µœeH8qVè~ÛP–d*Ànéʼn9'&³lYrËžxâ´hÂ\: EDò<‡æ5: Ë>´ê+š½¿Ý¡SµA#ަºZã&eyä<ŠŠ°õJk-±@.3¸ö­Êä|FÀÜÄ òçó  $’W2JŘõ&¨_Ý;G¹Q¸®8>õr³5xäžËìЩy&’8‘GVyQ@ú±ñæ€6~ èÖ?¾2øKÂ^(_>ÇU×´‹âÜP47wÐC"åH#tnÃp9È â¿º¯Úöýÿf/éÚ—ìÙá6ðõ–—ãÝßMQwt ÝVçbn%‘å°w%”E7? à…ßðTŸ|Pð·‹~%ü×ü?áí;ZÒîõ Fiôò¶öð]E#¶"¼y3…ÀÚ¤äô¯ìsöÇð‹|yð›Kðÿtéu;«xrõá‡nå¶³Ô"–iæQ¶8Ô³sœ<Oœ(º‰ë'oºÍþ./ä}PR«*l­÷ÿÀüÏ3ÿƒ‘|msã¿ø"e®©¨Iæ^ÚøãÃö7Lz™m®] wP¯ÿ¯ó7¤‘*¸ÈÀ¯ô>ÿ‚ùkeÿà•¾-ð³?Éÿ Ï…5(W±ßq$2cþùCø×ùâEÌj}…scb•fÖÎÏïW·ÉèxØÊƼéö‡OÀÀ¿Í´‚8ûŒæ²‰$äÖ¦®A¸P;-eW)ÌE<†(÷šÈ’GåÎkJð'ñ¬š+6IÞN: Ò'šÇ Š( ¿U?a¿ù&º·ý…þ‰Ž¿*ëõSöÿ’k«ØPÿè˜ë÷o£¯ü–4¿ÁSÿIgèÈîá—äÿÕþw?l»¹$ð† œÿÄÆNíƒ×çÕ}õûd<- dãþ&2ü€õð-~ÍãÚ·b?ÃOÿH‰ö¾ ¯ø[«éý%vZ­ÕžñÿtÿJê¤äö•ÁÉ®Ùe § Ž¢¿>(µou=£ù–ìT÷ô?Q]u®¥%ݸ“OCjâk¤ÒM©PA!ŽG¥j†`Û úÖ¤z´éVbk*š]‚±ž€÷  æšIÛ|§&¬ÛêÛ ½Gcþ5F™!U™ŽMU¾Õ®ï²¬vGýÕéøúÕäxŽPÔ@‚2+éoÙ;öBý ?nŒüý™ô›]kÅ2é÷Z¢ZÝÞÇa¶²1,ÍçH ‚¦hð¸Ëgކ€>^Ôµ›ÆÞŽXuçÓÒ¹ÂI9<“_kþÛÿðOïÚ»þ óãmÀÿµ†ƒe j~%±›QÓâ²Ô¢Ô–K{iž%P„;¨Úy9Í|O@¯îšÖ È2IÇ5“¥Ë$ÚþšòœŸí ý*Š­k ¢4BFIéÞ¨èßòÓì!aÿ¥PÐû/þÖZÊY|,Ò´8mNòÜ0õŽÙ ÇÿUùâÌÎ0ÕõŸík®}³ÅZ‡£l­†˜gaè÷Lã±ξJ¯ZÜ´á+ýîÿ•¶Èiráy¿™·ú~‡âGü¡j:¯ü‹ZÔ´ÙN•­i7Ò¢ÿ0Îóë°|ÿðÿ>Fòxfk8þPœ:šÿIø+^gâoÙ㈠o­ê¶ÚlŠzwÑüy–¿ÍZí.#œÇv•B‡ Áõ >⣯F”ûsGî´¿öïÀñsú|¸žné~‘[Þ«\ÌШÚ95f¨_}kÌ<2ƒ;9ËšÛj–ô§TsFsé@òJò}î•PEP_ªŸ°ßü“][þ‡ÿDÇ_•uú©û ÿÉ5Õ¿ì(ôLuû·Ñ×þK_à©ÿ¤³ô ?äwðËò?ÿÖþl¿mò[Á?ôýõùã¦ê÷QȶòþñIÀÏQø×èoí½ÿ"F‡ÿaÿÑ_›–¤ ˜É8…~Ñãïü–ÿÃOÿH‰öþ!Èꯤô”v²Jò}ãÇ¥Y³Ô.lîåî§¥R¢¿> îã½{˜V@6îÅ,RËù±VõBÁ•¬ã*A@ãš·@çÄ7~G–wÿ{ÿ­X’Ë$Òy³1fõ5õݳ#>éÔ·k®Ý[®ÉGšLð:¡w}szÛ§n;(à ¢Ì¨2Ä­Y¶E’æ8ߣ:ƒô&€os<s‘èzWï×ükãOøcþ Aqã O7ÃÁZí·˜Üà גÙš^A*|—;W–ÛŽ9#ö¿þ ÿ-ÿ‚gþ×ðKŸ†?µǯê·7¹# 潌“F#÷‹ÝŠ»óì¾ýü“<ì×õl<ª/‹eêÿËr×üað3ã/í+©xgâî—¯â GÀþÔ&ya´ jÖr’ÜDÍ @$ª¨%ˆ† Èz‚?Œ+ývHâAiµ¼ÕܲASÐŽÜŽA¯õbø‡£j^#ø®øsHòÍÖ¡§Ý[B³Dd–6UßÁùrFî«üß?à¤_°¿Ža/V^ñ\ºkÙx†ÎãWÒ¢Ó® æÞÍ.<ƒ ÀÇÇŽL„ ¸¶¶rp=.!ÀB0Ž"”RÖÎÊ˺v^;yumžoæ3¯Rªï%ª~_ðÏY%’Y ²±f=ÏZÚЮ¦Öœ¿x‹û>¢ê*®Á±ÝOã-Ú´O.©§$qgÜÝC…üOòñŒ¤Ôb®ÙôgúØühÖF»ñg\ºŒæ+y!²ýÛh•Oþ>^¼Ä¨5µÅåä_nÔãæà™¦ÿ®’’íú“Sׯ^Ê£IÝ-¢Ñ~ýKÙЄ;%÷õüOÊïø+Íì¶²\7ñpÖÞ%Ò%\zÆîÃùWùóþÓÂ?ü_áåÁ†=Vy ÀÆ!»ÅÊ~K6>•þ ?>ü3ý¡<>|W±}GIûT7~LsÉn|Ø ØwÄÊØÔx;†ß“»®sÍiÇ«N‘•`ö&²©¥ÑX+ èzžY¥·JrkOIÔ'·½…Oξbð~¢±êÅ™òÇÌ^¿Q@êÿ ñtÿ‚|ñuÒ†:ûªã·\ª/ü ˆz&h4ë(ìÔ((>mŠw–€‰8ðçüïŤÁÿg‡Ö­Ìúeî£tháÔ.V%?ïKóúç_wŽ8¯¼áü7²Âó½æïòZ/Õú4|Gâ¹ëFŠÚ;ú¿ø˜+tWñ¹ÿ5ü6‚ûâ7†~/iŸµèZ“ŒÖ÷2Êar÷f‰c8Çg°¯ìy¾õ|iñ_ö:øiñ×ã¿ü,OŽ:•ã/ ¯‡àÒ›BÔbyÓEwö†'…Y>QüAðkÕÄáÕj3£üÊß=×ãkùFW‹ú¾*Û?Gý\üZý¨ÿàٟٳà7ü?Ŷއñ3Å·Úç‡ü|Usœ-$¸[UŸÊr–Ë/–Xí;\6?‹=”?٠£Zý¥ô›«¿ÞÛxi§Ö$ßÜÙabéŸ>Hˆ÷þ«ŸðWÛO YÿÁ¾:Xx$ƒFƒá®§ŒQýĶŽ×¨@T`úWòiðßþ ÔøÕû9\ÞÞÞüHðΫâ[]6áÚÞÆò1 Ípb%äbYÙ‘Ž0QÇ<~}€‹†#žZr]üÖ×ÿ·¬ÕðT}µxSèßá»üéŽÕÙ-cÝÎsù †I^N§J™WÊ··ð¨ÅU­ÑÅ‚1ê+ñCÿ‚ü4ÿ‚’|lñtÿ´ˆ¼Ià{¨|E®ßh«¦ÅdâêÊy-òù¸ŠsµÀ¸ÚxlŽ•û?]¯ÂßÂñGÃþ(-²(/£ŠsØAsû™ öÃÀkj+™ºÌšùôülpf”=®¢[¥»Sü—¿kŸ„/ÀÚ{â/Á_ÝÏ}cáëš½ÅÈUšXtËÙm’G‡uŒ3A<0+æÉå1¨ÛÔ×ÝßðS%)ÿøå‘ñÅÿúv¹¯ƒnÏWŠ~|Sff9c“IEQEQEWê§ì7ÿ$×Vÿ°¡ÿÑ1×å]~ª~ÃòMuoû ý~íôuÿ’Æ—ø*é,ýÃOùÃü2üÿÐþaÿnù4Oû¿þ‰züÙ·Ôç„mœ{õüëô›öáÿ‘Dÿ°‹ÿè—¯Ìb@ä×íŸHù,kÿ‚Ÿþ‘î¼Fÿ‘ÝOHÿé(·qw=ÉýáãÐt§Ùê6'÷-ò÷SÒ©Q_‰Ÿ u²js\F €ŽqÖ«E4°?› aÜU[r*sÅM@çÄ7F T?÷¿úÕ‰,²Í'›3oSÖ¢ÈÎÜóC0U,ÇrIì(rÓ]º·]“4vÉçó¯iýœ>|cý®~9è_¾ YC©xŸ[ûTÖVÓÜ¥œl {©™æ—÷q„Š69sÉÂŽHWáÇìµûJü_¸†ÛáÃÿëž~Ý’Z铘Ná|×Tˆ9¸t¯ëgþÑÿpÕ¾kþý°>2êKŠíòÐ¥¶p¶h|È[l¬c.ò.ÆÞÑ”r  ï>Æ_’â1NQq‡Y5ùwÓ²8qÙ…-79½z.¯úî~×ÿÁ8~ø³öbýŠþüñÓ»êþÓ~Íp]•€>c¸ ´ç%W¨Ï<æ¾à.M@%ˆ o/ èãó¯Ð9RIEY-ì–Ëä~eZ¼êÔ•I½[¹%C+•àw§yÐãgÞjã̸¸Š5’Ι¦—s+7¢8/ø(Ÿˆ¯u?ø#Çí¦‰ã’ÊÛÀÚÊÞBÌV{}ð±ó!*é É(Å6È ‚î¼C¯ÛkFÊ{+‡¼†+D`<ïä¦ù-€0T•â~(øR÷Ú¯€>Ïc¯ézõ¤ºn­i{\ØÝYN1$2G ) qêkcCñ¯…5kHã²¹ŠU vÊÀ<: WÉf”%²”åzÝ-oÙÿ^·zŸ¹pM:žÁUÅ.YÚÉ>«¿éøìε™›­6¢Û·)"£KæÃýñù׎}õ„f=*&D‘JH2§‚=© ±gïΓ͋ûÃó¦›Z£Kȧü ÿÆý“ÿg_ًÿ¶/Â{~_øûÇÚ•·‰Æ£~.mÕŵޡ+Ö¾_™ I“ò69ë_Ç;d“žký;¿à¥°.“ÿø9¤|%Ô|UqáXôa5qqoºÜë ÛœÂÏ»¥p2Ë×ü¦ÿÁL¿à€×ÿ±Âß |Døñ"ïãLúÅÅôz…†™á‰¬n4¸,­ÁšáâåÕ2êª!›¥F/ )7Z’ºz»}—Öý—gµºÝ;~{™eóÃUjÞçGúz£ù¢¤’)!}’©S€p}È?B9y§šQEQEú©û ÿÉ5Õ¿ì(ôLuùW_ªŸ°ßü“][þ‡ÿDÇ_»}ä±¥þ ŸúK?@ðÓþGpÿ ¿#ÿÑþ\¿m‹ÉOtXߟø˜>õ/_˜ï#9Ëý-ý¶<¢ØAÿôK׿}~áô…Iq•ðSÿÒ÷ž#ÿÈô”MïENòqÐT$€2h‘_‡ŸM ó[¶è›Ým.¡$ÑSßÏÕûVSçšµ¹³»<úÕ¡væ3€6F9þµR²‚žOJû_öwÿ‚~Ü_²v‰¨øsövø¡â? ØêÒÅ=Ü:}öÄ–HSËFo69Oʘ@PŠú(Ásÿà­€‚~=xÈãÖþ[S_“õ,PË1+ÜG$¸¦äÛ»bv[Ÿ«Ÿðüÿø+`Æ><øÇú‡¿ýºÒø.ü¬cþ/ÏŒxãþ?áÿäZü¢’9"Å2”u8*À‚¸<Šec²?Veÿ‚ëÁZ‘¶Âøñ‡LÇü?ü‹UüKþ Êß㯋›Œs{ÿÛJü•¥;NqPÑvë$ßð]ø++–øéâîxâöþDªÇþ ½ÿ_lçã§‹ùÿ§È?ù¿%ïˆØ½fQvëèÿ‚ðÿÁX†qñׯ>—°ýµ§ø/'ü”çþ/¿Œð:þE¯Çò@4´]…Ï×ÿø'ü—þ‹¿Œzçþ?¡ÿäZ®ÿð^Ïø+6ÓñÛÆ\ÿÇôü‹_‘™1̧]Žìýˆð^ßø+ÿšïã.ãúþF®sÅßð\?ø*/Ž|)©ø+ż_{¦jö³Y]ÛË}I`¸CˆØ·k) €G¿%h¤dÓÏ-Ìžl§' £Ø(À*ºú}Ê@nÒ pêH¾Î? ¥CVQEQEWê§ì7ÿ$×Vÿ°¡ÿÑ1×å]~ª~ÃòMuoû ý~íôuÿ’Æ—ø*é,ýÃOùÃü2üÿÒþWÿn/ù´oû?þ‰züÁŠîDá¾aï_§ß·üˆZ7ý„ÿD½~['ŠýÇé ÿ%ðSÿÒ÷ž$Èô”O,òK÷”‘M$GåÁI¾(i3ü`Öíí庰¹ñéBÙîxUmÝW?*Í;(“•TqQK,„£9ΪšQ‹¿<®®­ž›]»-}ÖÞ„ÇÜ\›Iée­Ýûiø»y\ÿ<ë}Rh—kþðv=ëú{ÿƒu¾5ÿÁ#¼ª|@ѿ਱x`¥Ýµ¼º$ž'ÓúÛÌ:̨DR/ËÈ8Êô'šõŸø8gþ ñðOü³Âz7í[û&jWú¯Ãfý4½CNÕ%Wz]íÊ–¶xîCOkpTÅûßÞE&Ï•È_ÿ‚ÿÁ*?à‹ÿðPï€:Nñ#Æzçü.poSÐ4­bK9ÖÜ“y>S Œ¿0`ØlñҶɽ´=µL=U rµö¹­»qåMè“r}î^™)¸É--Ööëkzkä5ŸðTþË:ÏíÙñ+Wý‰#°á”ÚÜáøôÈÚÌYyÜÆê…#3 Š£œñÍ~~ÜjsO”Œì^àkögþ /û*þÊ¿°ü?Ƴ-힯®|,ð~³¡¥Ì7WÇûJ[+ë[»‘ö•þñL®#m¼“_°ð^Ïø!7ì£û,~Æþý»àŸSë:ƒõ;«[}\_jÚ1-¦¯:}äo&϶@-“2\ן,–b”“NN6ÖëDÓzY'wmnùe¦†.—îý¥úÛúõé¯Fèì‡rp}ªôwRψâ1ã#Ÿñ¯ë'þ Íÿ‚üÿ‚Œéž,øÅûWÛêCÁši§Ø.ÞÁæ¼›•ýêãäX•¤~:<|õ¯ýŽ¿foø#ÿÅÏø*·!ñÄ{o| ð®²Ñxv/j{½vVû­î”0´Ì’H‡åhm™#_Z—KëT0ÕëF.qŒÞíÅIsErÙsNQiÆmËš+G{uGj§9¥t›Ý´šºÓ«jÖI»Ý-:~5üNý¿h_„¿²·†lé©cá/j—>™$ÒmžâæÖžm±æ8Õ ´¡¶ù¹ŒU˜|C#ìBÜWûÁ`fø$ŸÄÙóá§Ãoø(GŒ#øaà?_ºø],¯Æ‘™mL^Bü«ÈA·ñäWùÊþÝ?±gìŸâOø(º~ÍðJïÜ|Dðv²šLzm麉{˵Äð¤Ê‘y…$1ª¯Á8ËJ˜8c1Š–[ïË–m¹v\ÎÊ7{»;+ôFr¥µypëwdºù]èÅ}·ª–Ç ¡^XNÓÛ¨5þŠ^ÿƒ}àßðLßÙûGø±ÿsñðM[U%µlí¾Ð{Ám¨ûUÓ ûì€ þêŒWãŸø7¿þ ÿ=ø­üUÿ‚2üPòüG¢FñGa{>£¦5Ë ñÁyÚý¾ÈÉ‚d;@$ùrŠË¥Fð§YT’ß—™ÇäÚW×KíÙ´Ó2«IBN*JVí{~Kü»\ÿ=é'wàp*4ŽIØÁcí^Ùã¿Ùóâ¯Ã_:Àè—:?ŠôFm*ÿM¹ζ»·r’Æå7)ÚA;”•dÃŒ©ýÁ~Äÿðmwì=û9þÊ–ß¶oüëÆMáÝ"Kh/ZÂkÏì«{D¹À‰neæS4»—e¼_¼…%˜/”ʵ bêÍS¥kÊúË~X¤›nÚ½9VœÍ]^éᜩº²iEiwÕöVO_ÁujêÿÀ‹Å$g>†´4„I5£Rè=,+ý|7ÿnÿƒs?àª×>Á5~*]h^<ҭ乌[ß]_lÀ(%›LÕB´öá™w´ :’3üNþÜß°ÇÆ_ø'—í[®þÌ¿m[A¹ƒeÄÍ¥í­ÇÏoulîxf@JçæFWþt9óëSP~ëºkGf®µ9j&¢ýý¬ÿÁD?cïÙCHÿƒ]m¿hM'ᯆm|yá{¥ñ:]¼z žçT¶ŠWûR —t‘³#ß2’þxºŠ$z„ñÆ0«#ašÿLø)üª)ý‹ÿÓ½¥ ðM¿Ø'Å¿ðQ?ÛCýœü/p¶gX»a5ÃýØ¡MÏ#œsµ›ñ´a˜õYö˜q3y:µ5oEÊM¶ÞÑŒSo²^G­Œ§R¾>¬ך[ôI¿Á%÷œ«op˹QˆõÅDAþŸà˜ðkïüþ=/áí×ã+ùückÓÇ%ö¢÷­Ìʳ›])ÛÄ̧a“°?1Á5üæÁm¿g/ø" xâüëâ}ß‹ïüS5èÔtƒ¨ÿhçZÙÄ$>%¼·–idDT™ÈuV*\×ÎbèP¦íJª·iI/—4S·ªOÈó§›JIú_õHþqh¢Šâ3 ýTý†ÿäšêßö?ú&:ü«¯ÕOØoþI®­ÿaCÿ¢c¯Ý¾Ž¿òXÒÿOý%Ÿ xiÿ#¸†_‘ÿÓþU?n™|£gŸø˜?þ‰zü­wg9c_°¿µßüAð5¯„í¾×=ɸxƒìONqœã§Æ¿úEåØª|UWh¤ìöm=×CôOðÕc›Ê³ƒP’´vJö~]JÑÌññÔzQ$ï'CE~~v~ëÿÁ¹_ò–_„?ö‹ùýíÿƒÖ~0xÒ¿>YßO‘¦øsR×’äd¯o.ÒÓÍe é nˆÄ¢FÆ2kðKþ Êÿ”²ü!ÿ°ì_È×ì¿ü¸C~Ù? JœÿÅ/þœÚ¾ƒ3ÿ‘v ÒúR;+ÿŸÏô?B¿àËŸkú—Á¿Œþ¿¹y­-õ"åض$—íQ±çÕcP~‚¿Š_ÛË⇎¾ ÿÁB¾(x³ÅZÍÝî±ãjK‡’VmÀjs@¨r~êCD‹ÑQBŒ_Ù·üYÿ$ïãvççDÿÐï+ø‰ý¯9ý¹%×f{«ïì?ÉçÊÅä.·öI¸±É,W©<œ×à?ü÷#ø)·lùqøsR ¹á~çAÚ¿x¿àªXðiö„½ÿ°|ÿ§+*üÿƒ??å%:ñÿ©wRÿÙ+Ò”Râ<Á%¢úßþš¬]M3 ÉÓßý&gçÏü¿,ÐÁp><Éw‹ÿ‘_ìK*þ³?àß]_Zÿ‚Á~#~ÿµ=Ä~Ól®ô rãˆÆŸ}ÍÖ‘‰ó,dt$achjþgà»?üMûBÁÄ~xBÒKëýoXðÍ´pÅ÷œÉ£Ø UÏ™Q}è+úcÿ‚ÂüQð‡ü/þáÏØ+á-ôV~:øk.uqhÂ9E»¢¾µx¸l¨*ëgþ*÷kÇÃQž½zúûV¡Mz-JSÿ·"ù:_Úèô’9éÁC :“ûNÑ^jÍ¿’ÓþÞÓft?´þ­}ÿ¾ÿƒc#“öW¹‹W»ñΟae¨x§Fqök5ñKˆn/ÖE0°Xâaknê,8Á¯ó¨ýœ5;áñÏA–’ßv¡n»Û…\…\ç$(àgµw¿ðl7íIðßöõý…>%Á"ÿiº…„:]à°¶fØÒhZžc¸†6”kYœIS¹7‚Û_ÆÇí û3xÓþ åû~kŸ³÷Åìý»ÀÚð‚{¢6­Õ²þö µ˜„¹¶xçäç%Çð‘^®¿ÖŒ6?%É:´ê_K(¹§m4\šÅ¥¢qihެ=eý¥KUû®q•úZéúi·ekÛÇü]sqiû|¸µ‘£‘‡ÿƒÁ~,øß^ÿ‚Ÿ§€î/îLð„´kKB±§ö¸¹¸p£Ò2Æõ"5'üñsÆ^ÿ‚•Gà›{©äÓ¼W¡jWÑ—%mÑ®",:Ëž›Ž:šýÿƒŽÿà‰Ÿ?à¤ÿ¼ûvþÀÑÙxò[ÃÖºv©ckoϳ¼–WÖo)Xn#’+‰Qç+ ±²ÀéàÜ¿ø"WÇ_ø'?¼Eûc~ÛYx:]7Lº†ÎÒæêh#‘Gs<ˆíQE¿,ù%É *Œ¬†ŒiJ¶'Ò„iÕ›I¹Jœ¡£»|òŽËEy=a‚ŠR”êh”e¿wnîíz-vGÆ_ðTÙÏáÖ«ÿO|?ÐÞÒ%·ñÒøKVÔ£a˜Þy%{YŽÜãt°Ú"“ßÞ½;þ`ø¯ã->Ëà?Á­6äáºøƒÄ3Ä£ýeí¯Ù­-ß=Œ1ÜÍ´ã#w¯À¿ø(Ïü£NøÉÿµ¹ý»¾}áßëÚ\^W_ÚtÝ”E(9$ ©<éÓv—"dšþ½ൟ°æ›ÿ~ÁŸ ?k?ø'î¥aâm{ÂòëM´k¤·7¶ZœH·vM#‘WvóÅòæØ7#¡e$µOi”áéAü*]vsTì߯+_öé3š–]%/ÅG_­ò?†ø!¿Åß|2ÿ‚Ÿ|ñ_†®äøŠÒÕËÛ­¯¤KyãëÀ’9>½ó_Óü³ðßÃÖgï‹–ð.©¬iÚöu613A§ÏgséÈC,ÓǙï\Ÿü¯þ Áý²>þØžý¡l h^ »‹R†ÖâæÞyï.`;âDKy$àH¨ÌÌUB©Æâß/ÄŸðu÷üáígûuxàÏÂ=JÛYÐ~ØÏ¤Í¨[8–)u{Ûˆå¿0á’³Á`H2 Ö™Ä!K…¹)U\òviòÆ\ª1mu¼e+tæ×VðôéÞò÷žµ—®Û¥Ïßoø)üª)ý‹ÿÓ½¥¿ðHoø(œðLÿۻß´†µ¤Í®è–ÜZê¶̉q-•ÚþË?5;_|I¾×tÝ]öý¡`Ò-eŠîü¯-Ï$‚'ÚB£8lx8¬¹ÐÃB¬çi6¹SMÙ%ï;7£½•í~—ÖÜ5(rÁMµvÞ—××þ~‡ù¦QA¢¼³¯ÕOØoþI®­ÿaCÿ¢c¯Ë½;JÔ5k¨ì´Ø^y¥;cŽ5.î}@$Ÿ 5ûû(|3ñÃïÜéž(¶ò.¯ï ÊBgT1¢Àd%z:þ‚ú8娩ñLqp¥'Jš”¬ùSq²Mì›è·gèÞaªË6U”$c+»h®´»ó?ÿÔþŽo?ø!ì»û\=ÿ~ÆŸu;Ϋ¥¦OÚ-ÔîŒÓXùeú®Wé_0º27ø×úª~ÞðnO‚ü\·¿aûäÐ5&-+økQ•šÆRNH¶¹mÏ =£—|dœoEŸµ÷üƒÄ|s}ொ^»ð‹àùä†x6E6Iùö’DcœM aº‚E}&/ÉèË0àLUæ•å…ªùjGü-½W«qÿ§èzu¸WšÁâ8~¯½»¥'i/F÷_6¿½Ðü}øñçâ§ìÙñ?GøÅðgZºðÿˆ´+”¼²¾³eYaš<á—zº 2²žàñgý±?oÚŸöññ~ã¯Ú—Æ7þ0Õ4«/ìë[‹ñh­Œ†S‹x`@¥Îã•'=ûW‡|Iø1ãÏ…·BÚ…Ž#¹Œï·ÿ²øÿu‚·±¯( ©*ÃuøVi–ãrúòÁãéJHo&šù>ÿŽçÀb°µðÕDdº5f}åûÿÁK?mØ!5è¿eê¾Ä‚Üj bmÝ'û/˜c,·0N ¯˜ø(œœ“Æ>>ñw|SãÞøÿÄ—’]jº…Ü·×2d’âyZi$l74ŒÎpÉàÅq´Wç);ÉÝÿ–‹îG;“z¶~|Aÿ‚­~ÝeK_Ø·Ç_µ}Oὕ½•´:Á¶ke‹N‘%·]ÂÜ\0‰ÑwNNTdµxoì¡ûgþÑß±OÄÃñwölñ]ÿ„ü@`šØÞX˜·´Sãz²ÍѰ8P‘Žç?+ÑOÚÏ™Îîî÷}ußᄀÌï{ê}Å/üWö¼Ÿö¾Ÿöé›Ç“üO¸¸†êMxýŸíM-½¸µŠùAÙ „P`*€jæÿlÛ³ö¦ý»¼scñö£ñ¦§ãWM±u´ÚƒÅû«pí&ÄH"†%ÛqÂnc‚Äáqò œäÒMè¶ ½ ÿfoÚ‹ãŸì…ñcNø×û=ø–ûÂÞ$ÒüÁm}§È©*,Ècu䑲º± ®Œ§Ó ÔþÖ¿¶ŸíûnüP‹ãí)â›ÏxŽ+4á}x°$¿g¶y5ż0'Èe|›¾b7c¾S¢‡&ì›ØGê?ì§ÿ—ÿ‚þÅž ÿg?‹ï‡<>ŽÒE¦£[ÞÙ@_–ò`¾‚å!Üy"-sÎÜ䟙ÿkÛcö“ý¸~(Åñ›ö˜ñ]ïŠüIœ)}x!I f‘ãE¼PFª,„™ËIã(QI¶ÝاŸ²ü#þ )û xHøöcø§¬x_CóL«¦þ»‘£´½Šxâ.I-äù@žH&´ÿk?ø,ÿü“öÚð[ü9ý¤>,k>#Ðd“Ì—LU·ÓtùŠœ¨–ÚÆ(`‡'2®FqœùaE ßV’Í,ò´ó1wrY™ŽI'©&¾âýà¤?¶—ì'¬]k²×Ä]kÁ¦ùOÚ °™ÒåÎÐ$žÒá&¶•Ô( í˜ñÅ|3E ?h>=ÿÁÀ_ðVÚ;ÀWŸ ~&ül×fÒ/Ñc¸·Ó!´ÑÑ‚7$’iðÃ;£‡_9U ‚ øÑuw=äÆyÎXñÀ:Àp*µ÷ïìwÿ;ý¸?`Èu_Ùcâ6µàûmUÄ·v¶RÅ%¤ò€I%µÔSÀd ù‚0äpX€î¼Cÿ‚ÿ‚ˆx›ö¡³ý±õŠºú|D³ÒSC]jÞK{iΞŽò bÛ¥»C¾F} eŽI\(3,ÌÏ,+ûyýƒàÜ߇~_m{ØüQ«®ÙSö˦Âà ‰†Ù.q”M‘dLŠk÷l/†™ RŽ?Žñ7¨Õã…¤ù§/ñ´ô^GµKè}ýËò˜,GU÷·T ï'êÖßz_Þè*¿ðNŸø#÷ÆÏÚOU]/öqð³.žŽ±j)ÕIŠÎ.Ç}ÁS¹‡¹Y†s·×÷ûÁ¿e¿Øáì|yãWÇþ:¶+*jz” ZÙÊ0sijK* –C$†T¦q_±ð¯†| ÚxWÁÚ}¶•¦XF!µ³³‰`·‚5è‘Æ€*(ì·ëæ8·ÆË1ÃÿeeÖ ´TéhÚþü’MߪI'ö¹ž§•œq¦+Oê˜(ª}¹c£kûÍZ÷ê•“ë}ÏÿÕþþ(¢Š+ç¿Ú7öVøûXøþ|}ðͧˆ´ÿ˜Àg]³Û; ·™1$/ŽèÃ#ƒ‘‘_BQ]8Le|-hâ0µ*EÝJ-¦ŸtÕš5£Z¥ª´¤ã%³NÍz3ørÿ‚‚ÿÁ¹ß>Zj>.ý•÷üFðœŠí>…tˆuxcþê ;Å?p$¼€#nMŸa“k©^FúN£k#Ç>—z0’!Ã"³ ñ0 ŽŽ+ý«È­~rþÛŸðKoÙ?öêÓ¦¿ø•£eø§Ë oâ-,,:‚íA)Á[ˆÇd¡ˆØÊNk÷l³Å¬¿:ÃÇ+ãÌ*¯¤kÁ%ZnÖæ]ím½èÍŸ…ã>:šÂqi•H«N?çòù©â•âŸx“Áš¬š'‰,峺‹“«µ±ê;0÷RErõý¶ÁH?à…ÿ´ìɦ^êþ1Ñcñ÷€-ËýÄC2Ú7«‚Ñr˜IÅ/?cOøu¥Ö>³jÖk–6äuƒ…—ò0ÞÆ¼î#ðnºÂ¼ß…k¬v ÿ'ñ#å(nÚëeÍÕÂ(æÌø&§²úîQQW¡ý߉y8÷^Z÷Højеugsg3ÛÜ£#ÆÅ0 «)ÁAã¡Áªµøœ¢âùdµ>¦˜QE" (¢€ (¢€ (¢€ (¢€ («¶Z}æ£q¥œm$²¶ÔURÌÌ{$ûj¡ M¨Å]±Æ-»"•užðGŠ¥.á†ø …!T»qæ¿AÀ]Ù§‹˜Ÿ,¯€ð‹Mé*òIÖŸž·å]¯{^ñPfø¾1¡‚¦ðœ?GÙÇgQë9—ãä¢xGìùû2| ý–<Ão€ž³ðæ•Òén™–wQ$ó1if“o‘˜ãÇïQ_„â±uñ5¥ˆÄÍΤܤÛm÷mêÙðkT«7R¬œ¤õm»·êŠ(®s3ÿÖþþ(¢Š(¢Š(¢ŠŽX£™ r¨e`AAí_‚ÿ·—üGöiý§VóÇÄ? üe)21´‹:MÜ„äùÖË)˜ñæA·,ѹ¯ÞÊ+è8sг\‡±™N"TçÖÛIv”^’^M>ûžŽY›bòú¾ÛQÆ^[?&¶kÔÿ(¿ø('ü{â×ì÷âcáÏÚ_Âsh÷3“‡ˆ,@’Òð.Hò®yrŒ ˜¤ÄŠ̪kð/âÏìÍãß…âMI£þÑÓ“yn§ ë"rÑýy_q_îkñá×>*øJ÷Àt{=wFÔPÇse ÜA*ÿ´Ž8êPyþY¿o_ø7 KÕšóâ'ì+|¶r¶éš¬Ù…‰þK¹WÐGpH$çÍŠý²Ò­4MMŒEkcc [Ûƒ²F€* ¯Ð'ż#Á1tx^ŠÆc–øŠ‹Ü‹ÿ§qëäÕ¿ëäÖ‡Ñ<ç&È—&Uoˆ_òò_ Ý_åÿIŠß°wüö_ý•–ËÇ_câ7aÛ"Ïe¤ƒ}žÕ·e=%›qÈ ª‡ŠýÓTTQŠuø—qFižâž35ÄJ¬ú]è—hÅYEy$‘ð¹–m‹Ì*ûl]G)yì¼’Ù/@¢Š+À<ࢊ(¢Š(ÿ×þþ(¢Š(¢Š(¢Š(¢Š(¢ŠùöýŽÿgOÛ ÁGÀß¼3k­Á·ÙnHò¯-¿ŠÞá1$g8$µ±†VWñ½ÿ ÿƒvþ4üÓµ/þÏQ¿Å•w›Lx•µ‹x€èÐ(Ût÷ É?ꀯîö€z×èœâ~yÃOÙaj{L;ø¨Ô÷©´÷²û-õqµþÕÖ‡Òä|UÊß%)sR{ÂZÅ÷Ó§ËçsüN>3~Ämuswðð½µÌ.ë&™vJ•dà¤nÜ©–@yã"¿;üCá}ºœº>¿i-¥Ì$‡Še(àŒàõ³ ƒØ×ûLþÜÿðI_Ù?öç´Ÿ\ñn™ÿïŒYuâ-%;¦aÐ\§ú»•àæ0(ÂȵüAÿÁH¿àˆßeûK‹ÏŠ~Oø&&ÿGñ.’ŽÑÀC0Í´~€ïýÙcµ]ëôŸì ãŸ"¨°ƒÿ—º›þäºzE_µ4µ>Ÿû;$Ïýì–ÿåܾ?î¿òÿÀzŸÆö§ÅÏØïžêÞ/¬Ø ,P.£wAÄŸTÁÿdÕŸ„_±ÇŠ|R!Ö|xϤY8 !À7nþéâ/«e½…~y¸±æŸÙQ—´ïö-üÜÿ¾{龇ͮ Î>·õ?«¾nÿfÝù¶·ÏË}‘|5á/ø¿U‹Dðí¤·—S}Ø¢]ÌF@Ï <’@÷¯Ñ¯‚°ë\_ÚÍãÕmBòåÒ8t»=ϺG8UvQºBıã&¿¡Ÿø&÷üçö€ý¨4ë]Oáæ‡¼ 9V—Äz¬lÊŸâ%¼n¸ ˆ²2)â¿·Ø{þ Qû'þÂú|:Ÿ€´í¯ìÛ7ˆõUYoIaó-“¨Ä@1^߯Ðÿ°ø3}üêk0Ìcÿ.`ÿuýö÷·U$ßz{HúO¨d™¸é,F%}ˆüÞæ¿íÞ§óÿùÿƒt¾0üS³Ó<[ûL‡øiàôTx´h#UÖ'‹û¾Q-õ”4€ŽbäþÅ?f¿Ù+ö|ý‘¼¾øá›MÍ‚›‰#înF7ÜNù’VëÌBôPôpt¥¯Í8ÓÄÜó‰eìñ•90ëá¥vœRÛO´×G&íÒËCå³Î*Çæ–´¹i­¡"»i×ç+Q_žŸ8QEQEQEQEÿÐþþ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*µÝ­ý´–w±¬±L£€ÊÊÃr#¨<³E4Úw@4¿ðT¯ø"Oì­¯ü<ñ/í'ðd7ÃígG·{ë»>“L¼ägm¾äû;ž0aaý3$æºø%ÿü+öSð€<7ûC|]CñÄÅ´z…­¾¥ǦÙnù—»œM Î ÌνHÍ~º~ß¿òfÿ?ì 'ó½ûÿɧü;ÿ°·þ‚+ö9x‹Ä¯„VãêrûW ßÞäöiòóÛž×éͶ›h}³â\ÓûRúÄ­Ï˾¶å½¹¾+|öÓcê+{x-aK{t‘¨UUG@èaSQE~6Ýõ>$(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÙmixtools/man/perm.Rd0000755000175100001440000000143414342153463014165 0ustar hornikusers\name{perm} \title{Permutation Function} \alias{perm} \usage{ perm(n, r, v = 1:n) } \description{ Enumerates the possible permutations of a specified size from the elements of a vector having the same size. } \arguments{ \item{n}{Size of the source vector.} \item{r}{Size of the target vector.} \item{v}{Source vector. Must be a vector of length \code{n}.} } \value{ \code{perm} returns a matrix where each row contains one of the permutations of length \code{r}. } \details{ This function is called by \code{segregmixEM} and the associated internal functions. This is also a simplified version of the function \code{permutations} found in the package \code{gtools}. } \seealso{ \code{\link{segregmixEM}} } \examples{ perm(3, 3, 2:4) } \keyword{internal} mixtools/man/try.flare.Rd0000755000175100001440000000413314342153463015127 0ustar hornikusers\name{try.flare} \title{Mixtures of Regressions with Flare MM Algorithm} \alias{try.flare} \usage{ try.flare(y, x, lambda = NULL, beta = NULL, sigma = NULL, alpha = NULL, nu = 1, epsilon = 1e-04, maxit = 10000, verb = FALSE, restart = 50) } \description{ The function which \code{flaremixEM} actually calls. This only allows one barrier constant to be inputted at a time. } \arguments{ \item{y}{An n-vector of response values.} \item{x}{An n-vector of predictor values. An intercept term will be added by default.} \item{lambda}{Initial value of mixing proportions. Entries should sum to 1.} \item{beta}{Initial value of \code{beta} parameters. Should be a 2x2 matrix where the columns corresond to the component.} \item{sigma}{A vector of standard deviations.} \item{alpha}{A scalar for the exponential component's rate.} \item{nu}{A scalar specifying the barrier constant to use.} \item{epsilon}{The convergence criterion.} \item{maxit}{The maximum number of iterations.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} \item{restart}{The number of times to restart the algorithm in case convergence is not attained. The default is 50.} } \value{ \code{try.flare} returns a list of class \code{mixEM} with items: \item{x}{The set of predictors (which includes a column of 1's).} \item{y}{The response values.} \item{posterior}{An nx2 matrix of posterior probabilities for observations.} \item{lambda}{The final mixing proportions.} \item{beta}{The final regression coefficients.} \item{sigma}{The final standard deviations.} \item{alpha}{The final exponential rate.} \item{loglik}{The final log-likelihood.} \item{all.loglik}{A vector of each iteration's log-likelihood.} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{flaremixEM}} } \details{ This usually is not called by the user. The user will likely want \code{flaremixEM}, which also has an example to demonstrate this algorithm. } \keyword{internal} mixtools/man/npMSL.Rd0000755000175100001440000001661514342153463014222 0ustar hornikusers\name{npMSL} \title{Nonparametric EM-like Algorithm for Mixtures of Independent Repeated Measurements - Maximum Smoothed Likelihood version} \alias{npMSL} \usage{ npMSL(x, mu0, blockid = 1:ncol(x), bw = bw.nrd0(as.vector(as.matrix(x))), samebw = TRUE, bwmethod = "S", h = bw, eps = 1e-8, maxiter=500, bwiter = maxiter, nbfold = NULL, ngrid=200, post=NULL, verb = TRUE) } \description{ Returns nonparametric Smoothed Likelihood algorithm output (Levine et al, 2011) for mixtures of multivariate (repeated measures) data where the coordinates of a row (case) in the data matrix are assumed to be independent, conditional on the mixture component (subpopulation) from which they are drawn. } \arguments{ \item{x}{An \eqn{n\times r}{n x r} matrix of data. Each of the \eqn{n} rows is a case, and each case has \eqn{r} repeated measurements. These measurements are assumed to be conditionally independent, conditional on the mixture component (subpopulation) from which the case is drawn.} \item{mu0}{Either an \eqn{m\times r}{m x r} matrix specifying the initial centers for the \link{kmeans} function, or an integer \eqn{m} specifying the number of initial centers, which are then choosen randomly in \link{kmeans}} \item{blockid}{A vector of length \eqn{r} identifying coordinates (columns of \code{x}) that are assumed to be identically distributed (i.e., in the same block). For instance, the default has all distinct elements, indicating that no two coordinates are assumed identically distributed and thus a separate set of \eqn{m} density estimates is produced for each column of \eqn{x}. On the other hand, if \code{blockid=rep(1,ncol(x))}, then the coordinates in each row are assumed conditionally i.i.d.} \item{bw}{Bandwidth for density estimation, equal to the standard deviation of the kernel density. By default, a simplistic application of the default \code{\link{bw.nrd0}} bandwidth used by \code{\link{density}} to the entire dataset.} \item{samebw}{Logical: If \code{TRUE}, use the same bandwidth for each iteration and for each component and block. If \code{FALSE}, use a separate bandwidth for each component and block, and update this bandwidth at each iteration of the algorithm until \code{bwiter} is reached (see below). Two adaptation methods are provided, see \code{bwmethod} below.} \item{bwmethod}{Define the adaptive bandwidth strategy when \code{samebw = FALSE}, in which case the bandwidth depends on each component, block, and iteration of the algorithm. If set to "S" (the default), adaptation is done using a suitably modified \code{\link{bw.nrd0}} method as described in Benaglia et al (2011). If set to "CV", an adaptive \eqn{k}-fold Cross Validation method is applied, as described in Chauveau et al (2014), where \code{nbfold} is the number of subsamples. This corresponds to a Leave-\eqn{[n/nbfold]}-Out CV. } \item{h}{Alternative way to specify the bandwidth, to provide backward compatibility.} \item{eps}{Tolerance limit for declaring algorithm convergence. Convergence is declared whenever the maximum change in any coordinate of the \code{lambda} vector (of mixing proportion estimates) does not exceed \code{eps}.} \item{maxiter}{The maximum number of iterations allowed, convergence may be declared before \code{maxiter} iterations (see \code{eps} above).} \item{bwiter}{The maximum number of iterations allowed for adaptive bandwidth stage, when \code{samebw = FALSE}. If set to \code{0}, then the initial bandwidth matrix is used without adaptation.} \item{nbfold}{A parameter passed to the internal function \code{wbs.kCV}, which controls the weighted bandwidth selection by k-fold cross-validation.} \item{ngrid}{Number of points in the discretization of the intervals over which are approximated the (univariate) integrals for non linear smoothing of the log-densities, as required in the E step of the npMSL algorithm, see Levine et al (2011).} \item{post}{If non-NULL, an \eqn{n\times m}{n x m} matrix specifying the initial posterior probability vectors for each of the observations, i.e., the initial values to start the EM-like algorithm.} \item{verb}{If TRUE, print updates for every iteration of the algorithm as it runs} } \value{ \code{npMSL} returns a list of class \code{npEM} with the following items: \item{data}{The raw data (an \eqn{n\times r}{n x r} matrix).} \item{posteriors}{An \eqn{n\times m}{n x m} matrix of posterior probabilities for observation.} \item{bandwidth}{If \code{samebw==TRUE}, same as the \code{bw} input argument; otherwise, value of \code{bw} matrix at final iteration. This information is needed by any method that produces density estimates from the output.} \item{blockid}{Same as the \code{blockid} input argument, but recoded to have positive integer values. Also needed by any method that produces density estimates from the output.} \item{lambda}{The sequence of mixing proportions over iterations.} \item{lambdahat}{The final mixing proportions.} \item{loglik}{The sequence of log-likelihoods over iterations.} \item{f}{An array of size \eqn{ngrid \times m \times l}{ngrid x m x l}, returning last values of density for component \eqn{j} and block \eqn{k} over \code{grid} points.} \item{meanNaN}{Average number of \code{NaN} that occured over iterations (for internal testing and control purpose).} \item{meanUdfl}{Average number of "underflow" that occured over iterations (for internal testing and control purpose).} } \seealso{ \code{\link{npEM}}, \code{\link{plot.npEM}}, \code{\link{normmixrm.sim}}, \code{\link{spEMsymloc}}, \code{\link{spEM}}, \code{\link{plotseq.npEM}} } \references{ \itemize{ \item Benaglia, T., Chauveau, D., and Hunter, D. R. (2009), An EM-like algorithm for semi- and non-parametric estimation in multivariate mixtures, Journal of Computational and Graphical Statistics, 18, 505-526. \item Benaglia, T., Chauveau, D. and Hunter, D.R. (2011), Bandwidth Selection in an EM-like algorithm for nonparametric multivariate mixtures. Nonparametric Statistics and Mixture Models: A Festschrift in Honor of Thomas P. Hettmansperger. World Scientific Publishing Co., pages 15-27. \item Chauveau D., Hunter D. R. and Levine M. (2014), Semi-Parametric Estimation for Conditional Independence Multivariate Finite Mixture Models. Preprint (under revision). \item Levine, M., Hunter, D. and Chauveau, D. (2011), Maximum Smoothed Likelihood for Multivariate Mixtures, Biometrika 98(2): 403-416. } } \examples{ ## Examine and plot water-level task data set. ## Block structure pairing clock angles that are directly opposite one ## another (1:00 with 7:00, 2:00 with 8:00, etc.) set.seed(111) # Ensure that results are exactly reproducible data(Waterdata) blockid <- c(4,3,2,1,3,4,1,2) # see Benaglia et al (2009a) \dontrun{ a <- npEM(Waterdata[,3:10], mu0=3, blockid=blockid, bw=4) # npEM solution b <- npMSL(Waterdata[,3:10], mu0=3, blockid=blockid, bw=4) # smoothed version # Comparisons on the 4 default plots, one for each block par(mfrow=c(2,2)) for (l in 1:4){ plot(a, blocks=l, breaks=5*(0:37)-92.5, xlim=c(-90,90), xaxt="n",ylim=c(0,.035), xlab="") plot(b, blocks=l, hist=FALSE, newplot=FALSE, addlegend=FALSE, lty=2, dens.col=1) axis(1, at=30*(1:7)-120, cex.axis=1) legend("topleft",c("npMSL"),lty=2, lwd=2)} } } \keyword{file} mixtools/man/RanEffdata.Rd0000755000175100001440000000103014342153463015205 0ustar hornikusers\name{RanEffdata} \docType{data} \title{Simulated Data from 2-Component Mixture of Regressions with Random Effects} \alias{RanEffdata} \usage{ data(RanEffdata) } \description{ This data set was generated from a 2-component mixture of regressions with random effects. } \format{This data set consists of a list with 100 25x3 matrices. The first column is the response variable, the second column is a column of 1's and the last column is the predictor variable. } \seealso{ \code{\link{regmixEM.mixed}} } \keyword{datasets} mixtools/man/RTdata.Rd0000755000175100001440000000233214342153463014377 0ustar hornikusers\name{RTdata} \docType{data} \title{Reaction Time (RT) Data Set} \alias{RTdata} \usage{ data(RTdata) } \description{ This data set involves normally developing children 9 years of age presented with two visual simuli on a computer monitor. The left image is the target stimuli and on the right is either an exact copy or a mirror image of the target stimuli. The child must press one key if it is a copy or another key if it is a mirror image. The data consists of the reaction times (RT) of the 197 children who provided correct responses for all 6 task trials. } \format{This data frame consists of 197 children (the rows) and their 6 responses (the columns) to the stimulus presented. The response (RT) is recorded in milliseconds. } \references{ Cruz-Medina, I. R., Hettmansperger, T. P. and Thomas, H. (2004) Semiparametric Mixture Models and Repeated Measures: The Multinomial Cut Point Model, \emph{Applied Statistics} \bold{53(3)}, 463--474. Miller, C. A., Kail, R., Leonard, L. B. and Tomblin, J. B. (2001) Speed of Processing in Children with Specific Language Impairment, \emph{Journal of Speech, Language, and Hearing Research} \bold{44(2)}, 416--433. } \seealso{ \code{\link{RTdata2}} } \keyword{datasets} mixtools/man/test.equality.Rd0000755000175100001440000000443114342153463016035 0ustar hornikusers\name{test.equality} \title{Performs Chi-Square Tests for Scale and Location Mixtures} \alias{test.equality} \usage{ test.equality(y, x = NULL, arbmean = TRUE, arbvar = FALSE, mu = NULL, sigma = NULL, beta = NULL, lambda = NULL, ...) } \description{ Performs a likelihood ratio test of a location (or scale) normal or regression mixture versus the more general model. For a normal mixture, the alternative hypothesis is that each component has its own mean and variance, whereas the null is that all means (in the case of a scale mixture) or all variances (in the case of a location mixture) are equal. This test is asymptotically chi-square with degrees of freedom equal to k-1, where k is the number of components. } \arguments{ \item{y}{The responses for \code{regmixEM} or the data for \code{normalmixEM}.} \item{x}{The predictors for \code{regmixEM}.} \item{arbmean}{If FALSE, then a scale mixture analysis is performed for \code{normalmixEM} or \code{regmixEM}.} \item{arbvar}{If FALSE, then a location mixture analysis is performed for \code{normalmixEM} or \code{regmixEM}.} \item{mu}{An optional vector for starting values (under the null hypothesis) for \code{mu} in \code{normalmixEM}.} \item{sigma}{An optional vector for starting values (under the null hypothesis) for \code{sigma} in \code{normalmixEM} or \code{regmixEM}.} \item{beta}{An optional matrix for starting values (under the null hypothesis) for \code{beta} in \code{regmixEM}.} \item{lambda}{An otional vector for starting values (under the null hypothesis) for \code{lambda} in \code{normalmixEM} or \code{regmixEM}.} \item{...}{Additional arguments passed to the various EM algorithms for the mixture of interest.} } \value{ \code{test.equality} returns a list with the following items: \item{chi.sq}{The chi-squared test statistic.} \item{df}{The degrees of freedom for the chi-squared test statistic.} \item{p.value}{The p-value corresponding to this likelihood ratio test.} } \seealso{ \code{\link{test.equality.mixed}} } \examples{ ## Should a location mixture be used for the Old Faithful data? data(faithful) attach(faithful) set.seed(100) test.equality(y = waiting, arbmean = FALSE, arbvar = TRUE) } \keyword{file} mixtools/man/plotweibullRMM.Rd0000644000175100001440000000475614343144421016142 0ustar hornikusers\name{plotweibullRMM} \alias{plotweibullRMM} %- Also NEED an '\alias' for EACH other topic documented here. \title{Plot sequences from the Stochastic EM algorithm for mixture of Weibull } \description{Function for plotting sequences of estimates along iterations, from an object returned by \code{\link{weibullRMM_SEM}}, a Stochastic EM algorithm for mixture of Weibull distributions with randomly right censored data (see reference below). } \usage{ plotweibullRMM(a, title = NULL, rowstyle = TRUE, subtitle = NULL, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{a}{An object returned by \code{\link{weibullRMM_SEM}}.} \item{title}{The title of the plot, set to some default value if \code{NULL}.} \item{rowstyle}{Window organization, for plots in rows (the default) or columns.} \item{subtitle}{A subtitle for the plot, set to some default value if \code{NULL}.} \item{...}{Other parameters (such as \code{lwd}) passed to \code{plot}, \code{lines}, and \code{legend} commands.} } \value{The plot returned} \seealso{ Related functions: \code{\link{weibullRMM_SEM}}, \code{\link{summary.mixEM}}. Other models and algorithms for censored lifetime data (name convention is model_algorithm): \code{\link{expRMM_EM}}, \code{\link{spRMM_SEM}} . } \references{ \itemize{ \item Bordes, L., and Chauveau, D. (2016), Stochastic EM algorithms for parametric and semiparametric mixture models for right-censored lifetime data, Computational Statistics, Volume 31, Issue 4, pages 1513-1538. \url{https://link.springer.com/article/10.1007/s00180-016-0661-7} } } \author{Didier Chauveau} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ n = 500 # sample size m = 2 # nb components lambda=c(0.4, 0.6) shape <- c(0.5,5); scale <- c(1,20) # model parameters set.seed(321) x <- rweibullmix(n, lambda, shape, scale) # iid ~ weibull mixture cs=runif(n,0,max(x)+10) # iid censoring times t <- apply(cbind(x,cs),1,min) # censored observations d <- 1*(x <= cs) # censoring indicator ## set arbitrary or "reasonable" (e.g., data-driven) initial values l0 <- rep(1/m,m); sh0 <- c(1, 2); sc0 <- c(2,10) # Stochastic EM algorithm a <- weibullRMM_SEM(t, d, lambda = l0, shape = sh0, scale = sc0, maxit = 200) summary(a) # Parameters estimates etc plotweibullRMM(a) # default plot of St-EM sequences %%\dontrun{ %%} } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{file} mixtools/man/post.beta.Rd0000755000175100001440000000464014342153463015123 0ustar hornikusers\name{post.beta} \title{Summary of Posterior Regression Coefficients in Mixtures of Random Effects Regressions} \alias{post.beta} \usage{ post.beta(y, x, p.beta, p.z) } \description{ Returns a 2x2 matrix of plots summarizing the posterior intercept and slope terms in a mixture of random effects regression with arbitrarily many components. } \arguments{ \item{y}{A list of N response trajectories with (possibly) varying dimensions of length \eqn{n_i}.} \item{x}{A list of N predictor values of dimension \eqn{n_i}. Each trajectory in y has its own design vector.} \item{p.beta}{A list of N 2xk matrices giving the posterior intercept and slope values from the output of an EM algorithm.} \item{p.z}{An Nxk matrix of posterior membership probabilities from the output of an EM algorithm.} } \value{ \code{post.beta} returns a 2x2 matrix of plots giving: \item{(1, 1)}{The data plotted on the x-y axes with all posterior regression lines.} \item{(1, 2)}{The data plotted on the x-y axes with most probable posterior regression lines.} \item{(2, 1)}{A beta-space plot of all posterior regression coefficients.} \item{(1, 1)}{A beta-space plot of most probable posterior regression coefficients.} } \seealso{ \code{\link{regmixEM.mixed}}, \code{\link{plot.mixEM}} } \references{ Young, D. S. and Hunter, D. R. (2015) Random Effects Regression Mixtures for Analyzing Infant Habituation, \emph{Journal of Applied Statistics}, \bold{42(7)}, 1421--1441. } \examples{ \dontrun{ ## EM output for simulated data from 2-component mixture of random effects. data(RanEffdata) set.seed(100) x <- lapply(1:length(RanEffdata), function(i) matrix(RanEffdata[[i]][, 2:3], ncol = 2)) x <- x[1:20] y <- lapply(1:length(RanEffdata), function(i) matrix(RanEffdata[[i]][, 1], ncol = 1)) y <- y[1:20] lambda <- c(0.45, 0.55) mu <- matrix(c(0, 4, 100, 12), 2, 2) sigma <- 2 R <- list(diag(1, 2), diag(1, 2)) em.out <- regmixEM.mixed(y, x, sigma = sigma, arb.sigma = FALSE, lambda = lambda, mu = mu, R = R, addintercept.random = FALSE, epsilon = 1e-02, verb = TRUE) ## Obtaining the 2x2 matrix of plots. x.ran <- lapply(1:length(x), function(i) x[[i]][, 2]) p.beta <- em.out$posterior.beta p.z <- em.out$posterior.z post.beta(y, x.ran, p.beta = p.beta, p.z = p.z) } } \details{ This is primarily used for within \code{plot.mixEM}. } \keyword{file} mixtools/man/mvnormalmixEM.Rd0000755000175100001440000000704614342153463016022 0ustar hornikusers\name{mvnormalmixEM} \title{EM Algorithm for Mixtures of Multivariate Normals} \alias{mvnormalmixEM} \usage{ mvnormalmixEM(x, lambda = NULL, mu = NULL, sigma = NULL, k = 2, arbmean = TRUE, arbvar = TRUE, epsilon = 1e-08, maxit = 10000, verb = FALSE) } \description{ Return EM algorithm output for mixtures of multivariate normal distributions. } \arguments{ \item{x}{A matrix of size nxp consisting of the data.} \item{lambda}{Initial value of mixing proportions. Entries should sum to 1. This determines number of components. If NULL, then \code{lambda} is random from uniform Dirichlet and number of components is determined by \code{mu}.} \item{mu}{A list of size k consisting of initial values for the p-vector mean parameters. If NULL, then the vectors are generated from a normal distribution with mean and standard deviation according to a binning method done on the data. If both \code{lambda} and \code{mu} are NULL, then number of components is determined by \code{sigma}.} \item{sigma}{A list of size k consisting of initial values for the pxp variance-covariance matrices. If NULL, then \code{sigma} is generated using the data. If \code{lambda}, \code{mu}, and \code{sigma} are NULL, then number of components is determined by \code{k}.} \item{k}{Number of components. Ignored unless \code{lambda}, \code{mu}, and \code{sigma} are all NULL.} \item{arbmean}{If TRUE, then the component densities are allowed to have different \code{mu}s. If FALSE, then a scale mixture will be fit.} \item{arbvar}{If TRUE, then the component densities are allowed to have different \code{sigma}s. If FALSE, then a location mixture will be fit.} \item{epsilon}{The convergence criterion.} \item{maxit}{The maximum number of iterations.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} } \value{ \code{normalmixEM} returns a list of class \code{mixEM} with items: \item{x}{The raw data.} \item{lambda}{The final mixing proportions.} \item{mu}{A list of with the final mean vectors.} \item{sigma}{A list with the final variance-covariance matrices.} \item{loglik}{The final log-likelihood.} \item{posterior}{An nxk matrix of posterior probabilities for observations.} \item{all.loglik}{A vector of each iteration's log-likelihood.} \item{restarts}{The number of times the algorithm restarted due to unacceptable choice of initial values.} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{normalmixEM}} } \references{ McLachlan, G. J. and Peel, D. (2000) \emph{Finite Mixture Models}, John Wiley and Sons, Inc. } \examples{ ##Fitting randomly generated data with a 2-component location mixture of bivariate normals. set.seed(100) x.1 <- rmvnorm(40, c(0, 0)) x.2 <- rmvnorm(60, c(3, 4)) X.1 <- rbind(x.1, x.2) mu <- list(c(0, 0), c(3, 4)) out.1 <- mvnormalmixEM(X.1, arbvar = FALSE, mu = mu, epsilon = 1e-02) out.1[2:5] ##Fitting randomly generated data with a 2-component scale mixture of bivariate normals. x.3 <- rmvnorm(40, c(0, 0), sigma = matrix(c(200, 1, 1, 150), 2, 2)) x.4 <- rmvnorm(60, c(0, 0)) X.2 <- rbind(x.3, x.4) lambda <- c(0.40, 0.60) sigma <- list(diag(1, 2), matrix(c(200, 1, 1, 150), 2, 2)) out.2 <- mvnormalmixEM(X.2, arbmean = FALSE, sigma = sigma, lambda = lambda, epsilon = 1e-02) out.2[2:5] } \keyword{file} mixtools/man/plotly_post.beta.Rd0000644000175100001440000000557414342426712016532 0ustar hornikusers\name{plotly_post.beta} \title{Visualization of Posterior Regression Coefficients in Mixtures of Random Effects Regressions using \code{plotly}} \alias{plotly_post.beta} \usage{ plotly_post.beta(y, x, p.beta, p.z, cex = 6,lwd=1, title.size = 15, xlab.size = 15 , xtick.size = 15, ylab.size = 15 , ytick.size = 15, col.data = "#1f77b4", col.comp = NULL) } \description{ Returns a 2x2 matrix of plots summarizing the posterior intercept and slope terms in a mixture of random effects regression with arbitrarily many components. } \arguments{ \item{y}{A list of N response trajectories with (possibly) varying dimensions of length \eqn{n_i}.} \item{x}{A list of N predictor values of dimension \eqn{n_i}. Each trajectory in y has its own design vector.} \item{p.beta}{A list of N 2xk matrices giving the posterior intercept and slope values from the output of an EM algorithm.} \item{p.z}{An Nxk matrix of posterior membership probabilities from the output of an EM algorithm.} \item{cex}{Size of dots of posterior Coefficients.} \item{lwd}{Width of lines.} \item{title.size}{Size of the main title.} \item{xlab.size}{Size of the lable of X-axis.} \item{xtick.size}{Size of tick lables of X-axis.} \item{ylab.size}{Size of the lable of Y-axis.} \item{ytick.size}{Size of tick lables of Y-axis.} \item{col.data}{Color of original data points.} \item{col.comp}{Color of points and lines of components. Number of colors specified needs to be consistent with number of components.} } \value{ Plots returned. } \seealso{ \code{\link{regmixEM.mixed}}, \code{\link{plot.mixEM}}, \code{\link{post.beta}} } \references{ Young, D. S. and Hunter, D. R. (2015) Random Effects Regression Mixtures for Analyzing Infant Habituation, \emph{Journal of Applied Statistics}, \bold{42(7)}, 1421--1441. } \examples{ data(RanEffdata) set.seed(100) x <- lapply(1:length(RanEffdata), function(i) matrix(RanEffdata[[i]][, 2:3], ncol = 2)) x <- x[1:20] y <- lapply(1:length(RanEffdata), function(i) matrix(RanEffdata[[i]][, 1], ncol = 1)) y <- y[1:20] lambda <- c(0.45, 0.55) mu <- matrix(c(0, 4, 100, 12), 2, 2) sigma <- 2 R <- list(diag(1, 2), diag(1, 2)) em.out <- regmixEM.mixed(y, x, sigma = sigma, arb.sigma = FALSE, lambda = lambda, mu = mu, R = R, addintercept.random = FALSE, epsilon = 1e-02, verb = TRUE) x.1 = em.out$x n = sum(sapply(x.1, nrow)) x.1.sum = sum(sapply(1:length(x.1), function(i) length(x.1[[i]][,1]))) if (x.1.sum == n) { x = lapply(1:length(x.1), function(i) matrix(x.1[[i]][,-1], ncol = 1)) } else { x = x.1 } plotly_post.beta(x = x, y = em.out$y, p.beta = em.out$posterior.beta, p.z = em.out$posterior.z) } \details{ This is primarily used for within \code{plot.mixEM}. } \keyword{internal} mixtools/man/plotly_expRMM.Rd0000644000175100001440000000615314343144323015771 0ustar hornikusers\name{plotly_expRMM} \alias{plotly_expRMM} %- Also NEED an '\alias' for EACH other topic documented here. \title{Plot sequences from the EM algorithm for censored mixture of exponentials using \code{plotly} } \description{This is an updated function of \code{plotexpRMM}. For more technical details, please refer to \code{plotexpRMM}. } \usage{ plotly_expRMM(a , title = NULL , rowstyle = TRUE , subtitle=NULL, width = 2 , cex = 2 , col.comp = NULL, legend.text = NULL, legend.text.size = 15, legend.size = 15, title.x = 0.5, title.y = 0.95, title.size = 15, xlab.size = 15, xtick.size = 15, ylab.size = 15, ytick.size = 15) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{a}{An object returned by \code{\link{expRMM_EM}}.} \item{title}{The title of the plot, set to some default value if \code{NULL}.} \item{rowstyle}{Window organization, for plots in rows (the default) or columns.} \item{subtitle}{A subtitle for the plot, set to some default value if \code{NULL}.} \item{width}{Line width.} \item{cex}{Size of dots.} \item{col.comp}{Color of different components. Number of color specified needs to be consistent with number of components.} \item{legend.text}{Title of legend.} \item{legend.text.size}{Size of the legend title.} \item{legend.size}{Size of legend.} \item{title.size}{Size of the main title.} \item{title.x}{Horsizontal position of the main title.} \item{title.y}{Vertical posotion of the main title.} \item{xlab.size}{Size of the lable of X-axis.} \item{xtick.size}{Size of tick lables of X-axis.} \item{ylab.size}{Size of the lable of Y-axis.} \item{ytick.size}{Size of tick lables of Y-axis.} } \value{The plot returned} \seealso{ Related functions: \code{\link{expRMM_EM}}, \code{\link{summary.mixEM}}, \code{\link{plot.mixEM}}, \code{\link{plotexpRMM}}. Other models and algorithms for censored lifetime data (name convention is model_algorithm): \code{\link{weibullRMM_SEM}}, \code{\link{spRMM_SEM}}. } \references{ \itemize{ \item Bordes, L., and Chauveau, D. (2016), Stochastic EM algorithms for parametric and semiparametric mixture models for right-censored lifetime data, Computational Statistics, Volume 31, Issue 4, pages 1513-1538. \url{https://link.springer.com/article/10.1007/s00180-016-0661-7} } } \author{Didier Chauveau} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ n=300 # sample size m=2 # number of mixture components lambda <- c(1/3,1-1/3); rate <- c(1,1/10) # mixture parameters set.seed(1234) x <- rexpmix(n, lambda, rate) # iid ~ exponential mixture cs=runif(n,0,max(x)) # Censoring (uniform) and incomplete data t <- apply(cbind(x,cs),1,min) # observed or censored data d <- 1*(x <= cs) # censoring indicator ###### EM for RMM, exponential lifetimes l0 <- rep(1/m,m); r0 <- c(1, 0.5) # "arbitrary" initial values a <- expRMM_EM(t, d, lambda=l0, rate=r0, k = m) summary(a) # EM estimates etc plotly_expRMM(a , rowstyle = TRUE) # plot of EM sequences %%\dontrun{ %%} } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{file} mixtools/man/tonedata.Rd0000644000175100001440000000330514342153463015015 0ustar hornikusers\name{tonedata} \alias{tonedata} \docType{data} \title{Tone perception data} \author{Christian Hennig} \description{ The tone perception data stem from an experiment of Cohen (1980) and have been analyzed in de Veaux (1989) and Viele and Tong (2002). The dataset and this documentation file were copied from the fpc package by Christian Hennig. A pure fundamental tone was played to a trained musician. Electronically generated overtones were added, determined by a stretching ratio of \code{stretchratio}. \code{stretchratio=2.0} corresponds to the harmonic pattern usually heard in traditional definite pitched instruments. The musician was asked to tune an adjustable tone to the octave above the fundamental tone. \code{tuned} gives the ratio of the adjusted tone to the fundamental, i.e. \code{tuned=2.0} would be the correct tuning for all \code{stretchratio}-values. The data analyzed here belong to 150 trials with the same musician. In the original study, there were four further musicians. } \usage{data(tonedata)} \format{A data frame with 2 variables, \code{stretchratio} and \code{tuned}, and 150 cases.} \source{ Original source: Cohen, E. A. (1980), \emph{Inharmonic tone perception}. Unpublished Ph.D. dissertation, Stanford University R source: Hennig, Christian (2010), fpc: Flexible procedures for clustering, R package version 2.0-2. \url{https://cran.r-project.org/package=fpc} } \references{ de Veaux, R. D. (1989), Mixtures of Linear Regressions, \emph{Computational Statistics and Data Analysis} 8, 227-245. Viele, K. and Tong, B. (2002), Modeling with Mixtures of Linear Regressions, \emph{Statistics and Computing} 12, 315-330. } \keyword{datasets} mixtools/man/plot.MCMC.Rd0000755000175100001440000000315214342153463014715 0ustar hornikusers\name{plot.mixMCMC} \title{Various Plots Pertaining to Mixture Model Output Using MCMC Methods} \alias{plot.mixMCMC} \usage{ \method{plot}{mixMCMC}(x, trace.plots = TRUE, summary.plots = FALSE, burnin = 2000, \dots) } \description{ Takes an object of class \code{mixMCMC} and returns various graphical output for select mixture models. } \arguments{ \item{x}{An object of class \code{mixMCMC}.} \item{trace.plots}{If TRUE, trace plots of the various parameters estimated by the MCMC methods is given.} \item{summary.plots}{Graphics pertaining to certain mixture models. The details are given below.} \item{burnin}{The values 1 to \code{burnin} are dropped when producing the plots in \code{summary.plots}.} \item{...}{Graphical parameters passed to \code{regcr} function.} } \value{ \code{plot.mixMCMC} returns trace plots of the various parameters estimated by the MCMC methods for all objects of class \code{mixMCMC}. In addition, other plots may be produced for the following k-component mixture model functions: \item{regmixMH}{Credible bands for the regression lines in a mixture of linear regressions. See \code{regcr} for more details.} } \seealso{ \code{\link{regcr}} } \examples{ ## M-H algorithm for NOdata with acceptance rate about 40\%. data(NOdata) attach(NOdata) set.seed(100) beta <- matrix(c(1.3, -0.1, 0.6, 0.1), 2, 2) sigma <- c(.02, .05) MH.out <- regmixMH(Equivalence, NO, beta = beta, s = sigma, sampsize = 2500, omega = .0013) plot(MH.out, summary.plots = TRUE, burnin = 2450, alpha = 0.01) } \keyword{file} mixtools/man/flaremixEM.Rd0000755000175100001440000000550214342153463015253 0ustar hornikusers\name{flaremixEM} \title{EM Algorithm for Mixtures of Regressions with Flare} \alias{flaremixEM} \usage{ flaremixEM(y, x, lambda = NULL, beta = NULL, sigma = NULL, alpha = NULL, nu = NULL, epsilon = 1e-04, maxit = 10000, verb = FALSE, restart = 50) } \description{ Returns output for 2-component mixture of regressions with flaring using an EM algorithm with one step of Newton-Raphson requiring an adaptive barrier for maximization of the objective function. A mixture of regressions with flare occurs when there appears to be a common regression relationship for the data, but the error terms have a mixture structure of one normal component and one exponential component. } \arguments{ \item{y}{An n-vector of response values.} \item{x}{An n-vector of predictor values. An intercept term will be added by default.} \item{lambda}{Initial value of mixing proportions. Entries should sum to 1.} \item{beta}{Initial value of \code{beta} parameters. Should be a 2x2 matrix where the columns correspond to the component.} \item{sigma}{A vector of standard deviations.} \item{alpha}{A scalar for the exponential component's rate.} \item{nu}{A vector specifying the barrier constants to use. The first barrier constant where the algorithm converges is used.} \item{epsilon}{The convergence criterion.} \item{maxit}{The maximum number of iterations.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} \item{restart}{The number of times to restart the algorithm in case convergence is not attained. The default is 50.} } \value{ \code{flaremixEM} returns a list of class \code{mixEM} with items: \item{x}{The set of predictors (which includes a column of 1's).} \item{y}{The response values.} \item{posterior}{An nx2 matrix of posterior probabilities for observations.} \item{lambda}{The final mixing proportions.} \item{beta}{The final regression coefficients.} \item{sigma}{The final standard deviations.} \item{alpha}{The final exponential rate.} \item{loglik}{The final log-likelihood.} \item{all.loglik}{A vector of each iteration's log-likelihood.} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{regmixEM}} } \examples{ ## Simulation output. set.seed(100) j=1 while(j == 1){ x1 <- runif(30, 0, 10) x2 <- runif(20, 10, 20) x3 <- runif(30, 20, 30) y1 <- 3+4*x1+rnorm(30, sd = 1) y2 <- 3+4*x2+rexp(20, rate = .05) y3 <- 3+4*x3+rnorm(30, sd = 1) x <- c(x1, x2, x3) y <- c(y1, y2, y3) nu <- (1:30)/2 out <- try(flaremixEM(y, x, beta = c(3, 4), nu = nu, lambda = c(.75, .25), sigma = 1), silent = TRUE) if(any(class(out) == "try-error")){ j <- 1 } else j <- 2 } out[4:7] plot(x, y, pch = 19) abline(out$beta) } \keyword{file} mixtools/man/mixtools-internal.Rd0000755000175100001440000001047614342153463016720 0ustar hornikusers\name{mixtools-internal} \alias{inv.logit} \alias{dexpmixt} \alias{HRkde} \alias{kern.B} \alias{kern.C} \alias{kern.G} \alias{kern.O} \alias{kern.T} \alias{kfoldCV} \alias{KMintegrate} \alias{KMod} \alias{ldc} \alias{logit} \alias{npMSL_old} \alias{plotseq} \alias{rlnormscalemix} \alias{splitsample} \alias{triang_wkde} \alias{wbw.kCV} \title{Internal 'mixtools' Functions} \description{ Internal kernel, semiparametric-related, and miscellaneous functions for the package \code{mixtools}. } \usage{ dexpmixt(t, lam, rate) HRkde(cpd, u = cpd[,1], kernelft = triang_wkde, bw = rep(bw.nrd0(as.vector(cpd[,1])), length(cpd[,1]))) inv.logit(eta) kern.B(x, xi, h, g = 0) kern.C(x, xi, h) kern.G(x, xi, h) kern.O(x, xi, h) kern.T(x, xi, h) kfoldCV(h, x, nbsets = 2, w = rep(1, length(x)), lower = mean(x) - 5*sd(x), upper = mean(x) + 5*sd(x)) KMintegrate(s) KMod(cpd, already.ordered = TRUE) ldc(data, class, score) logit(mu) npMSL_old(x, mu0, blockid = 1:ncol(x), bw=bw.nrd0(as.vector(as.matrix(x))), samebw = TRUE, h=bw, eps=1e-8, maxiter=500, bwiter = maxiter, ngrid = 200, post = NULL, verb = TRUE) plotseq(x, ...) rlnormscalemix(n, lambda=1, meanlog=1, sdlog=1, scale=0.1) splitsample(n, nbsets = 2) triang_wkde(t, u=t, w=rep(1/length(t),length(t)), bw=rep(bw.nrd0(t), length(t))) wbw.kCV(x, nbfold = 5, w = rep(1, length(x)), hmin = 0.1*hmax, hmax = NULL) } \arguments{ \item{x}{A vector of values to which local modeling techniques are applied.} \item{xi}{An n-vector of data values.} \item{h}{The bandwidth controlling the size of the window used for the local estimation around \code{x}. This pertains to its usage in the kernel functionns \code{kern.B}, \code{kern.C}, \code{kern.G}, \code{kern.O}, and \code{kern.T}. For its usage in the \code{kfoldCV} function, see updated arguments in the \code{npMSL} function.} \item{g}{A shape parameter required for the symmetric beta kernel. The default is \code{g} = 0 which yields the uniform kernel. Some common values are \code{g} = 1 for the Epanechnikov kernel, \code{g} = 2 for the biweight kernel, and \code{g} = 3 for the triweight kernel.} \item{mu0}{See updated arguments in the \code{npMSL} function.} \item{blockid}{See updated arguments in the \code{npMSL} function.} \item{bw}{See updated arguments in the \code{npMSL} function.} \item{samebw}{See updated arguments in the \code{npMSL} function.} \item{eps}{See updated arguments in the \code{npMSL} function.} \item{maxiter}{See updated arguments in the \code{npMSL} function.} \item{bwiter}{See updated arguments in the \code{npMSL} function.} \item{ngrid}{See updated arguments in the \code{npMSL} function.} \item{post}{See updated arguments in the \code{npMSL} function.} \item{verb}{See updated arguments in the \code{npMSL} function.} \item{n}{See updated arguments in the \code{npMSL} function.} \item{nbsets}{See updated arguments in the \code{npMSL} function.} \item{w}{See updated arguments in the \code{npMSL} function.} \item{lower}{See updated arguments in the \code{npMSL} function.} \item{upper}{See updated arguments in the \code{npMSL} function.} \item{nbfold}{See updated arguments in the \code{npMSL} function.} \item{hmin}{See updated arguments in the \code{npMSL} function.} \item{hmax}{See updated arguments in the \code{npMSL} function.} \item{data}{Data, possibly multivariate, fed to the \code{mixturegram} function.} \item{class}{The number of classes, inputted based on number of components in the \code{mixturegram} function.} \item{score}{The score vector from LDA used in constructing a mixturegram.} \item{lam}{A vector of mixture proportions, should sum to one.} \item{rate}{A vector of mixture component rates.} \item{t}{Argument for \code{dexpmixt}.} \item{mu}{A proportion for which to calculate the logit function; i.e., \code{log(mu / (1 - mu))}.} \item{eta}{Any real value for which to calculate the inverse logit function; i.e., \code{1 / (1 + exp(eta))}.} \item{cpd}{Argument for \code{HRkde}.} \item{kernelft}{Argument for \code{HRkde}.} \item{s}{Argument for \code{KMintegrate}.} \item{meanlog}{Argument for \code{rlnormscalemix}.} \item{sdlog}{Argument for \code{rlnormscalemix}.} } \details{ These are usually not to be called by the user. } \seealso{ \code{\link{npMSL}} } \keyword{internal} mixtools/man/plotly_seq.npEM.Rd0000644000175100001440000000441214342427003016241 0ustar hornikusers\name{plotly_seq.npEM} \alias{plotly_seq.npEM} \title{Plotting sequences of estimates from non- or semiparametric EM-like Algorithm using \code{plotly}} \description{This is an updated version of \code{\link{plotseq.npEM}}. For technical details, please refer to \code{\link{plotseq.npEM}}. } \usage{ plotly_seq.npEM (x, col = '#1f77b4' , width = 6, xlab = "Iteration" , xlab.size = 15 , xtick.size = 15, ylab.size = 15 , ytick.size = 15, title.size = 15 , title.x = 0.5 , title.y = 0.95) } \arguments{ \item{x}{an object of class \code{npEM}, as output by \code{\link{npEM}} or \code{\link{spEMsymloc}}} \item{col}{Line color.} \item{width}{Line width.} \item{title}{Text of the main title.} \item{title.size}{Size of the main title.} \item{title.x}{Horsizontal position of the main title.} \item{title.y}{Vertical posotion of the main title.} \item{xlab}{Label of X-axis.} \item{xlab.size}{Size of the lable of X-axis.} \item{xtick.size}{Size of tick lables of X-axis.} \item{ylab.size}{Size of the lable of Y-axis.} \item{ytick.size}{Size of tick lables of Y-axis.} } \value{\code{plotly_seq.npEM} returns a figure with one plot for each component proportion, and, in the case of \code{\link{spEMsymloc}}, one plot for each component mean.} \seealso{ \code{\link{plot.npEM}}, \code{\link{rnormmix}}, \code{\link{npEM}}, \code{\link{spEMsymloc}}, \code{\link{plotly_seq.npEM}} } \references{ \itemize{ \item Benaglia, T., Chauveau, D., and Hunter, D. R. (2009), An EM-like algorithm for semi- and non-parametric estimation in multivariate mixtures, Journal of Computational and Graphical Statistics (to appear). \item Bordes, L., Chauveau, D., and Vandekerkhove, P. (2007), An EM algorithm for a semiparametric mixture model, Computational Statistics and Data Analysis, 51: 5429-5443. } } \author{Didier Chauveau} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ \dontrun{ ## Examine and plot water-level task data set. ## First, try a 3-component solution where no two coordinates are ## assumed i.d. data(Waterdata) set.seed(100) ## Not run: a <- npEM(Waterdata[,3:10], mu0=3, bw=4) # Assume indep but not iid plotly_seq.npEM(a) } } \keyword{file} mixtools/man/repnormmixEM.Rd0000755000175100001440000000651714342153463015653 0ustar hornikusers\name{repnormmixEM} \title{EM Algorithm for Mixtures of Normals with Repeated Measurements} \alias{repnormmixEM} \usage{ repnormmixEM(x, lambda = NULL, mu = NULL, sigma = NULL, k = 2, arbmean = TRUE, arbvar = TRUE, epsilon = 1e-08, maxit = 10000, verb = FALSE) } \description{ Returns EM algorithm output for mixtures of normals with repeated measurements and arbitrarily many components. } \arguments{ \item{x}{An mxn matrix of data. The columns correspond to the subjects and the rows correspond to the repeated measurements.} \item{lambda}{Initial value of mixing proportions. Entries should sum to 1. This determines number of components. If NULL, then \code{lambda} is random from uniform Dirichlet and number of components is determined by \code{mu}.} \item{mu}{A k-vector of component means. If NULL, then \code{mu} is determined by a normal distribution according to a binning method done on the data. If both \code{lambda} and \code{mu} are NULL, then number of components is determined by \code{sigma}.} \item{sigma}{A vector of standard deviations. If NULL, then \eqn{1/\code{sigma}^2} has random standard exponential entries according to a binning method done on the data. If \code{lambda}, \code{mu}, and \code{sigma} are NULL, then number of components is determined by \code{k}.} \item{k}{Number of components. Ignored unless all of \code{lambda}, \code{mu}, and \code{sigma} are NULL.} \item{arbmean}{If TRUE, then the component densities are allowed to have different \code{mu}s. If FALSE, then a scale mixture will be fit.} \item{arbvar}{If TRUE, then the component densities are allowed to have different \code{sigma}s. If FALSE, then a location mixture will be fit.} \item{epsilon}{The convergence criterion.} \item{maxit}{The maximum number of iterations.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} } \value{ \code{repnormmixEM} returns a list of class \code{mixEM} with items: \item{x}{The raw data.} \item{lambda}{The final mixing proportions.} \item{mu}{The final mean parameters.} \item{sigma}{The final standard deviations. If \code{arbmean} = FALSE, then only the smallest standard deviation is returned. See \code{scale} below.} \item{scale}{If \code{arbmean} = FALSE, then the scale factor for the component standard deviations is returned. Otherwise, this is omitted from the output.} \item{loglik}{The final log-likelihood.} \item{posterior}{An nxk matrix of posterior probabilities for observations.} \item{all.loglik}{A vector of each iteration's log-likelihood.} \item{restarts}{The number of times the algorithm restarted due to unacceptable choice of initial values.} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{normalmixEM}} } \references{ Hettmansperger, T. P. and Thomas, H. (2000) Almost Nonparametric Inference for Repeated Measures in Mixture Models, \emph{Journal of the Royals Statistical Society, Series B} \bold{62(4)} 811--825. } \examples{ ## EM output for the water-level task data set. data(Waterdata) set.seed(100) water <- t(as.matrix(Waterdata[,3:10])) em.out <- repnormmixEM(water, k = 2, verb = TRUE, epsilon = 1e-03) em.out } \keyword{file} mixtools/man/logisregmixEM.Rd0000755000175100001440000000700014342153463015770 0ustar hornikusers\name{logisregmixEM} \title{EM Algorithm for Mixtures of Logistic Regressions} \alias{logisregmixEM} \usage{ logisregmixEM(y, x, N = NULL, lambda = NULL, beta = NULL, k = 2, addintercept = TRUE, epsilon = 1e-08, maxit = 10000, verb = FALSE) } \description{ Returns EM algorithm output for mixtures of logistic regressions with arbitrarily many components. } \arguments{ \item{y}{An n-vector of successes out of N trials.} \item{x}{An nxp matrix of predictors. See \code{addintercept} below.} \item{N}{An n-vector of number of trials for the logistic regression. If NULL, then \code{N} is an n-vector of 1s for binary logistic regression.} \item{lambda}{Initial value of mixing proportions. Entries should sum to 1. This determines number of components. If NULL, then \code{lambda} is random from uniform Dirichlet and number of components is determined by \code{beta}.} \item{beta}{Initial value of \code{beta} parameters. Should be a pxk matrix, where p is the number of columns of x and k is number of components. If NULL, then \code{beta} is generated by binning the data into k bins and using \code{glm} on the values in each of the bins. If both \code{lambda} and \code{beta} are NULL, then number of components is determined by \code{k}.} \item{k}{Number of components. Ignored unless \code{lambda} and \code{beta} are both NULL.} \item{addintercept}{If TRUE, a column of ones is appended to the x matrix before the value of p is calculated.} \item{epsilon}{The convergence criterion.} \item{maxit}{The maximum number of iterations.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} } \value{ \code{logisregmixEM} returns a list of class \code{mixEM} with items: \item{x}{The predictor values.} \item{y}{The response values.} \item{lambda}{The final mixing proportions.} \item{beta}{The final logistic regression coefficients.} \item{loglik}{The final log-likelihood.} \item{posterior}{An nxk matrix of posterior probabilities for observations.} \item{all.loglik}{A vector of each iteration's log-likelihood.} \item{restarts}{The number of times the algorithm restarted due to unacceptable choice of initial values.} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{poisregmixEM}} } \references{ McLachlan, G. J. and Peel, D. (2000) \emph{Finite Mixture Models}, John Wiley and Sons, Inc. } \examples{ ## EM output for data generated from a 2-component logistic regression model. set.seed(100) beta <- matrix(c(1, .5, 2, -.8), 2, 2) x <- runif(50, 0, 10) x1 <- cbind(1, x) xbeta <- x1\%*\%beta N <- ceiling(runif(50, 50, 75)) w <- rbinom(50, 1, .3) y <- w*rbinom(50, size = N, prob = (1/(1+exp(-xbeta[, 1]))))+ (1-w)*rbinom(50, size = N, prob = (1/(1+exp(-xbeta[, 2])))) out.1 <- logisregmixEM(y, x, N, verb = TRUE, epsilon = 1e-01) out.1 ## EM output for data generated from a 2-component binary logistic regression model. beta <- matrix(c(-10, .1, 20, -.1), 2, 2) x <- runif(500, 50, 250) x1 <- cbind(1, x) xbeta <- x1\%*\%beta w <- rbinom(500, 1, .3) y <- w*rbinom(500, size = 1, prob = (1/(1+exp(-xbeta[, 1]))))+ (1-w)*rbinom(500, size = 1, prob = (1/(1+exp(-xbeta[, 2])))) out.2 <- logisregmixEM(y, x, beta = beta, lambda = c(.3, .7), verb = TRUE, epsilon = 1e-01) out.2 } \keyword{file} mixtools/man/density.npEM.Rd0000755000175100001440000000456014342153463015542 0ustar hornikusers\name{density.npEM} \title{Normal kernel density estimate for nonparametric EM output} \alias{density.npEM} \usage{ \method{density}{npEM}(x, u=NULL, component=1, block=1, scale=FALSE, \dots) } \description{ Takes an object of class \code{npEM} and returns an object of class \code{\link{density}} giving the kernel density estimate for the selected component and, if applicable, the selected block. } \arguments{ \item{x}{An object of class \code{npEM} such as the output of the \code{\link{npEM}} or \code{\link{spEMsymloc}} functions.} \item{u}{Vector of points at which the density is to be evaluated} \item{component}{Mixture component number; should be an integer from 1 to the number of columns of \code{x$posteriors}.} \item{block}{Block of repeated measures. Only applicable in repeated measures case, for which \code{x$blockid} exists; should be an integer from 1 to \code{max(x$blockid)}.} \item{scale}{Logical: If TRUE, multiply the density values by the corresponding mixing proportions found in \code{x$lambdahat}} \item{\dots}{Additional arguments; not used by this method.} } \details{ The bandwidth is taken to be the same as that used to produce the \code{npEM} object, which is given by \code{x$bandwidth}. } \value{ \code{density.npEM} returns a list of type \code{"density"}. See \code{\link{density}} for details. In particular, the output of \code{density.npEM} may be used directly by functions such as \code{\link{plot}} or \code{\link{lines}}. } \seealso{ \code{\link{npEM}}, \code{\link{spEMsymloc}}, \code{\link{plot.npEM}} } \examples{ ## Look at histogram of Old Faithful waiting times data(faithful) Minutes <- faithful$waiting hist(Minutes, freq=FALSE) ## Superimpose equal-variance normal mixture fit: set.seed(100) nm <- normalmixEM(Minutes, mu=c(50,80), sigma=5, arbvar=FALSE, fast=TRUE) x <- seq(min(Minutes), max(Minutes), len=200) for (j in 1:2) lines(x, nm$lambda[j]*dnorm(x, mean=nm$mu[j], sd=nm$sigma), lwd=3, lty=2) ## Superimpose several semiparametric fits with different bandwidths: bw <- c(1, 3, 5) for (i in 1:3) { sp <- spEMsymloc(Minutes, c(50,80), bw=bw[i], eps=1e-3) for (j in 1:2) lines(density(sp, component=j, scale=TRUE), col=1+i, lwd=2) } legend("topleft", legend=paste("Bandwidth =",bw), fill=2:4) } \keyword{file} mixtools/man/lambda.Rd0000755000175100001440000000245614342153463014447 0ustar hornikusers\name{lambda} \title{Local Estimation for Lambda in Mixtures of Regressions} \alias{lambda} \usage{ lambda(z, x, xi, h = NULL, kernel = c("Gaussian", "Beta", "Triangle", "Cosinus", "Optcosinus"), g = 0) } \description{ Return local estimates of the mixing proportions from each component of a mixture of regressions model using output from an EM algorithm. } \arguments{ \item{z}{An nxk matrix of posterior probabilities obtained from the EM algorithm.} \item{x}{A vector of values for which the local estimation is calculated.} \item{xi}{An nx(p-1) matrix of the predictor values.} \item{h}{The bandwidth controlling the size of the window used for the local estimation.} \item{kernel}{The type of kernel to be used for the local estimation.} \item{g}{A shape parameter required for the symmetric beta kernel. The default is \code{g} = 0 which yields the uniform kernel. Some common values are \code{g} = 1 for the Epanechnikov kernel, \code{g} = 2 for the biweight kernel, and \code{g} = 3 for the triweight kernel.} } \value{ \code{lambda} returns local estimates of the mixing proportions for the inputted \code{x} vector. } \seealso{ \code{\link{regmixEM.loc}} } \note{\code{lambda} is for use within \code{regmixEM.loc}.} \keyword{internal} mixtools/man/rweibullmix.Rd0000644000175100001440000000223614342153463015563 0ustar hornikusers\name{rweibullmix} \title{Simulate from Mixtures of Weibull distributions} \alias{rweibullmix} \usage{ rweibullmix(n, lambda = 1, shape = 1, scale = 1) } \description{ Simulate from a mixture of univariate Weibull distributions. } \arguments{ \item{n}{Number of cases to simulate.} \item{lambda}{Vector of mixture probabilities, with length equal to \eqn{m}, the desired number of components (subpopulations). This is assumed to sum to 1.} \item{shape}{Vector of component shapes.} \item{scale}{Vector of component scales.} } \value{ \code{rexpmix} returns an \eqn{n}-vector sampled from an \eqn{m}-component mixture of univariate Weibull distributions. } %%\details{This function simply calls \code{\link{sample}} and \code{\link{rexp}}.} \seealso{ \code{\link{rnormmix}} and \code{\link{rmvnormmix}} for Gaussian mixtures, \code{\link{rexpmix}} for mixture of exponentials. } \examples{ n = 500 # sample size m = 2 # nb components lambda=c(0.4, 0.6) shape <- c(0.5,5); scale <- c(1,20) # model parameters set.seed(321) x <- rweibullmix(n, lambda, shape, scale) # iid ~ weibull mixture ## histogram of the simulated data. hist(x, col=8) } \keyword{file} mixtools/man/plotspRMM.Rd0000644000175100001440000000307414343144402015110 0ustar hornikusers\name{plotspRMM} \alias{plotspRMM} %- Also NEED an '\alias' for EACH other topic documented here. \title{Plot output from Stochastic EM algorithm for semiparametric scaled mixture of censored data } \description{Function for plotting various results from an object returned by \code{\link{spRMM_SEM}}, a Stochastic EM algorithm for semiparametric scaled mixture of randomly right censored lifetime data. Four plots of sequences of estimates along iterations, survival and density estimates (see reference below). } \usage{ plotspRMM(sem, tmax = NULL) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{sem}{An object returned by \code{\link{spRMM_SEM}}.} \item{tmax}{The max time for \eqn{x} axis, set to some default value if \code{NULL}.} } \value{The four plots returned} \seealso{ Related functions: \code{\link{spRMM_SEM}}. Other models and algorithms for censored lifetime data (name convention is model_algorithm): \code{\link{expRMM_EM}}, \code{\link{weibullRMM_SEM}}. } \references{ \itemize{ \item Bordes, L., and Chauveau, D. (2016), Stochastic EM algorithms for parametric and semiparametric mixture models for right-censored lifetime data, Computational Statistics, Volume 31, Issue 4, pages 1513-1538. \url{https://link.springer.com/article/10.1007/s00180-016-0661-7} } } \author{Didier Chauveau} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ # See example(spRMM_SEM) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{file} mixtools/man/plot.mixEM.Rd0000755000175100001440000001022514342153463015214 0ustar hornikusers\name{plot.mixEM} \title{Various Plots Pertaining to Mixture Models} \alias{plot.mixEM} \usage{ \method{plot}{mixEM}(x, whichplots = 1, loglik = 1 \%in\% whichplots, density = 2 \%in\% whichplots, xlab1="Iteration", ylab1="Log-Likelihood", main1="Observed Data Log-Likelihood", col1=1, lwd1=2, xlab2=NULL, ylab2=NULL, main2=NULL, col2=NULL, lwd2=2, alpha = 0.05, marginal = FALSE, ...) } \description{ Takes an object of class \code{mixEM} and returns various graphical output for select mixture models. } \arguments{ \item{x}{An object of class \code{mixEM}.} \item{whichplots}{vector telling which plots to produce: 1 = loglikelihood plot, 2 = density plot. Irrelevant if \code{loglik} and \code{density} are specified.} \item{loglik}{If TRUE, a plot of the log-likelihood versus the EM iterations is given.} \item{density}{Graphics pertaining to certain mixture models. The details are given below.} \item{xlab1, ylab1, main1, col1, lwd1}{Graphical parameters \code{xlab}, ..., \code{lwd} to be passed to the loglikelihood plot. Trying to change these parameters using \code{xlab}, ..., \code{lwd} will result in an error, but all other graphical parameters are passed directly to the plotting functions via ...} \item{xlab2, ylab2, main2, col2, lwd2}{Same as \code{xlab1} etc. but for the density plot} \item{alpha}{A vector of significance levels when constructing confidence ellipses and confidence bands for the mixture of multivariate normals and mixture of regressions cases, respectively. The default is 0.05.} \item{marginal}{For the mixture of bivariate normals, should optional marginal histograms be included?} \item{...}{Graphical parameters passed to \code{plot} command.} } \value{ \code{plot.mixEM} returns a plot of the log-likelihood versus the EM iterations by default for all objects of class \code{mixEM}. In addition, other plots may be produced for the following k-component mixture model functions: \item{normalmixEM}{A histogram of the raw data is produced along with k density curves determined by \code{normalmixEM}.} \item{repnormmixEM}{A histogram of the raw data produced in a similar manner as for \code{normalmixEM}.} \item{mvnormalmixEM}{A 2-dimensional plot with each point color-coded to denote its most probable component membership. In addition, the estimated component means are plotted along with (1 - \code{alpha})\% bivariate normal density contours. These ellipses are constructed by assigning each value to their component of most probable membership and then using normal theory. Optional marginal histograms may also be produced.} \item{regmixEM}{A plot of the response versus the predictor with each point color-coded to denote its most probable component membership. In addition, the estimated component regression lines are plotted along with (1 - \code{alpha})\% Working-Hotelling confidence bands. These bands are constructed by assigning each value to their component of most probable membership and then performing least squares estimation.} \item{logisregmixEM}{A plot of the binary response versus the predictor with each point color-coded to denote its most probable compopnent membership. In addition, the estimate component logistic regression lines are plotted.} \item{regmixEM.mixed}{Provides a 2x2 matrix of plots summarizing the posterior slope and posterior intercept terms from a mixture of random effects regression. See \code{post.beta} for a more detailed description.} } \seealso{ \code{\link{post.beta}} } \examples{ ##Analyzing the Old Faithful geyser data with a 2-component mixture of normals. data(faithful) attach(faithful) set.seed(100) out <- normalmixEM(waiting, arbvar = FALSE, verb = TRUE, epsilon = 1e-04) plot(out, density = TRUE, w = 1.1) ##Fitting randomly generated data with a 2-component location mixture of bivariate normals. x.1 <- rmvnorm(40, c(0, 0)) x.2 <- rmvnorm(60, c(3, 4)) X.1 <- rbind(x.1, x.2) out.1 <- mvnormalmixEM(X.1, arbvar = FALSE, verb = TRUE, epsilon = 1e-03) plot(out.1, density = TRUE, alpha = c(0.01, 0.05, 0.10), marginal = TRUE) } \keyword{file} mixtools/man/mvnpEM.Rd0000755000175100001440000001270514762771663014445 0ustar hornikusers\name{mvnpEM} \title{EM-like Algorithm for Nonparametric Mixture Models with Conditionally Independent Multivariate Component Densities} \alias{mvnpEM} \usage{ mvnpEM(x, mu0, blockid = 1:ncol(x), samebw = TRUE, bwdefault = apply(x,2,bw.nrd0), init = NULL, eps = 1e-8, maxiter = 500, verb = TRUE) } \description{ An extension of the original \code{\link{npEM}} algorithm, for mixtures of multivariate data where the coordinates of a row (case) in the data matrix are assumed to be made of independent but multivariate blocks (instead of just coordinates), conditional on the mixture component (subpopulation) from which they are drawn (Chauveau and Hoang 2015). } \arguments{ \item{x}{An \eqn{n\times r}{n x r} matrix of data. Each of the \eqn{n} rows is a case, and each case has \eqn{r} repeated measurements. These measurements are assumed to be conditionally independent, conditional on the mixture component (subpopulation) from which the case is drawn.} \item{mu0}{Either an \eqn{m\times r}{m x r} matrix specifying the initial centers for the \link{kmeans} function, or an integer \eqn{m} specifying the number of initial centers, which are then chosen randomly in \link{kmeans}} \item{blockid}{A vector of length \eqn{r} identifying coordinates (columns of \code{x}) that are in the same block. The default has all distinct elements, indicating that the model has \eqn{r} blocks of dimension 1, in which case the model is handled directly by the \code{\link{npEM}} algorithm. See example below for actual multivariate blocks example.} \item{samebw}{Logical: If \code{TRUE}, use the same bandwidth per coordinate for all iteration and all components. If \code{FALSE}, use a separate bandwidth for each component and coordinate, and update this bandwidth at each iteration of the algorithm using a suitably modified \code{\link{bw.nrd0}} method as described in Benaglia et al (2011) and Chauveau and Hoang (2015).} \item{bwdefault}{Bandwidth default for density estimation,a simplistic application of the default \code{\link{bw.nrd0}} for each coordinate (column) of the data.} \item{init}{Initialization method, based on an initial \eqn{n\times m}{n x m} matrix for the posterior probabilities. If \code{NULL}, a \code{\link{kmeans}} clustering with \code{mu0} initial centers is applied to the data and the initial matrix of posteriors is built from the result.} \item{eps}{Tolerance limit for declaring algorithm convergence. Convergence is declared whenever the maximum change in any coordinate of the \code{lambda} vector (of mixing proportion estimates) does not exceed \code{eps}.} \item{maxiter}{The maximum number of iterations allowed; convergence may be declared before \code{maxiter} iterations (see \code{eps} above).} \item{verb}{Verbose mode; if TRUE, print updates for every iteration of the algorithm as it runs} } \value{ \code{mvnpEM} returns a list of class \code{mvnpEM} with the following items: \item{data}{The raw data (an \eqn{n\times r}{n x r} matrix).} \item{posteriors}{An \eqn{n\times m}{n x m} matrix of posterior probabilities for each observation (row).} \item{lambda}{The sequence of mixing proportions over iterations.} \item{blockid}{The \code{blockid} input argument. Needed by any method that produces density estimates from the output, like \code{\link{plot.mvnpEM}}.} \item{samebw}{The \code{samebw} input argument. Needed by any method that produces density estimates from the output, like \code{\link{plot.mvnpEM}}.} \item{bandwidth}{The final bandwidth matrix after convergence of the algorithm. Its shape depends on the \code{samebw} input argument. If \code{samebw = TRUE}, a vectors with the bandwidth value for each of the \code{r} coordinates (same for all components and iterations). If \code{samebw = FALSE}, a \eqn{m\times r}{m x r} matrix, where each row is associated to one component and gives the \eqn{r} bandwidth values, one for each coordinate. Needed by any method that produces density estimates from the output, like \code{\link{plot.mvnpEM}}.} \item{lambdahat}{The final mixing proportions.} \item{loglik}{The sequence of pseudo log-likelihood values over iterations.} } \seealso{ \code{\link{plot.mvnpEM}}, \code{\link{npEM}} } \references{ \itemize{ \item Benaglia, T., Chauveau, D., and Hunter, D. R. (2009), An EM-like algorithm for semi- and non-parametric estimation in multivariate mixtures, Journal of Computational and Graphical Statistics, 18, 505-526. \item Benaglia, T., Chauveau, D. and Hunter, D.R. (2011), Bandwidth Selection in an EM-like algorithm for nonparametric multivariate mixtures. Nonparametric Statistics and Mixture Models: A Festschrift in Honor of Thomas P. Hettmansperger. World Scientific Publishing Co., pages 15-27. \item Chauveau, D., and Hoang, V. T. L. (2015), Nonparametric mixture models with conditionally independent multivariate component densities, Preprint under revision. \url{https://hal.science/hal-01094837} } } \examples{ # Example as in Chauveau and Hoang (2015) with 6 coordinates \dontrun{ m=2; r=6; blockid <-c(1,1,2,2,3,3) # 3 bivariate blocks # generate some data x ... a <- mvnpEM(x, mu0=2, blockid, samebw=F) # adaptive bandwidth plot(a) # this S3 method produces 6 plots of univariate marginals summary(a)} } \keyword{file} mixtools/man/rmvnorm.Rd0000755000175100001440000000141314342153463014717 0ustar hornikusers\name{rmvnorm} \alias{rmvnorm} \title{Simulate from a Multivariate Normal Distribution} \description{ Simulate from a multiviate normal distribution } \usage{ rmvnorm(n, mu=NULL, sigma=NULL) } \arguments{ \item{n}{Number of vectors to simulate} \item{mu}{mean vector} \item{sigma}{covariance matrix, assumed symmetric and nonnegative definite} } \value{ An \eqn{n \times d}{n x d} matrix in which each row is an independently generated realization from the desired multivariate normal distribution } \details{ This function uses an \code{\link{eigen}} decomposition assuming \code{sigma} is symmetric. In particular, the upper triangle of \code{sigma} is ignored. } \seealso{ \code{\link{eigen}}, \code{\link{dnorm}}, \code{\link{dmvnorm}} } \keyword{distribution} mixtools/man/spEMsymloc.Rd0000644000175100001440000000773414342153463015323 0ustar hornikusers\name{spEMsymloc} \title{Semiparametric EM-like Algorithm for univariate symmetric location mixture} \alias{spEMsymloc} \usage{ spEMsymloc(x, mu0, bw = bw.nrd0(x), h=bw, eps = 1e-8, maxiter = 100, stochastic = FALSE, verbose = FALSE) } \description{ Returns semiparametric EM algorithm output (Bordes et al, 2007, and Benaglia et al, 2009) for location mixtures of univariate data and symmetric component density. } \arguments{ \item{x}{A vector of length \eqn{n}{n} consisting of the data.} \item{mu0}{Either a vector specifying the initial centers for the \link{kmeans} function, and from which the number of component is obtained, or an integer \eqn{m} specifying the number of initial centers, which are then choosen randomly in \link{kmeans}.} \item{bw}{Bandwidth for density estimation, equal to the standard deviation of the kernel density.} \item{h}{Alternative way to specify the bandwidth, to provide backward compatibility.} \item{eps}{Tolerance limit for declaring algorithm convergence. Convergence is declared before \code{maxiter} iterations whenever the maximum change in any coordinate of the \code{lambda} (mixing proportion estimates) and \code{mu} (means) vector does not exceed \code{eps}.} \item{maxiter}{The maximum number of iterations allowed, for both stochastic and non-stochastic versions; for non-stochastic algorithms (\code{stochastic = FALSE}), convergence may be declared before \code{maxiter} iterations (see \code{eps} above).} \item{stochastic}{Flag, if FALSE (the default), runs the non-stochastic version of the algorithm, as in Benaglia et al (2009). Set to TRUE to run a stochastic version which simulates the posteriors at each iteration (as in Bordes et al, 2007), and runs for \code{maxiter} iterations.} \item{verbose}{If TRUE, print updates for every iteration of the algorithm as it runs} } \value{ \code{spEMsymloc} returns a list of class \code{npEM} with the following items: \item{data}{The raw data (an \eqn{n\times r}{n x r} matrix).} \item{posteriors}{An \eqn{n\times m}{n x m} matrix of posterior probabilities for observations. If \code{stochastic = TRUE}, this matrix is computed from an average over the \code{maxiter} iterations.} \item{bandwidth}{Same as the \code{bw} input argument, returned because this information is needed by any method that produces density estimates from the output.} \item{lambda}{The sequence of mixing proportions over iterations.} \item{lambdahat}{The final estimate for mixing proportions if \code{stochastic = FALSE}, the average over the sequence if \code{stochastic = TRUE}.} \item{mu}{the sequence of component means over iterations.} \item{muhat}{the final estimate of component means if \code{stochastic = FALSE}, the average over the sequence if \code{stochastic = TRUE}.} \item{symmetric}{Flag indicating that the kernel density estimate is using a symmetry assumption.} } \seealso{ \code{\link{plot.npEM}}, \code{\link{rnormmix}}, \code{\link{npEM}}, \code{\link{spEMsymlocN01}}, \code{\link{plotseq.npEM}} } \references{ \itemize{ \item Benaglia, T., Chauveau, D., and Hunter, D. R., An EM-like algorithm for semi- and non-parametric estimation in multivariate mixtures, Journal of Computational and Graphical Statistics, 18, 505-526, 2009. \item Benaglia, T., Chauveau, D., Hunter, D. R., and Young, D. mixtools: An R package for analyzing finite mixture models. Journal of Statistical Software, 32(6):1-29, 2009. \item Bordes, L., Chauveau, D., and Vandekerkhove, P. (2007), An EM algorithm for a semiparametric mixture model, Computational Statistics and Data Analysis, 51: 5429-5443. } } \examples{ ## Example from a normal location mixture set.seed(100) n <- 200 lambda <- c(1/3,2/3) mu <- c(0, 4); sigma<-rep(1, 2) x <- rnormmix(n, lambda, mu, sigma) out.stoc <- spEMsymloc(x, mu0=c(-1, 2), stochastic=TRUE) out.nonstoc <- spEMsymloc(x, mu0=c(-1, 2)) } \keyword{file} mixtools/man/plot.npEM.Rd0000755000175100001440000000730514342153463015041 0ustar hornikusers\name{plot.npEM} \title{Plot Nonparametric or Semiparametric EM Output} \alias{plot.npEM} \alias{plot.spEM} \usage{ \method{plot}{npEM}(x, blocks = NULL, hist=TRUE, addlegend = TRUE, scale=TRUE, title=NULL, breaks="Sturges", ylim=NULL, dens.col, newplot = TRUE, pos.legend = "topright", cex.legend = 1, \dots) \method{plot}{spEM}(x, blocks = NULL, hist=TRUE, addlegend = TRUE, scale=TRUE, title=NULL, breaks="Sturges", ylim=NULL, dens.col, newplot = TRUE, pos.legend = "topright", cex.legend = 1, \dots) } \description{ Takes an object of class \code{npEM} and returns a set of plots of the density estimates for each block and each component. There is one plot per block, with all the components displayed on each block so it is possible to see the mixture structure for each block. } \arguments{ \item{x}{An object of class \code{npEM} such as the output of the \code{\link{npEM}} function} \item{blocks}{Blocks (of repeated measures coordinates) to plot; not relevant for univariate case. Default is to plot all blocks.} \item{hist}{If TRUE, superimpose density estimate plots on a histogram of the data} \item{addlegend}{If TRUE, adds legend to the plot.} \item{scale}{If TRUE, scale each density estimate by its corresponding estimated mixing proportion, so that the total area under all densities equals 1 and the densities plotted may be added to produce an estimate of the mixture density. When FALSE, each density curve has area 1 in the plot.} \item{title}{Alternative vector of main titles for plots (recycled as many times as needed)} \item{breaks}{Passed directly to the \code{\link{hist}} function} \item{ylim}{\code{ylim} parameter to use for all plots, if desired. If not given, each plot uses its own ylim that ensures that no part of the plot will go past the top of the plotting area.} \item{dens.col}{Color values to use for the individual component density functions, repeated as necessary. Default value is \code{2:(m+1)}.} \item{newplot}{If TRUE, creates a new plot.} \item{pos.legend}{Single argument specifying the position of the legend. See `Details' section of \code{\link{legend}}.} \item{cex.legend}{Character expansion factor for \code{\link{legend}}.} \item{\dots}{Any remaining arguments are passed to the \code{\link{hist}} and \code{\link{lines}} functions.} } \value{ \code{plot.npEM} returns a list with two elements: % \item{means}{A \eqn{B\times m}{B x m} matrix of estimated population means, % where \eqn{B} is the number of blocks and \eqn{m} is the number of mixture components % (subpopulations)} % \item{variances}{A \eqn{B\times m}{B x m} matrix of estimated population variances} \item{x}{List of matrices. The \eqn{j}th column of the \eqn{i}th matrix is the vector of \eqn{x}-values for the \eqn{j}th density in the \eqn{i}th plot.} \item{y}{\eqn{y}-values, given in the same form as the \eqn{x}-values.} } \seealso{ \code{\link{npEM}}, \code{\link{density.npEM}}, \code{\link{spEMsymloc}}, \code{\link{plotseq.npEM}} } \examples{ ## Examine and plot water-level task data set. ## First, try a 3-component solution where no two coordinates are ## assumed i.d. data(Waterdata) set.seed(100) \dontrun{ a <- npEM(Waterdata[,3:10], 3, bw=4) par(mfrow=c(2,4)) plot(a) # This produces 8 plots, one for each coordinate } \dontrun{ ## Next, same thing but pairing clock angles that are directly opposite one ## another (1:00 with 7:00, 2:00 with 8:00, etc.) b <- npEM(Waterdata[,3:10], 3, blockid=c(4,3,2,1,3,4,1,2), bw=4) par(mfrow=c(2,2)) plot(b) # Now only 4 plots, one for each block } } \keyword{file} mixtools/man/regmixEM.mixed.Rd0000755000175100001440000001272414342153463016050 0ustar hornikusers\name{regmixEM.mixed} \title{EM Algorithm for Mixtures of Regressions with Random Effects} \alias{regmixEM.mixed} \usage{ regmixEM.mixed(y, x, w = NULL, sigma = NULL, arb.sigma = TRUE, alpha = NULL, lambda = NULL, mu = NULL, rho = NULL, R = NULL, arb.R = TRUE, k = 2, ar.1 = FALSE, addintercept.fixed = FALSE, addintercept.random = TRUE, epsilon = 1e-08, maxit = 10000, verb = FALSE) } \description{ Returns EM algorithm output for mixtures of multiple regressions with random effects and an option to incorporate fixed effects and/or AR(1) errors. } \arguments{ \item{y}{A list of N response trajectories with (possibly) varying dimensions of length \eqn{n_i}.} \item{x}{A list of N design matrices of dimensions \eqn{(n_i)\times p}{(n_i) x p}. Each trajectory in y has its own design matrix.} \item{w}{A list of N known explanatory variables having dimensions \eqn{(n_i)\times q}{(n-1) x q}. If \code{mixed} = FALSE, then \code{w} is replaced by a list of N zeros.} \item{sigma}{A vector of standard deviations. If NULL, then \eqn{1/s^2} has random standard exponential entries according to a binning method done on the data.} \item{arb.sigma}{If TRUE, then \code{sigma} is k-dimensional. Else a common standard deviation is assumed.} \item{alpha}{A q-vector of unknown regression parameters for the fixed effects. If NULL and \code{mixed} = TRUE, then \code{alpha} is random from a normal distribution with mean and variance according to a binning method done on the data. If \code{mixed} = FALSE, then \code{alpha} = 0.} \item{lambda}{Initial value of mixing proportions for the assumed mixture structure on the regression coefficients. Entries should sum to 1. This determines number of components. If NULL, then \code{lambda} is random from uniform Dirichlet and the number of components is determined by \code{mu}.} \item{mu}{A pxk matrix of the mean for the mixture components of the random regression coefficients. If NULL, then the columns of \code{mu} are random from a multivariate normal distribution with mean and variance determined by a binning method done on the data.} \item{rho}{An Nxk matrix giving initial values for the correlation term in an AR(1) process. If NULL, then these values are simulated from a uniform distribution on the interval (-1, 1).} \item{R}{A list of N pxp covariance matrices for the mixture components of the random regression coefficients. If NULL, then each matrix is random from a standard Wishart distribution according to a binning method done on the data.} \item{arb.R}{If TRUE, then \code{R} is a list of N pxp covariance matrices. Else, one common covariance matrix is assumed.} \item{k}{Number of components. Ignored unless \code{lambda} is NULL.} \item{ar.1}{If TRUE, then an AR(1) process on the error terms is included. The default is FALSE.} \item{addintercept.fixed}{If TRUE, a column of ones is appended to the matrices in w.} \item{addintercept.random}{If TRUE, a column of ones is appended to the matrices in x before p is calculated.} \item{epsilon}{The convergence criterion.} \item{maxit}{The maximum number of iterations.} \item{verb}{If TRUE, then various updates are printed during each iteration of the algorithm.} } \value{ \code{regmixEM} returns a list of class \code{mixEM} with items: \item{x}{The predictor values corresponding to the random effects.} \item{y}{The response values.} \item{w}{The predictor values corresponding to the (optional) fixed effects.} \item{lambda}{The final mixing proportions.} \item{mu}{The final mean vectors.} \item{R}{The final covariance matrices.} \item{sigma}{The final component error standard deviations.} \item{alpha}{The final regression coefficients for the fixed effects.} \item{rho}{The final error correlation values if an AR(1) process is included.} \item{loglik}{The final log-likelihood.} \item{posterior.z}{An Nxk matrix of posterior membership probabilities.} \item{posterior.beta}{A list of N pxk matrices giving the posterior regression coefficient values.} \item{all.loglik}{A vector of each iteration's log-likelihood.} \item{restarts}{The number of times the algorithm restarted due to unacceptable choice of initial values.} \item{ft}{A character vector giving the name of the function.} } \seealso{ \code{\link{regmixEM}}, \code{\link{post.beta}} } \references{ Xu, W. and Hedeker, D. (2001) A Random-Effects Mixture Model for Classifying Treatment Response in Longitudinal Clinical Trials, \emph{Journal of Biopharmaceutical Statistics}, \bold{11(4)}, 253--273. Young, D. S. and Hunter, D. R. (2015) Random Effects Regression Mixtures for Analyzing Infant Habituation, \emph{Journal of Applied Statistics}, \bold{42(7)}, 1421--1441. } \examples{ ## EM output for simulated data from 2-component mixture of random effects. data(RanEffdata) set.seed(100) x <- lapply(1:length(RanEffdata), function(i) matrix(RanEffdata[[i]][, 2:3], ncol = 2)) x <- x[1:20] y <- lapply(1:length(RanEffdata), function(i) matrix(RanEffdata[[i]][, 1], ncol = 1)) y <- y[1:20] lambda <- c(0.45, 0.55) mu <- matrix(c(0, 4, 100, 12), 2, 2) sigma <- 2 R <- list(diag(1, 2), diag(1, 2)) em.out <- regmixEM.mixed(y, x, sigma = sigma, arb.sigma = FALSE, lambda = lambda, mu = mu, R = R, addintercept.random = FALSE, epsilon = 1e-02, verb = TRUE) em.out[4:10] } \keyword{file} mixtools/DESCRIPTION0000755000175100001440000000414314763003312013660 0ustar hornikusersPackage: mixtools Version: 2.0.0.1 Date: 2022-12-04 Title: Tools for Analyzing Finite Mixture Models Authors@R: c(person("Derek", "Young", role = c("aut", "cre"), email = "derek.young@uky.edu", comment = c(ORCID = "0000-0002-3048-3803")), person("Tatiana", "Benaglia", role = "aut"), person("Didier", "Chauveau", role = "aut"), person("David", "Hunter", role = "aut"), person("Kedai", "Cheng", role = "aut"), person("Ryan", "Elmore", role = "ctb"), person("Thomas", "Hettmansperger", role = "ctb"), person("Hoben", "Thomas", role = "ctb"), person("Fengjuan", "Xuan", role = "ctb")) Depends: R (>= 4.0.0) Imports: kernlab, MASS, plotly, scales, segmented, stats, survival URL: https://github.com/dsy109/mixtools Description: Analyzes finite mixture models for various parametric and semiparametric settings. This includes mixtures of parametric distributions (normal, multivariate normal, multinomial, gamma), various Reliability Mixture Models (RMMs), mixtures-of-regressions settings (linear regression, logistic regression, Poisson regression, linear regression with changepoints, predictor-dependent mixing proportions, random effects regressions, hierarchical mixtures-of-experts), and tools for selecting the number of components (bootstrapping the likelihood ratio test statistic, mixturegrams, and model selection criteria). Bayesian estimation of mixtures-of-linear-regressions models is available as well as a novel data depth method for obtaining credible bands. This package is based upon work supported by the National Science Foundation under Grant No. SES-0518772 and the Chan Zuckerberg Initiative: Essential Open Source Software for Science (Grant No. 2020-255193). License: GPL (>= 2) NeedsCompilation: yes Packaged: 2025-03-08 07:39:45 UTC; hornik Author: Derek Young [aut, cre] (), Tatiana Benaglia [aut], Didier Chauveau [aut], David Hunter [aut], Kedai Cheng [aut], Ryan Elmore [ctb], Thomas Hettmansperger [ctb], Hoben Thomas [ctb], Fengjuan Xuan [ctb] Maintainer: Derek Young Repository: CRAN Date/Publication: 2025-03-08 08:58:50 UTC