mutoss/0000755000176200001440000000000014404134172011604 5ustar liggesusersmutoss/NAMESPACE0000644000176200001440000000325114404061507013025 0ustar liggesusersimport(stats) import(graphics) importFrom(utils, install.packages) import(methods) importFrom(multcomp, contrMat, glht, mcp) importFrom(multtest, MTP, mt.rawp2adjp, fwer2fdr, fwer2tppfp, fwer2gfwer) importFrom(plotrix, plotCI) importFrom(mvtnorm, pmvt, qmvnorm, qmvt, pmvnorm) export(augmentation) export(compareMutoss) export(mu.compare.adjusted) export(mu.compare.critical) export(mu.compare.summary) export(fisher23.marginal) export(fisher23_fast) export(fisher22.marginal) export(fisher22_fast) export(gao) export(requireLibrary) export(hommel) export(oracleBH) export(Qvalue) export(BlaRoq) export(pval2qval) export(pval2locfdr) export(linearStepUp) export(two.stage) export(multiple.down.adjust) export(multiple.down) export(multcomp.wrapper) export(onesamp.marginal) export(paired.marginal) export(twosamp.marginal) export(ftest.marginal) export(mutoss.apply) exportClasses(ErrorControl) exportClasses(Mutoss) export(mutoss.plotCI) export(gatherParameters) export(gatherStatistics) export(simulation) export(nparcomp) export(nparcomp.wrapper) export(storey_pi0_est) export(ABH_pi0_est) export(TSBKY_pi0_est) export(BR_pi0_est) export(ranktruncated) export(regwq) export(snk) export(printRejected) export(rom) export(holm) export(calculateBetaAdjustment) export(aorc) export(BL) export(BH) export(BY) export(hochberg) export(adaptiveBH) export(adaptiveSTS) export(SidakSD) export(indepBR) export(twostageBR) export(SUD) export(SD) export(SU) export(pValuesPlot) export(adjPValuesPlot) export(tukey.wrapper) export(bonferroni) export(sidak) export(twosamp.model) export(paired.model) export(onesamp.model) export(ftest.model) export(fisher23.model) export(fisher22.model) export(jointCDF.orderedUnif)mutoss/data/0000755000176200001440000000000014404061507012516 5ustar liggesusersmutoss/data/T.Test.tumor.vs.normal.rda0000644000176200001440000004241414404061507017417 0ustar liggesusers7zXZi"6!XLD])TW"nRʟXaqjnj-&~ #dTi-:Z 6ÔtA oBԁ·Qav'KR^cy9._,ԝ ּg?5ȼF)o5rשŵm oe^:yC(n!NEl&<ɕ{ Y45,|C74cPfM *k@z{lzeB]24l4sEmi } V s[^caitz+G|dLǷq>vTHCD(yMqqQqKHqV+rmƗ/0 uJ$."&a _zlYOd8#>3jE;,њbh٨?/5CI{(78bDdq3k%15RF*fAbb k\~׎]!=ȵ:qS>RBmߋOT̊ G3t""$@V;dW[# BXG SClWo‚'@R9mؤǟ7v+==>-I"Sk2hM)@bo|BvS6Km rhQO.Ys7/vf3H_z _SZGѽd_A"X 'ӽ5tFc$ qRFB^41K0lߔeҗJ;ST6UCv:^٦=[(Kݾ5]l?iZCBk Eo'm}X#T#}8`/=4Lc'щF^B&;qI]'. rCko:ϓ iQͫ]9y0|C7XFd'.;-~5}ٶrB|D3۵PFf9ߥI v: g8 ^Bupv%bl/ _iyHpİum_lnjk(8gF [LLyQp~>|K_ [6r-S(ZYUO 6r?^LH?>0>;gذWkT!1N|[mH4p~!-ru u~QS1ů֦Wp >۟ cܵ=yF{n\bP:ؙQwZJي )Ncsm99p{S@]gg$]xTk1E}hb(1|bSDG'#`l6p t#9ukFrSהUtê&lVO7ƸVOޜ}@:,| ;^>8:8n?4+{uS9ߓ;:_(3chA. 4܃Vc {ҖfĨy:'P+ -Is aq)(Y^e/JehZ;ì6ðпu aSv X<_)_\$"nˁ:&@gOx*5hAPq`W롣+Ec U\QzhP;6+ R1\Ue*7MVZ=^yȗoAj0:\ 1~#O zEH{UsG)W~?"Qo#xNଳCLjlL! u%.'ɗdG_dQ :| +)/uIqZG.<m*&,ok\e. #/1S8S.@f8XWf袅Y異*?.w?H)y\[Cq<;8ku01HA[G ZSқp"E ,Lu;o"/E:zX} 5:^![T䝣RY{R牮T1ĎfYktrplw6-,u*F|7Wƿ!L1Z -xDe +62DgR3]7֞Oy<lK NCӫyK% Vs8ƿ}6b|6ˉp Y.* _'ZIZ\: 'ؔO)Ny_f$]tܭ셎3^kq­ZHp֪B,1:wRykc"I#?M] ⮳\\Ed[nalz|Z zݹmWv$E?/V8#EiD6"QoQgh'Y pFQ/v8G?r.冐ay@tDfm- awҧ^h2WyܯiUj Qmv~yg}ǶެD;+.b09vX6G-Wbu5-͐_=!]_n3&0=&@f>"4zb{$zkJ}7֫:Lnlx)۴ A$FӧdE\H0ٖDqeTUlYV`aOuNlnQ0D6[Tq9B@M#nQ9P*A'+WTu> L,1iFzeP#^N<>fcܼҙ\{:MAi!s}\lh@6)dE_%~2uNaw;9f `ͪF{D#*72qLd|l b`9 Jf tAvFarlv;U.`%QE/jQ Ҫrof\4uŽH"Z֚zߗ"|ژu?Yۯ4aq8w-ӋmUELBOa蓶7[ jfEpqn `8M+ˇL+67'gXOjW$yTK{0qco[K|{GףD\hsbrϽʛQmI%2FF)~'iO 'Ř{^94R6ao]Glk&*BA :שn3L&)*MKړbQ ѯe'wVuF%O6ff+_6vr)_JB֩κH ~X26>QJߝl]JLTL?$2FD֎,Kœr?Š)xHtXUp+$=RqM`.@-+ BzqgEhcP-wef6VeO,nRlƶJޫP$@ {ofyAMZA}1a쥝:AP.`)/wfCX1XPr]]}zDR9ޣ~9bXI (xR P1YIGB b$&4qES9!#7"{IcgfJjTn}lI9D\xVUPtbP\wUx͜$G*W5{a  jk@U#xEBO(Q*Sg nbl!gOFb ߱uX=ϋW"72.䲊Oy`1 qϖlTټVh~H Kd&Al(\0kj7N.hp 6 Aa'gn ~NYeӭr{LbvPdXunc戙@k%Q;¸C %E [\ݧ+lzw3*Q_-Q,FJ\bI~sn f2btm\^3FZ+_ԓA)䡢Rtp@u> creJjsdN25P.I }A%ZZO);s=,EMszqRRkȲ߸RG$M70Ⅳ ]]Glچ1C61z͋R}+Q3rl_b_S;/3 p;6Ts֓NsBj&:;$P]fL1@U;ɖzSpƔ*B"Og6`&ա2X%oiW.kf[2;1gIҦ1\ kR0w /橬H\V 64Z/y^[ge[5ς_lB]z4޸G(@ڔYf =42BYvmu"&Bd8NXC{R 0mX夅 2ء7ҲUǦb]ƿ(H=֭? LVoZKEv8`e=jit1ɽM ";Kv|wJEu{K yӹ iS&= aBCт?A yx|7f:DžbDAsSC^e4ݨ &[z睐uX#-բTAәͭ1y,q6Ox|Ӻn04D*4c.  1@APDWełk_9fZWb]|<#,B񮷀ʦ{g;Qͭg dZTz^7 RB²͢fXfFD|cgY߰iXͮ6) 5=,4*qx@[<0s1T׵;#n"bp+\+L,ro}7$caY+:X$ϫ娶NKq0?۲Ms0Lz#<ZKH髣/;gUJ$z 8o#6_gY.fA!r-pMxG`.2e#9=BAКj@Ig+~'Kb2 .}ŏF:s7:0dw]vE^%eeZbfSlz4&C |AWTefS'%]BS GѬ!KcBAаKT@ [IRs; AGJ$d-Md}μT#VM3GxMLnj2O Ak3.)EOGN;-c;pFN!1=COVu^CO (xPvsę%*C =u'z&괦cZ7,F/E.醸~|騗w##8 LsBT?lÓzh qZ^Q]p4v)rƓƩgE~-衢ZzZoH{nq?\ƃJ5O5a6&.9ȍ'?CG7R<4M2ng1uA .xFw/a!>mOŋHxbs([Kf2@CܲihChh.%pVU<4{RBV9^:^i{t\ZB.X" E֩1i vVzp:"ez>9!pX;B'`M5aw +/ӵNͶX=L[(vk]A *tp/k&g\n/f=~W*p`}G`ymR!Ď=+@r}ZJZ)bMguy̟^-Qʼ=)S/Gth(n'1g)&xeo#A(;&Db{4ƑGč{&ZrvZ gs8)q'Čc@vk:)$n!L+oB[G .[cN@åB~lDRQ6zU+] {ũ"=f̾!l,`f*HzA{7Љgfp37 'H e%|F;r¯ JX_f`;њpⶕP!E8Ԃ^pE,#9W=`=`{QGb>4AtDCKNtpwN!MXAF{lMmpF|[}mA$fHI/I1m1,aKҎ8pAA_?lx+) KAƕDcM֖)5| kw{'RPrF2ҦKo]l8+Qn 2\sR:DRӅ>&-iBrʮ.hk[i8:dJ1 nw%, ٠zd*V10RѰDPdp׭lΤS] 5YdN["YOS!X!Iu.CԲmde7&KJKӼ~#⵿͛ vȱ<5Q^tmZ2us[j4z/Ez1zzܾE$Ā~҈4c8mPfJD}~ӊd ®[K< شPӯW.ΩF\)h)zJ9"flO@)1b@[ qq7G"[ĉ!g#ieF^H~:,DM(ZJ;)/ͣV۽%Je7pp/҃dTN4PHHlpv!q;v< ޭ1qHBqp&39,lЮ%W[L/ ٽ0{RL]r7$$ P4TpEMl8+}uwg,$ux؃6rbcX[֯.QoD큯`7/ ]k}El[2&(η/63E9*<   *yG̥ܳ l]qz&v7:ЖUX;gc^RZ@I&D>ccW~[D8\ m9L٫q !59Q ,D9myu*Dws8,I0^ΚH&Q9DZ9bB AI<­4r aV ;zqV<d>YkLӰfpop$KcR {,}ۧSj* g},\Ё `Q!C){]uEOxfNH+zzSb~νXTFLP8#ML/0j(RB-vP A N4ƗG+bH ֳk/oI ]X~ LJm=7rwJDmpa>3pߌE/cЖh)thÅiZm(p洤=F *eQvt3fӮQB1F>b#Cb8E`<%;he-Wؾۀr wd[QoVAE\8Fv[pwh{KЖH?V]4fi6)"kBڒU3@szeQdƩZJtj3٥","`ϭn+9MZsp3M*KEO:ȉYj': sъHL?3u鴨h[HŘf8H 3?cmE?YE6VVR7!S\qM8"'v!'-DY_d%lܼyY8!BD҃3)щjlxY}o,8@k2m 2z1ST"KsOEB^*O *YE߿ftgr9K).|vkzPz+b^:r#zffō6vWIfﴫԚ5~cU51ÇKVCjXONq5}_5;7˹?VcYLݣG6yl#yW/{lQ/  C?Ym үKҎ0}Xz`9f KZhbK}uo^V#[ h՝n>R_asEZ*67w4+n UpZE,>4Wۗz4 8KalR\KR:,Ȃ2`Xѱfp5O0d6fcs*$#&;W7#|ʂVa Ub_bۃz2O*hl-M> a$2MoZ2.b<nv᳜.e2tu22d9GĸNWrw;"ݸ3=$js=5g)@tNt;R7TA&xXwKB濫`CDFjRe EKu:}rW@Xz5a_mNejdOeHog"q;ͭ (0}~3 nv|s.F5ǔJ!D@^S77fLN LJ}TnS)ܺtNaKQNM^@`5&R,F,qX1l[u:Ch "=frz;s|cie+={ՔCvP` Y3Hdztȏz_$T3Eyy7t,ڳ=/}r\0MϊcGw?a5ʜГ,4Q_[m ;# ;L[T ( TS8l#yzt/l@׻Nf.:zҗpeg͜1E|֪gBF].BAe/iV&4GvG;z^/,l\@1T`A[oTj^XO+qxoxPzgOid71Yts[>T |G7olu!}(y-LJմAr⳦NlM7ڶ If+|iy8v09P=Nݪ'IbD:쉹71OrƝ t R(S?z1RlO❔n, @ܨ< D\RQ_b"GF932Tvsf-ďAʝT"WӠdn|Dm&E`sHG6yaD|IyyOY k?erMP)oVYBRF[9F,lbi 1aNW~]@ހRCљC?nlqu9lfV+ɺIJs+mR[9U9P{hp#q5B5cl&I?Q-qw46\s}bg>+i',4kw01df #}~DrT rs+E sܶJ .xp]|ᵵn6D% [3h+2 3Mv5EU"5g2),Vob6:'ZC֡oCyyQ3pVԬdWuTE܋2ȢmD~v)%D~4{ܖqǹږ/3_6l:\% y(w8Lдj_3r}җFꪊ>;ԕQ%btOR+w,e3Vp˶m Dz]fzX0#7)}~,!h9*F>Qo"o h]9[O'`S ;Ͻ-ѳ2{4ŏ5_SzD0 hEeoe0ʜdk%Ndx _gݵY (Xh"cƾ"E+ L/6@x?<.]&>+*,:Dk#nA' 34wvqv?du aοf+~ TBR?=Aav\8˫dOSgp=p-wt)-lGǛ \)$]wM*fZWm"bf=ZߩׇJ;ûV<ڪKQ >:A]Eʂ,uߐGhKJloPC(1M[CN%e aӵ ˧hY7P[s??P+V;H!Zɤ@Q0Ncޙ x;xTCAo7šSS?.Vtkim6'NHN1Lq\Hƴ頠3+z.Bt2c+'ejr/yB2Ԅn˷|^| YϩR&I)* fXoUqe+xjw]mߥkm8]Í s;K41߹~{yu_OЁ%"zq-\]HFlٺ_H|(2"SZSWnA|Xڑ=ZJ">F`Zd.8 $(.vP;vln) `恴ۮg-״>='4ʟʍ=vKv78AozzO)/qێ?+?5δ O ^@d;Ś 'D3xc+Df$K:A,: M Ѿ3N[vSPyAYZ 6ZcOuƙ:Ō·~,Au ,\kyR;k x>0 YZmutoss/data/notterman.rda0000644000176200001440000104432314404061507015224 0ustar liggesusersBZh91AY&SY9PS}[Ol7vZn9nFk὾ [빖julmW]W]ټ]).L;mh̒n劻z^ݺdhL)˅\Ug[].Z篽ֻKntݻnnݳv;z罗fs)ZՋvhnuvYۻ[kMt㶷t"M v[9bwV[w&[tH\vmStMmfս;;I۲ܪ3mjwlٓf%uqj:7 Ln͘N];WwMkg:Z]]ՒݴfKcsMvri 76A:ۻs/zRIRgY].n:闶›NܭMźͶֳtwlۛNΎl[4cfvURdvh,5ͮӶVhqwuwnݵWs[;c]ft!ۺkm;iճswemvuwfgJۮ66iݓN2یZMەGÝS]+VmuɧnMZWNnݲc̸ˬۆwq[۷te+6`hu&ZmڹvwsMjv]ksSnw(;kjMhmʇtۭ˻:HYgsw%sErm[ݺZ^nֵ۸F껹WS3Gncs9kv*v΍4'4ejf͍%vJU]nL&DUv5Y$EnUSf).6HhUP4%vs;t`mmvt4;MvKABnκCZ!m]gT]2[t-w4 UGgpP2ANإZwUW{ઔ=wѽ|("OY]k4]drsfVvۺV㮴nݷqc5SwvNiT\ :]vf7]5˛uvr۲ۚm9K]֣NSQNMvݝ-ջVZwZ:fwi۵]suS]!]ֳ6kvwV*kMw+W7Rnݮ6v,зemr\"۪fumktܴZn7ZZgHu5ݺvi&mUղllk]k&w;;cמqMWE8&&h@h &&4L4҇UOM4 CM&hɦ4hC*bbdɠ&&F 4L44U?&@4b&A@4 Pb M4F04Sƀ&&a4h@4hh )'d#I= 7z2#ƦS=Mb'&6zhy45]lOg%%R9~(ngh>P25J '5z8s&M4qNˈȾ$B$266x"ǐѦh-g1|`M w턀H0 m% arV,S#1+5O@=Aw'ny-}t).0 w56P3ϙA!vuvusp*o&BT6kO,Nm84bee(z<۠7,)6 əjѤRuDWS>S`_}o GVBBݾF_%i۷g8*!>(CI!SI4Nj1!jFp훮B~Qրa$ֻQFT3(D" w s}WTe u@ cJEQC! { qmVUK*m $dM89 2n$R>;10 E9ny_?7:}xJl74D9@0qm&괌(# UAf@™gc[c$kEQ5y/`G3 iByF[T.}MYﯓ \Z_ Ƀ=% >6$#K+'X\֣X}93cT@ ¿[UC 1T(f&2"e$'k \}5,Ns ӳ=gR}Qڐ; Uo&0`Ld\IzY=[R>+Hm8zMws@  =8*點TQ*h^t8uR]9DnІ0i u- L@i`x5Mo4QGE4AcX0M 5$i@X˓Cwo`WH0Tߛun7보=Bթ#i'Mu]-F LL榍gUxs'5#." (nZ=ńBhԭ0ODb7bQ\(OW}+^cQcN[I;@R$YkȌQEL,x(Yam0YOȪ^/깚"f'/?ɑm"?OFe-)E ?i%$Cd*V Woy~ojuŞDY; cbIWG\uHޞ"$}:tQqnJi+@ٞVV L^VQbcCٙ D%;-l>ix/Frd+ɕF)tVExA }ʷ&(oTewMHNћϷfH%chK)uZM}WY;> *{-U~w$ಢc b[=Gzϒ-jH)ĜK\-P2ʶ>L9O˵+S?Әs%rw<'wabRg*jw8b2HURUV_D s0vtK?! :/NEvP /ts.pu ;qa,ޢ34< 3)%{1#UN;67Kݙ'j`4p гwW'C6 \f!dݲB1N\{j.I=ya Vڏ xdQ?NWN>_Hs,4LFm^&v5u)y1}5'  Vɵߋ53 fˡrjs4A6@mxgSb նeKY }Ѐ4,{Nm *,Q{Of=ɀ:H:Nя)82+.g&#u(GK[tWxnC!4yXEj5櫵 ۆǓdi8>V]}$N$8Wcły@LO ^2KIrgB15(_D@qB3f*< V<-g'L=a$; SU1(zduJS-Xxh ~IL4| !򀨅 jҾ!^x UjM!PCl%f٠TWoC/ӁTO-GE.@PD" PU-sº/zM*W&}Go};T$ե[B Qhח9\'w?>Q9=F^4b:4/kINe^10!fFBzqzP?A{ 4UP;4[و;pQ HĭPrG韾L  3 A4qȃ=m}lR~7Y!Fm 73ÍGhIn<8 U+) 9DәIXJj(%nMfvJ-/JdAcËVd ʨN ˈ=2)U,|QkO<|*@0[!X yKB !2Pw#xBlm9G@ȩsW,=Qrn>dZ!6b⻫-6nK.ӏ6D^;d5ވ(.$c;CLېڻt& " a>&m"%ƥNBDzoG3~^66"3Ć6Mfg{i$6R?#QH u$dQ'ABY/]|y%PV-HK XR쒂<`~ŻQw>3|^pn*[Z8h!s+|ʏzRqd~@rγ5tnR (H4D6^gr.\7_ȋ`KB:Jˑ(%Qfh֓XX( !?˲ z-eBHw;^.(th[\ۿP{ѫzx~xLP!տi"kF@Vܿ33r; dOI/"$h+Dz9z0:39N? .D2J!iٽO$WӚPWdr뙦֟5֬u{-bXEmS 2 3J- ⠽j1Kڥ43n@bɞ+kO&7Uץzhog0~*Hb䠍C#b<=1::+h*ŠwOU"1~i|#= /' wsIclshLKbC**nѕ"Af qUx&xKtR 6~&1ot qrNQ,+e6zi:,Vo¡"*ֵ?*J!drl$URQ\4%`@p*AwO7$;w$adI ҵ@fyDG,/ KGԷϚ]w ȋё~dJi3J}8k¯| :x^a;B WxބʧtD;W,j[;e-CktYr(=?o#~Nr eS bV`P>#7Qdw}yi'4 H fs]8oS(+|i-C ׹Spжֹo9v?쾏`ûfmIrHH cC(H Dno2 Q% Di H(&vO^ވV`?YL!rѿXm#n!A,xdl? օ;=jpXjeD>pnF ת[$o||=d8sMCy_=r ryJRGʕ JPiQJ@RE)AURBE)@J)hiEi@{ #5AP*mM&ξoOHQ?MW 6кzE5ץ/ns;Q+wmQD|csR#=7z`RW5HK8sc k vi $Q!Li,HpO811㔲DY&U 0~¬X,7x^;&j7$ !T4y%̛rDDF:<\;M 彦Bd|}s&)^oR&Eң3ĜK,El@R`mOX,NxL|WL'Bo6R|TWen_=}`+;Q.HBFlGg 6r|dՊOBX:ֲm:p ,rTa={߭͊Uc ANq jPMU}$PBdH;zZ j"AJF;mP 9pc Y6{V@Ir֊y! o :vf|a0= &CZ=Yڃ\' +Nє:aqevhZ=>zP^W"IČP)ϗ.7Ѓq[(&n_﫨^RN L] {bF@ÒÌlxdך. W9C~1P\Yu!J#3 8M JR҃J^+BCVUZYxᢀU4 wĴ/wv.2ߌp"MFq(ߦ;DkS>xDO&MpVM=R(:.i繻/9MdV**)0Sqp y3ߊ Y7ضSR{u@,'=d{UQao'_LsrMɪCGx}zɃlX2g|?&HQ҄0e<-N?S^;[S|ar75y++i(* (]y[D_L5ѢҐmKRlx_h m@"23R{,Ֆ!c> ]e5+poca( OSZ#b2{:A s], ^y%"VK(1@ф%E6qƬzqzU:` } 釯3udc\c`JL8=oy|!v$>;9k4ԂR,/e6AIʋ4<⏘N>},>qN:-v|z/ڹ4bvǠ];fFB#DT<9oɕ]݄$Zx)DwKdz3>GA(l3s+3"UG:Ƽ>КCP44'hKOg@+о3;lo%M~&+%{p0ǰY@"GݙT_\rYN=cGvqgC_m?<.7#/XR 7M{uk[ˆ@ nfzB,T.iwwK&bȫ4y1qskꐀ_Z>GlESߋ ok-))>pƪH4`uO~CGY)K!0ɵ3K{ 0hlPT_Ɯ9>H/4q:(seGtMAP^u'%al:N֩z𦺢gx-G;r#OH|}i}9xMFM6:HU3 dJÍC2m-*QZ2no'~c> Bgƭmn}}}Ѽnj`#?1 hC&߄B;YەBD_/v(>2cӲ6r7ExTr0gïQ:Lyv'-SF$ >QV6vLtŝðT.w/D!"nĞk#BЫ#['X>"٤C"o1Zga݅i1ML;g]r~80o1+8x%Ii"1&w4F,趾xe-~ l֬W3v!,b4(":\Ґoإ.7p`!yDZ2$Mi+N35:mK=nDEsHcP(`s L 8as )r:>GeƝ]%Z@Հʼ-3q;0sSʷ4$UϮ/Q%ZTKlFC{[Vzc4&J u^9*WwZ"PYAZ&il]s"h ?bXQz"lj gbs!G0.AsaΙƝ$I8$Nw-C+?{@2ƾ|B/jZB/_tD^ llGpqu=8"gV.k|CI] Z/ Fddƴ$g4\RdnAU>E2  ,k yHNyU= rP^^u-W KsT;Znb+`4\%E5IЪb |.b{1EP-'_ OÄ8aD%iv 8ѤX L|B5=kXװغiqlp RGo;.)8xAvxu  A9ܑ'lņϞۜz:0Vے1@7DYg%O|ʣt] \dY[kZF\)1K.k9&qcu&nxϋnkp{>8hR+Q)=Zʄ'8wנH2Y'b,\ȪɎ%BR~δJVYPꭗ2OK ޮ+7`7hݏvk c4n{[a`P~̈́[!6 B%DD肍2\zThFʹԚ-?K콴a̰[±U8 }""ĜtsI7ћ˂ N mpzvjՇ9od-zλY85 *jI=UF!p).7)o\r5?%HSS[u `#M\Qpb-$5;Ԙ[Wאa|!aOkh-Iܤe2ˁ s VVwbl}-2W>H="$/'hƟ͇@ #M?)nX :4ssq>FkWy#r&$8 qDZ~DOi2nɬyG#۟͟d$D`/Kp6,Ym8ʹZmS6%XFlNghxBaJrB~a: ym]̿a 꾥AfMXTRJ zY&h♟E%0VdzrxR~RLÀٰd+ G\%`/)ު3I =Ÿ91`~̳ q|tt؅6c]h9K |ƜBG۸(wq^_YQ L7q$CNsc:"ub:FAjb@NR Fـ\E09mƒqZo|b+fe䥃)LW abRn&nu>6y|97T'߽ʿ]v5_†C(_]Pe:Qk\W|_z\ʼn!EKDh AnHף"8'p O;tDDzCPHE꺹Ia2Xt,>֜$? d4[prTNs}8LțZȠa 7̸viRzu7?RCF>~[o|ȩqrWl^E S.pێ7,vf7G.]s&=n,ejoB1ePvZghLG%x;¤W 5F{J+`7x5aH@dPDz$9ނB.)@4IjDSBӒ2m6'S3q`fƭ{J/v҃+$_Z`xa> ^x|[yTmv,qhɠm[1|~OÞޒ 25 RoNAyp=[%Q0E͟mw/!Pl罵RoVZz.Hn2>&Z &*".91U8&JCWD2adW_I_:QyL&T#忇MZuٖB~CXAr-'[ߎZß ӓ?!?^;@=0SA]#N& ,7ɱ"̚0)*QyF@bZgi( 16ڐ%R*_u{ -&%̯/>k!HU,s b=4@1!ggkӔI87luy) GɆDkۛ몯zAHS>wf9 !:NTHcIam>IrZ5i:+yUkp51DV1{*.ᅂp^>yoD7⟞1INV ƕ k^( Ne)aZghK$O={8*)6~U'>b2ĬӡƬ6CNre:m 0}IN0"sd,BQN!{Z\Ad$ǒ^TtXoHpO( Pc3:U^өUQjoղr,{5` [Mf ]ngvu [s Y@H|L~F|5ӴZ֪/F+cE{!}Ϻ2 qWOjV Y# Xl vϙAE&8mD&f㭿 %4j˂<YJ5!Q]_iJ{)gJYu>FB4tOA1%[鉃]A˅ۙRWI̠})ē/Zy*?8㶉`,K! 9'+14rBaыK@+J:gBvPDMzmc&L _bMmG``ʖ _f~&lYAW$dDM9gu$$x塾(]T!  1[WG̚G cnTZB˓>~}=cۺ挻#TbNQM;p4ĚI$MI! 4XVC#d}'}鞵 pL 8OapV,5Rl+ɡ)SrKt,G*%l 8& Wx6cܒsUBP럮@@1HTA{Y+5mJ`s{b;NtLr+Q/\ 6 Peͦ^Jmd.+<)5mRm~Mx_s!QebѩmJkJdʣj7x݇:;H~h2zY!BOғ1N V$t'o'O`KR,fǽ#չn#i`Vz}hĥw+" be͠Kf&;/4/fgTʢ9,K%*g7\jDym tqLөCQ&Cš7 m]]ytW:9&E4 ytDJՍ0n@%>*|wP/:]pNF1&2,ff7sd_jTe^xqcV5d$lwNG4Yw=)*eR=D` ny|0Qj*VoG@ftT V/TIG'a_DdAg"nݟrIxh;6(PQa}l1EGoo@" Te'F_(8Ũ$K'uOubUjI )dѤ]JSӹGwU5i!jxEtp-Mą@fե光0%M DD*3ao8Qu^YVל_TJ=7+/aQ~AԎPDj3l6q.uNʄ^~/ƒsրۿ8,DMփ֥<c2H 9p?=%qpNH.HN9Gdv2KQ.}2a?1d7&Ƅ4㠆ž}$e޲COҕK~jhP KStfV\\b1f`unbJ:A2`6C4-7I񂖥1KuZAv!SyRCL3&=xzxE&'@n(9G:`Y˒IP}WX]3 ;n 'Z-,W7\?]UĮ-ijοWy  }Ը'sv@EԴ\<XJdM|9PqZ=TpgYM*:]A̐0%h0Mn/IM@bH.k-wtKp58!n_=WLAr\6%wmVbKπ4Vul%~ŠhoD~ǭW3 ќS|(mݴ=;Blab:y1"@Jԋiyw:4fn+ڡ>mIMwܱ.nv 0uyMA"ow$CvŷSoeKqsI41rI\ 01jWH B,/iQsqAy_aё Zb[%g3J"ϋ8 gߴ+C"Erl[3^g W{4;84nht.eּ~m<^K[ /VvQkwz? @!Op@#MoŇ SVOonv$#a'v>ԯB;!([^IpAs uѕrݑrэ|= [yw[ukQgT|OIҝ)N>Bu]G'c ¢8F~"gN GC9XicBNhCPƂBPL߯3Vq%$ EjsgpAA˰8HM Ǖ! #}㞧 ZM1]nz:%{0_b7t>OKxԌ!㔫qm-"S8t%Kj)_ DZBO(ފyH/79,SpJ!9{2h,ᄋy@VPcZ!~$&7Zdup3Ocn9s7&sw]2Bq<ڝO.U[Pȃ2A4݃'xE@~JhJ>!FOp0gX=(q3 SYO]$+tiqϕ.k^kdJ|]Ї L+NN+hX7TN;opZFmM E`C@y8y[{e,,LmW V26rsRAsXVPjrK& :iTE ;N,~ʼnHD@Df"U1 pEc7P?ἳ㡚MhVnt}v؈907kfdg*Fb .jFW.|ӗ|Lac&Wɯ& wRԨfQ%}˹*us!=͆_B[ߎQ ߐArR:R3Fvط2/TZu>K~hp`t;t` [::BP]{6-MJ)hi7?Hڹ\b?C  8+uIh+TmgDn< .hb@iC4vY(,/vFL6;@GyIccU܇:i.ȭ];(a23Og6 !9 3-$d"U" swہViARw,5'݌=@8NnM E|DCV3.Tyk&(o~L [?sOGu'1&ipHgЈ:vȍ@#чϚd GJc-Qg `FfCyL3t#im&NG&c~o*iRh rQ<khr7p4>vN"! ^nVKsRhB"ڰ<*OXO5\ޯ?l*wk ,vw l1tx$" _;)&yBfd_$}k& rk"t_m r#%V 2:?dhe@Ǚej@5Hr;z L OV3ͱ̙ZIALot?SklǭbdS`Z% w3Vv|Z )]VBX ucHhd+'d#')+|1$_jَ"ô䐱0j" ۓ,6tAAI\8AmMB>8FZqg\6ǧdR $%V//JRZ1"[%4m\8{o U9;"hȀd}6(^:ŧC54OђɲAsQ~&w\(;Ht'.,1 O= JSA+ ֯Wv[\7̙<QG''(|YJ&6sCAzXw[; KvAM@`ן 'I"' i[(ip$ ' [WS&ـv>\;jN?L)iV_D;yBa9b; ܤO*& K[+}g/{Yޮ*G+T홪u_35ZWƂ Ce&6J1Afmwi0!? m*A &  'tnLH_=r0ڵ1JR@@ߨ (?0NSCOX3y6OG#"#CʘfթI_BYNF:sBߔ09WH$`<8c|/ $ŗslXy{=%Fٹ7Y$uOԒ덊@W&\cKuU1[ TBJTzZdQpXN7_N/HdD=XHǠqۣBH :A{FB9.z?#lӤOk6JޓD/!ǔAlRkH)`hNj^ڱ.ikgT75_ 97 {TRar ϚSwnXL*q*jꓣѿ~UtejVA8dm:bZΨc}pS?,v[Skl9˚EQ˳bDu[jdtᒢ c|c:?X=xC#½܎e|-v 4`m &t–OpbԤn$X>ewMtCࣿymz4fG? d`PB]^XZ"r u!>Ue*b=#j A^sG] 3"l|B! D+#x-pvnvA(keߞ?@X\rVQeVw01r&p4 mG%,ݔ{Ғ3O~:ayd)1cッq!x#7''yh3e!W͸~Ff~awg/CJ(D??l_8(2>.UJ%_ _MbWxJRD8+4Nï$RO h=9^ WrK6u &u=$rZWX'3UT(QZs[* 2 kXԩ 0fJ8F&J2~PD!EZhk vYɗ1D+zk 1~Պ6u󹇾~>o1U>ъIVD]5fWlW~ʢ7D>,$mEgڵ-ez#} (2~/9ѡjl\mJnEJvhSdKOq'5INUniԮr+[_8*d~\Ha6t*:ca|9 c[շB ^Gx4 =K/C[3R :t@F(jiK>Rn&٭\rqtWeg!̓lsr(;𛧓]xpfe2lDF&,=P1؂ qzD4!#+֑9Ev?A Ix-#Az~UD~NL8$I:8>o<0fvC[! zk,߫q|`^#Tn:c:wQfCC"ʃAHhJ  "pf vX֜7Q1cx2g EP $u-VH45QaxDw]9%p")4?Jq`m})jp&fOȀ{RF/lyw;V0p1C-%/s/˷]auGm}8:ǛLG*#*hOˑX"XP.?Yu*H?\½ ג58Pݤ tP(3 @c{a*m|x";Fs~+mXu!vK2%6WyS9K1NiQcaqw}\k{"n>|{BT *([:)H=sJ.21)b"R[kإIqB12~@RՔԫgߘc U 8|Ord -,B^+Z,LXOg 쇈ITB<%慰$uOL'/YOJH$^ +iu>=, =_k|ҥ:X$ӪmYp 7ú!mAV(J~p2HwC"ņZS{r< yϱ:~IhЉ@҆zQkZztPWm2|B"L4"L 7nkUM)ă9 MQV~oQ J/XOK܍e+g6kj'nLyY[ 蒪ώ收7Hk?]ct@"fp[Y(d >A7Qipk/?ٓu!ZV%*~(nvh)k5$.W@G #Xc WK染;U13GZC@2]h^3ot@&;V'ξ-(z\7JD!Ao! $RzFZ@>Fa #RoIz&MODyy3<"ƚFJ:IC9SI K~+]h?9 CR5VrjȢzY;UQ qtv\[ \Squtb)PC͐DwysGY+ ՘;TI)mƞ(]z6awSdD.POhnlv8:-@) ?,ov~A1B `O DKNcö-‘SI;,\ JJ(xn\@{|0xVljŸ:7à $DeAbU*P.+Z|? /T&([8 Hij̈w0>Z)Gy3{Q!/;H9"1 x nCUI-#kwFV)L, Ь2r#<Kts<)Huur鱢]T$sB&S-}u/!7$L3 !f?GV֤}ihN*HL 5DU),ՠ,OWߪֈ+ qs)X< nntf!:}./p嶂i3O ]1 N~`lDr8 )!CxmY %WIRgG^Qnlrs?`HhQ,qM%ܱ $z5F;CMc0G&m Ձ``mazIF')棰z'XWRXPWDQV;MwΙV۰ 4Ɨ~]߁g8}OhIԔ6W?`&YV My8hqldBF zrSD pK֯؉[ h?۰b|$'%" ʥ4푊6`k1{t,۾r-_\D#x_yUn">5҂~+DžmahNaz'ӥʫz:oZLKgЬ]8|qɘ9Y6=`.Fn u7}ܯS!ܜ-0ڜa@%-kèrf9)bYxm6^ӕO,|ĸ RL$tXaDNQfcsi+~e:f= ;A`l4K l+C^bk)N= <ʙ5RlH)_5=~oO}5 pHxhKr(c'H$'2/AY\K/ys{$:vT#Cv|fhHOڍ[6"Avœ+; DJoMM*@޼8a 9[eJZ!*0d/.qh/TYic/xpҔN^>. a-O~zwHmVbEryvL@1dt"EQ rJ'y:O,i?ƿ( ~ 0qrw^eedm)Ͷ؈75Z.QusJr h}M4c׼x[w]K"JAk5}ztM7cR6& 0!iJ)]/GA`c,OHNImY^,*fOW?Δ-A+e2Z[A a@S8Ω7B8\J//v 6kͦCa8ژȼ.unK2 _h!0je s)["f:ll#0Χl`8H^ZRa. =>JQ@Hb1E)`P8a4VyT^1 @Og_ы D\;|ߡuh§ *)gLKTAѨ{? ?ͪG b2X5j@ngdbM$0.]1CHo2akFTE޽Ty FBN`h˝GjrkjN_QG@Uu~1Nǐ 4\bU()p?9pЂ鳌KnJi1?#:.S;.r(v^{B2k+eՕlUe (:U5:TK\?u7XC|9%DNthp+9OTƕP_wUuXe|Ka.{fkѡg ˄FF`s Zd;))$uag|DՊ7QE Ʈ"$Il:J1o+qC2l Γr*qhSW'\/0gK:(όu-AnHC*J"Ll݈eN]M0"HS庬xeC([|ZauiVbwSf?t*-3F6<##@t#8RZ%XC9U\QFYOބo.,llrapOφ-^V{=-q8oR'u[ T!itڿ2oQ#C"U dK.vu.M knc>Q@yi7 =&O"pp;q௜F i^zF\,o)V*Ƽh{3.*/qir$r.mrI-t,ޱx@KxTGM6Z0DH\RHz5 NQ'R0!&OUk4u2ݲ_?4LJ 'aiװP*=|5ϋk 1~cq> OI>ë{˙yÍ׎;[%E5Ա/Hx@H u @H_RG5)75zqC)w/#}Kڤ9Ϭ(5o֕?P;&.QP`DSKdw"Xֹ7<b/d̻ ae 4ʡ[y#;#@ԃ_U.AAFy ^eӯp7on\n4cNx`~bFGJ\?m!d!I7z@@%?ڂA@6*4@q*:a 0DQyze@ᦍ;Pysl6__C']4[o9rޫ)M"[4CҎq:+tebj2NG֝3; D am(4")J11#ک7%KUFe!څ%K)2F^\r Q,LjuU։8jCjJ擗"x*6e'Ife|^̢*'BFt-3V5331L/ w+ T Ղ@]9z-Ǧ іM oG bkE%)Ê3wb失M|1%fEYAJUeUR>}\hݓ{<]nIY Xf ;GkC[R#8(n?LyS(X [Y*nfz^v NIakA}(Ҍb IWZTT V<=Cܿt[2>5\h48lPl#~ ֤ǀӮ)F'Z% | K ]lN|3'<c Q~<2o ufoR>\3=(,qxo3y|Y,) LÕm@(H!YfEȅ3"/' `(z:v46wtv5z%Z T ,[e(F^n9'T0'F? _D+>yGC-,^M9o-ӷ<7&c1+0Qpۣ޳v9AρOǕ16H,K2'POxSHQ͑(a"v+T˻`jHPg1VN)S m @wb**Qbie}W@Rr*+ }9y:,gq;U)gVJ|]0`#ЧK<RqpQ,IPTؠi3RU<])qTI(+L2m*.@xM<5A)%cb7x*^lMd%U%\eALB'4cUdU9eŧ{7'.uNN T >.Wf1k~täo7"JCsLeRGڧ GɈH-2 1{"}sf HulI6P_6ȳ7S~u '[OB x!VEJ2Pk*F< kAKD^a2ڹ<1dp.bN2,8÷P! fto)7643ب쿻ۻնt%Cz5n OsrM˖ 5E݄0uV ),^~,t?y.p ٤<ܡIҁ1̼@92!7a wBBtrAɧ /&&v!J:XÇ,ۑj= rU_C7% z؋wOSf| LPkU!6H{bU6c7 ހFbc*˃whӧˍ+7`40%39ݿ%ŬҾRPA)υ`f:0_ȁY-cx 5JwiCStB2W*)UW Ta5^:] { ۱K1Mr/xL FBTlae w[U 7 Him>ՙyt|(""8ʀlϫ2asس r9 F)^8$nt*gbcc%}^O7 F$!5kpw:J^v)<9'&IKBq^P{d0W s@m-1Dzב|~qKJ3*jdFo:b](+!ïLraPI1ꔤ$%q'vrL;l)^0՝),]4p >!.B=e)zȬiƮﱘ1w ٕmdzGOIZkEt7o Tun#w QHC|1K³G)gV(:"01dްTe&g+݈k45vL 2(\1k6ƥXDȐJԼ5gSĶEFFJV&@FV $Jis*7}L8\.` ǻj9Ŋ" s#G}& J7DKzjϱ76xIdd)ܽB2mbG8~vư,Yxi~gOaɮ}ЊLnd6͍{hH¨dFfDbG4R2n,ϼŦ$BQ֨Cг=V5h5YKzY=F/}REFZ=PE5rXƓ]oZ}#4*GyZ jY#pRns4;)Q6C݉ zDz%**F-թL(tyU4pc݆jA@F cĆވO! 76:Fe"{zɪ 5cxdܮ=Բ/I A*=a um3opu`:dk5=j[8kG2tQxnA'%A]̦8j6HkIrY .vnZںeMg'VwEH}%0쨜|W-c Z9{m){$4o,}Uг"(j}K²N[mxEdUxm2=A! 3&m"Y>?5ٷ!j;U(uM$ Wm.Zpf:Po( R-%[ki GNRށZuMDZluC2 dͷ{B52ZsLH=ݝMRA3}+@g j8}ޔI:&@SwN1ڱE%bvZMv8{..)AK{{Hi>O !˲|R:܂ϐS*F.:!ˠ{!JS慈z)VW;8f 7uZ4)`O_w>wr4!"7YŭX @JemE%iֿ,3 lt_N'aVaC:vRHp]s#hhh1zZt{A77 m蛏 ,2 n00i HJ7l >*ilQZ&~nr %?A ~05 tfh~B*;a^h(3 QzàXb]Zr{=Y@Φ ht]W!J"ā0է|W!"sT]SNyUJYO4NęA&8aX 09^)#:1/T"MuޕoȲO"x%R^>VШUd)97B (po }+lcOpCA{ՙ}沚dl VHgǃ>At.i/+&et^J:]!~zM 7bP qtJ.;Cs 'K-.$w+Uf0_sFzXVF>qSR! {ُ G\fAUf +*vHmmlbEOA(U6 Tu@c<8h5mp}Cԕ:nOp"}]FpM*[D8sU'x2_U1ˁ -+;6.23Vi<(+ƅG?W#yPGA>t >NshO!cF%}AtX5hܤ /]iY~x%Cm"R6:%F;R)R*3j 6 5XF4fu=)ܹ="%{#<ϥ`i3n6紑5S N*n"  Ǵ|GSRS/l}fH^ہ͐NVf' ;2S<YDuQO앰;]}6<LY&5Y~n}C\&{A0??@릙?/QZFrQ. 2o;mf~ubIKGB$Awk& zҐ(=ZN_%?[];AؒP wb| D.%=Da6aFg bj>`*,8z,ƹ:0gkXϪ)!V G㩭"Poue"efhM  PR3ZE &5rn2! 2{!j䝶BfJZ7ğ#' A xB T*o*~=rT7%BZ[uu:A0k$}89B%|З=(L$d"7p.򵠢+y %Uǥy4SiT]@ؘNv?eqexĜǖ[s}tgQ}iR(Q?5em06m#$/d鹞nj}6 bB-, #6L=D!6fd$xFgXD9[JSw'9;FE[6}xz$5utACWHWK;IQn%9 ; _2u;%^R|vM,nLIOHo{T'/@A$ i95w팳dUA=xQ&$xr'&zOi@@>){q`KU̲aHPzCpښIY?ZHt0GݡM[}>H7[Xl6Zz`ѿyN7_gUGKWQ6 !UruKm~끫!5cCq9%ײP ַK!"pd>g<]`r6D_cɃj5Q2J҄ByB'W"D1;x !b非q8zݕYb9ԘKM#`bo\]9wFm \,7Av$+NUS+IV%*&MOo al`S ShH)hlUJ$|gTEj5DžĔr,@IgVǼZ$ϐޜ/'+WSu/@h:0.)a9M0y$2WweQ{EH//mˋ˓X7!/gm[svA>cVEYt! <) KJ2*-gcP@phۺRR6NAQOv-* jѦxv{:5Yr3}s-"1h{o\xNZ;S2jy(\\ʏJcnKȻH{;6#[QX»2*KP}Vp]NM57Ԕ۽Ie.umMkqy'+$~䲡bw!II{FabM4'ENP #tiy*+N 6)|rD#&:֏x`LPߵCavnlhiDuCAhSTMz F5uB|#`4xzF7KVx//NJcmǿ0!]]I(0wW",F Hǘz0i76f Ҩ%Z~{>e0;;]~.Esmc[Eb eMWTHgdi?N/t"r軘&8J;uR)yhOt_j?<.-=Tl$4&H}*9^(\DkZs]\o)#$gxt£prI\ӟRJ`O/+jAƎy&b:q0h_7IKgC\( ^R{QMp4$0Dee(hc$ý:VsW 1,~0=!#)$v5PUp )P XDF_?X6P@|taS @_:؈ID%A0 aIp) \2:Zѣ-^# bJai glUPE0Ydtfԙoʋq}cϢAabۂyJfHpn*&}SbwOQ,wהt[T`-X4."KD^.HEFA?K G1fX׏9S ^wvd[K1dE&ˌe&R;j!nP1," EZq! 4"IXh+TOlZ3 [1~),E4Ax!]³|uqS~15pt3 ;m*'ǕJd%n!14&VZ^L1NwL3-9;/Iާ!+$[@7N֥/t)eF dbmKYS^wËLtIZ˻YDP4yeFEuR2hL#K3MW[ĢnzTD)咒AtvðDj aFX1Xe fV} 1"oܩ]˙OĻu; -Q[PUHNEQ0Fc2?;puCFuTsw+ 9ū2P|͟~oA)31mqIbV>";&Y T3T$TR3dF-/ y j$f`qfmAŘpq84Vy9f`F+c7icݍF/Ww%$R 4b3=L߀Y!]Hoj ^"UdTfs~ &aFWz#_X,݂/x"v#pxW"xh(6rڧyJS\Z> 'AXQ()IɚFWѾ\]w'^CջFw%'9ۂMSC˿vךI+Cm_{BXl0-LX42Ye)OΜ|YZXjPb 2N.FQ#1+^[97s2`6%h0VOc|A-Љk]+_A?Ѐ93^]x8u5 Z*n$ *nJK|/'=]4oDzT`2df I4l"Umý 3fvW*013]W!;9L 5Jc]G ;9g!Pc( O=1 *,ϒѮ (K-❐nrTkޗݷ<|&'Q.1WK9[c{:f$G5K"M]AUJ tl ţDtfv;}Wb=9‘dTUĜ` E{pd;ph[تQ3_0ϻs 0{N~YڈFΩǎrx;qO["$Ld=N=y4=`1 qTzf}cR"sXXcjN7}<%S/^KDįd0=NٛPj{mM̲A-{:yg6PT3.4ʣzLM,󬍁2֫zcj6[`iOQ1eE| A:C~tp~Ǹ1,_ˍ~l|W&>&u:Zf]CˎG>TK]_U.X 1{'|J+@vxh-=B,h1In2"fEɪ%@`OI3rf0Lsɡ6fAG|.¸/LB1q`=۸hvÆL79*~Rg9 HXF_l;<r2,f} LUvЬ;ʔLl{*|Z=. 4S[PH khm >>pa0(,gO~aF-u4QJP(Bs?vb"/EWfB(`|ٜT;sgv$Dc t#r]};w&`:d~( u.\2fI h(8U 2 7Rgzm)m;]6 l,GaUdCo4ớQ dEL\'MgOwwIzÔҿG7UA.V =ly;~snQ6fYZxګ TX3^pNC0e=:J<[F|o:vj w&;m[Ӗ/1=`yeX'52CcYV3pdEnAtX GpvE/W:3Q OX̃ ,~iޗ`)9C&0/vo%Es`W G]DxCo7<8^) 2 m2+aO=D_kUeLl&/, e$l+.l+`;?I LeVjAy^DM5&ĄB#CR:l"kAUl{!Eᤏ{"f6;0'Yb$[UD?-4kޣ^wDH֜6⺻积/ T%$ٵ2_Bcs˾(twy_;1U~#Jp G 28Cf1)@sqf!==+uLJEcks!flY6"ʔĦط/#S6vk:MVu@f+8lJ^gJ?)YW9^/( `ѐe((d`Nό#咺$TrA\-9x]ʞi 0_`I[ksAaQ4,]O 8Fs gN\D#ةeo( JgA0m t Z#iYľQ6+0L؝C;fbL igGЪZRZӲ";f*#6>HK]H_s_ʪs /"Hi4)S[ ٓcR٢$+a?cF%Ƿ< beX}+Dq)|Xdab ?n i2*`+Pt(cl6+Tfs?6k=G&EGc@5A􀓡4 |jHqe<#+TUeꐺɏ` g%h,#G-8•J=al_{ X)3o$HÎ!*aAU uQ7FO+B|_[ XkWw)/xb@˿zCb-౷Y *zu/i#bXq8$'nU}f(5k|&ʹ+`qAٙ:HCabA|q1ZJiJjE[tá+'-p(EC=J$D%yR4 JIgQw\bAQAk >,d(1/OL&OFr-pCi7h[m@? ǿn5guu:{)3KidZb 3.7V{ ZF;dV~`IC]ߤ^ϻ:=wG^\/ Jc Ed![mbwvQӲ-v@$*c1D+WWW~}e6T2? E?EŇ^D偳vLƟ ,@U 2SSN^]4jȥQ0"azM,In8 yS-Q&[ *01fCnj4нH[L@r^ -Ң|}CN*]_ñ/PyaNgtj5.d*m5QJY~peF+7TB.q_N{ArT9C`BFT8*>j6Bb82]š]YTvP&@P *ID X>CoVQ\%O$γ2Y׀Kp!K͜[3'ɬ-BuCz!<-N˿x'{oEXPΌ7YhTyت1J3!#Q [OpºZ:\w0>" -\u*g#gIvq]SVA Ͻͤʎ;fuɭlM0OW:lؕ)S0Ea'ۄ}tt(dzm@ɫfӳ)gbo!Y'[#"GhZ(f@ @HA]WMG&avfjfM F]|lxpHmPXΟkf oy}%,`/Jk(=WǫD `<40m"s}Y>CCKw; ȧ}nR9ѕۡ>ݘsw=޾2LSw'#>:lBN!UVFʛb Ec=|DJS/gNΩo@o#ZF:<4 KfX#OӍPP;4.r]3׺ry7}j~+ Ы) -x7vdO=_&ोINPT%c 3j´=zĿi~v@Y^rә@Dx=K1QZN C=|CMzSڸx-(M8*i/(IHDfH6е]%@o͔1$M#Jz9?;ovU" }tf"W$k$"ۣ?/}}3Ek+BWR~wrtMGC@=Sǂ*Eim'yB`SR h-wAcˎ8v4>g>Tea_tÁ}Seu1v7!! V`?# Z_l*zk#qW6SF[)!.'N1r9;m.]0̉ T[L^IQ5qBa܆I(kFiS]x\!D/I∉kLVp+hjbS܊0G>uUf80+* WL̘#w%#pǛs^ky?NeG+#f ܐہ" Iķa&ۜRGApÊ=nϵfmn}}ӗUFEm8(!ƛ'tj9B|Ql0/.\iNfL}x tiPy ܍PZ!и2'ŸOs;X"ΪEwz5hyʑ];A|vt臟Qy:X۵W_Ys>𓎅@򖮕*+,F$n7 CHu )EĬ{haϋ{WL  9œ}=,>=RLgE# }"qV-Gݢw|O)zV(rQ -ؗK>dܱYI ;ƾX(k jngJCBJ^"?:*o+aDmR?BMI75t!=$l; 7'$ݹTv+wnKT}vѶs1P?3sMM3-W`E2A9 ĔYJ>Ke6|yfgR{Bc,r*]S?%Zˆ9xGfXvGהXc[)l;!" 6Ai@U#-AXុM,.اtDX3+(`o훨K_םw}:v$(O"O &Oī1>`4L!(P = fBS.*@Ϣ3GSN xmm[PHMR17䉦`dSפ[@=os;]o$xROM~dWb誡vκ5%!K6gGWaqԶɐ4uW@+3C,#1vڡb6, x8+8S׋NnnXї "Ms8_=~}?~WJ{<4VM~f,6kJǩ|͝=G3M,GLW٫`ޥxh(H!⯌kT?1u촗]Vo*АޥWz}W(6V#`(B[0YI2Gc'@*gzJ<8hFu߯} 'Ү]beJFqTi&R?K}#FM@hI"""5MрW&0px-3Ox>nlCL!(*w%"䊘s$ /:+]q8ȏ'ūtnFI<DJҶfYg3MN(DmDi56E}k Yy@΃dǯW7F ފ}~\oev㎈9N`zp''=s%jq92J׆'lAp1w_Tg<mJ3TJzkp6q-jk%7]{e7[c ,RV$̾&C KBۅ!]i|B@,n_q"+>JhF (#0(Нr{CS|fQDEWp)pK¿De7#_W]߷j oL8P,ϴz ܒLm밄οлHU6G;vt/0a2XTs yK I;0?ج[]4/=$lYY }Վse`TB_Zӌg`q19ؤyBZ\v\G8 Ng^Y*$IGSu^/}ql/~/fGn#V];P!LE"@2L1a;X鑗]h*γ&ss'RRlc=z.TCi𝄀t6Ws|w01 FzE(, Vh0s;#s8>`TL8vz(ޭ}g5 oBXxwu2'ۻ%焾 LYPGn̆q142fCOd_H?DreL5zزT'v!XoqKPbr+YvZ԰wh5/\J2h̕CI-Sc xLDɩ'\&APp3SԟJ7tq=Ǝ;s|]`=j ւomd LZ#LQ#/d.熁S = Bx }^GErJ};xBw%_و!X|27 3&VDZ=n9PiʊxJAZT4F Grϟ8b.91=޲erB~'i"<!w!AHfl,L,!izGƬpB"`+{2)I,g}X#m.|O5&x&Aﳅtݑ<(#`|E_BAJڿDF2HynKpJuUmu0ݪ$J(jZmd 39LxU ne)}6aYѾYkWrQH) l(љ^/=19%x}nTu <8+dDY0IOB*LFF@+JOit]SxiC#~΅Ohs9$;>Ь{xZ`ō}( ҆%z O|KNNe^YpsD/O$-c,5N){`GtXRldKAJj9gMJ=W#sj.xNː Ec&LOܕ˪/MA5tȫݤ\? C€+hkH3xCKh3WטY^h!Gp_a.j;톷&(-|¦#!1~NEO^GVjٹ3 Ǹ\c' @IyMo|I, Lj&8DIm~K$c^+p*x<9rMKL=MtN!E(w:QߴRو9&9dJ34.Ι<ʧ߹ ->S oE1M#9KL=oE ՟g@;$H,u,W1oLҺ_>N@$#] (Uւ͢AضbC`?!1ƒ#&%8lȏ2ѡR:%<0f |\(G6cXkmyyzrb2Sqf% -^|a]̷Y1: V<=7-[_fX]g۵Ѭԙ"=Kjih6{:F>9Ì~=P8$Da\Q0U1jꕨ]|7Svܵ)1Ai o|IQ DPW;D 9݄t7^lUYb-iJMlma(YA%FBs,BÍǦ 32y;-߰d z$O:[7\y9< !lt"5[oLs2e jm{jBIHhb(1TexXЎsP.ةz^Ef̆tJ iyWW=u>*%w•RN"loh8)B!׶3Aυ"PG||e]mWIo>_-TB pJ6iQS; \ у58ꝭBCɃ *`xw̉WX!#_N ډ =y?E<^)J]h1F<~%I~;|c : %}N\n;J"';;$$:~eC;dzإμ@9qnџ!|M2ƒ(1-hh6WH6['wB,Z6zOTeD&R~>Jx JD6pܿѫl MWkF-5j/UO19 y ì$,b?b`|3x0 5c#"4B DuL#ҙL /0m|NP2/oiGDn( ^r2FEk5$!ѻ1x_RV<>\jA0ccd/c+͟q0aY-G*S7? '̎/԰z bђ Z'_l'M¬M(- Jr*SBNw#@(Rn}kջ2`VbmT) atP£-(S4奙(5ckµ }+}h6JycXǮxD:ucղ(4i065(n!ӕ*ʳ#Q-3ӻ"aQF}1CGaLYxC TO-W#eV"UAR(֬3xKqmڝYbA2Da "m^ڟktKTgP}ql<Np6魜؟ЩXM; ץcT5魦R[%.3D(%+|60\(1(M.53+Zl?mwރk$ޚ$p{RTe |A0ZY 8Q'Jxk Z^`сp:'ν^(CT0"+x2@AL|Pfa+ \B\lG:q̶mפ} g>\-K=Vq./iQ.{?a yPnoI&UީpN1S z hk-c`#DZ],^bgeznX:+Ns Թ|J7_oE +6n3 yDYgF}Rey>TyHgnP:TSAa\y]crT0 J;pr 2&x q}lƸX~aZJxڪ8ky˨N RZV{/JcfEhlS!mL4LO,Tז6wGnJm'C(dx9;8%nԋ|=)ft08^ YX֜A݋9aQ?HbY}R(iX2o"+'KBz狽 [X z-%0k -bS>2.9 %YEIXܑcp .HiĖP[-U"@CPEy5G xYalo;;1J MBt@o0 :)nq->= )@ "t/A?8 BNIiiwkr!X~ S^`RHDdiDw8)x-Zx.AP }qҹ7!-Bf)YaME).s.a>(oCi هӗ#0L}P^Ǚ\?GN?[(ޙ,B^_Maߓt)֔‹=F _J2ؒ5O=r_,WtʩGEs0O ꞕGtSTPE]|z!8EO?!t_,KhWODVdt(񯑊\-qOWL7-x/'bm!K=dJx'iD\gWíuݺh$*HZt"+'Hn[cZAV`W.B(bzߩx+7u}RVMo v+1g=kLPCP$6Ff5Dą05McW*Hb$-,{R20XFkiy\kfndFdž7t͇eϓ$ГZGl3^n X_hP"`~#KX~Lz1CuKT+=<@u:CDHW2nJ0o" óva"= rNC4=K9tFgkQXdK" *Gti)J5GZa89nV)QGt{N<,\2zAp øeFc\0戨WHA|8ֻҸ?@DM ۏ:kquc_T5QнSŦ 5єQmo ?,t[klP#lEH.RgLcӲڀiksY^ln? j,N9_63I`^ ƌTe3}TiAwFLWNH+/r@nKH%ijǏ6e|߱7n:-rrxV[3T}-`ϠJeUYB e ȧ«d/֍`ԖǑ b˫GǮ_5s/WP*\\N&@6QW1M%PsƗfv½$\ƣZ{,ñr#z!?<iBKY â0>s޹M8ݗvMR'ٙٝ_KA)i)Ha5$j Ai)pKȫp,[j? IWؑ+UG Ӹ ^맏/;و/9ŭԱOK#g }茵}r/br!b.`"1ZF:,XD:4Sq&n[!LOX!<%{VC-@G4?*=ޕiQu-_k:zݠ?+7V;55pD|&ٟdZXJm<'#W7vRu3λI}+L종B2]hC>wFYB< w_ІEx&iG5 #/KxIR*<<H$N>Q[Bf/+Jpc:C>_On0 eh!4.Ag㹃]*h%8ҧh"7mt*?\CCfvʴ#,`< 1X hSKwL:vR+l~ M%-eQT olo-m/"5c@X]-ȀvkfyS Yz街`‹F" dvD=uëf0[,r$X%aT$-C[ w>#:<, ԜW۹%ӈCn< 4UY0D`',nԠw^ Wkp"RRcO7xgc-/")U\G#QeWwXWi}>Z qy\ڽPKB{"Eo#.#m5ρml?l}*5#J.-m|O!66ï 1?ڈNSiz]ZA'@ 9i@w6!Q0-2ׁ!j| %s'P51ĵË52/Gޔn^E_c<;'{8O5{)tu ;QQɅJ:nq\6pKM>5=1ai$ucA7ƅEΛXI%&:IV[M!#U+"EPg?*ҘN[iʢ@fq]RZ$Z%٧N!Sz; z씑MB^|>G'[u>FMi/+"R'ژ2|^to_kۓt}ryA~I~ZFQ|MWP7, cOP"W!#^B. &I/d"D1-S+}}>?r % Ϯa Qg>έ5"!EpX"vM4|JLz5[@RfEqlz1xCOwESCl\|~A"RxӟeD$+BF(@~+'Հg=AoQ:)H~̬wy [KW#CԈ/tRm11T@vEP=ޥ<'lp -sv+k>{̰ءÂp\AW` ႎ8ئ_`{$T lA[M@m+ǛI{7Y BUȇؠ1YK*B"ؖzкԞlt?:x 1h 9gF\㸩`koֽǘkNY:[ M\h&iδO&]܆ui]ڪfGRH%;"fuxYDbX?a+I](CCX7L!ٰ⧜ʪbG6It,OqM.XfFk>53?;;ϛN@d r#:z mU0.-Ôp4\lU闟HbCEDNe|x *Ϲ׌IJ _id AzI0 g+Y7hDFzL+$ SDޏd/Uں%7n K@R(p>5^Vbb1v/ Y'̬buG:Onk LQ} $QcW%nQMo2z I:|daynhD u"Xq>5,B/YS|n5#m''j' z}anxoenm >Yki:&y4( GUk%G!ΝI^[F6edE8P>+}GfYp1o) z;c:\Ҥ,>Z U/Jxq #4Yɺ.VE# LUy5f}o|x7wlk52C>!` PV.U80Ye"] !,nz.:ͤ^APZ%|%MNN(|wp[R@!웾+|I4p[vJ\<@b"5svTn윥0f;[h:F@ӭ槱"i.1R"rSpN) w6G{tYԯ΢ɥƍ$\A`XM*KMPM^!ב^cŌlu>'ie|-zz n:ц/8pw 8bI$aOHo#gqή+,#-{H2qGt[CҌǩ/hm$X)42 B:,0ӢyjMD ~cL#ٝ: ˉYNjt[&'g}6( k)DY~6s0`"!2x>6lU{^ECljgנG/>B,s}'sK4L!ZW`>= 8WBCIVKIʼnOB0󄈚DG& P 絗*Fv(CC_O/v]t簴fQhŝ=>2NHp mloү-# ;.Q} Oo4% A" N؋iB Q)l0hL`"O FmAOY(ڭO$.\ ;_,t(tQ炙Xf/ߣWtѽoWƫ~aw63;*#r&NHEyOj:wSsوB[<\OMG*G |8yyӈ3uprc6\>d n^ޘ/ъf< a1<åV:E$l,j=s,eQj{$S7r* 6̏=eM˕TbTQ*tkCT',4M=D%kdxNլNj5lfBCJl']!gl9rwSokftR.RVq80R5cw}xkNG렌K)z|JmrnClAQ&kH`vM:׌SV%YS-P6$Zً@U GjtpnȷD#Ngj8eԷŷhѧ{cP]?:)O1mFKQbLR"`&I n0%b:?N{ߣv^/6!:&#y&[5r[4LOx6@N8RgC>P:$ ־P@'{pԼY&"Xve$51g[QeFJ?.?ZN#:d-ʯWSCڌrP2B%%L8n\b1TFbC:37ZqhӗV%%a"[FPJC",[}ׇ$&ۈ6}0Δet>W֧YA˸?`I}ј˜ޚt05-` &tucGE 0.&Hh,C{H_<6(j R3L)b E1ݿ6"bW-N:HwnOI $~bpB7[oiD]uJ [smC̓vɢ9K Q~*;v BМZBanL6҂cI2 a*o;)yw)PCg Ba0N"񺠓"շ鰈[y7+"I8+TgZpH:eu0并˪11oǨ̋StT@["m7~i%z9%= X]?'Hs@.^<"l u݈6yTA]plHw{cA/3΋(]8ƭRI _vve>yv&_֪Yzx,X>3BhiYȖ7-XtxΝ^QS1pDغ"D]5BSS!Eh>ʜ5LK.y j *d>VMϱZ Ϫv;g}xw6xz<ڙxtlUS*|q Gf[-!plB,U2,!Gu!q7Qǁh͕ʙ`p + (@s=+1:ϭ<3'FBڂ@; 'ƏWⲑ`4U1wZ#95J;Vߴ>{S^*z+xJ/&']8?=I61ʲ ݶOq}i8wk, S59Ap tUwr ھG0tjRIQvsw9!}C8q-XGlx""?hqW:U{]{˶zd`{(Q:G1׬FVQR _,Ai/e;ZWIWw1P2; |j;֫r /Vw]> EHT!e^ F`E<1;#w(y47TT.P'ޟe;^`i?O+ܵ} 9wutYPY:3߮# /  %nkI19v: =;|> 6k:VBop2Hml,'R ZH2 xj Q'JDQښuju@P;D69|$D8Cȫ#)O v/tN&7M)|SK~,Us8ҞN7Naa;!QR=GJ*1#@0ب;t(fÎzfaPBYxUd:Ϡ:RnL';h*'~QQ:v6AHml| 8]=19kp$3ZAUouֹ\=ƾ ¾T}$[:tsth^wSM-ЇS+84)jYݟI Ӛa$fGAM%8'Q5ݪ2FسqFHuI}lٙ-!d,)zPcϻ -a h~).]ֻg| :TA\[ǤU4)y!lB6B?FhK~1S5gy(1 o "ig[n/,6F4;-Y6?0OL %z?qٯ 0>iIlגR++N?O@I=+L]h(H̅ݔ+"&/ v ,huH 9>g60:o~/ SuS9,NbD 5S=>\:бʏ2*w!G҅;͜f'f/*C){l$o#/xcq;4B&^x1_ AҾ{XTHbqVNfqrך #T)Uؑ> TY]R2p'][4t[ @=y$r-zS1F\'g7nFF'XW[܈I] g,r &!漶ւ-wGsa+x0iHHS7sAb4MŶJ;BkbPVO5'< ~k';x%wX1*'ZVYG!«R MDG⪗Е˷ʛO.6ۗiR }ZR) $ M CWvt>\C˦乱eN & s&URY pFBaꉿu6, ,]Lxn7d<)KP2p Ei7%|㙐ߤ=([ >~ 2 oqrKݷ2Xěgr~쯱Lto<} M(Fj7H ?cr{S(gr{''Sur X4A40p(^ypCD|Yѿ{y˜h(ax/j&N qU@1 q&=&RmR)?h5$ݍԷit$*d]<\V,f{ ?66yC"zĠ8r6.7,\jGQŌ׌S'_ɜ{JxItECFÚ%}"Yp鐑˽AU+C 3\,ڎL:|㩥B|Ta%_brWWP& S vndQJ 걦:]'@fAbUÃi8ǎxҤhg#RP߄(jHK&=}B4#W"ԉ ihZ`T5ES?py"O;޹kR$GOb)2Ah~*"4 0Qt4.:wJDo Ġ*wl+Ȑ􏠃,@ -' gܵBQG `=5jÄM?XJMXfPoEv*TA GE /:s9}ZhO6#<|{\H@IWP^܇`W% 9(Dbd0mGqCDy(qgj'YGkcOt.m[BȘ/3bש|n9&0@{Yq} q}[HsYӭ)̡hw!d˯z>A荽.:%iDu=@׍|ogT:5@-~K@!ќAI$ZbԵ8"-O:x52yL*>X 53nɭyQ׸8 c)E[G#ahiBE*^մLUA DH,[n-dI u~ѳyB r#ځ@BQ2Rnw BYXB$fe:aT ~kճ qC;.JY$4zbA[ӠfEL#GG=*T~A1pX{} a}4bג u )1B8e-xeP vo pPD&{YMnw\RSٱGt̜2uG/ xQS ^k,ЍFg3@Jʒe$@;>a% tF?Iڤ!n)G}Qt7~(ydzncFn67X5h2g,`{IGnc卥CT#%(5(;@4yԗlK$y**k 1/өagnaQ@>$ڝZ`ҙT| /zej_SKIY_]y^LK!tt%)DΜ@飠琶˃WWB DcE c:AD@Ά^|vt]m)~2Ɵ[1ODuLGD>ǎK寲/sBBHx޵ǯ= m2u炝scRL}]pNaW*O[,2(ҨGWwQk"˳1Fxjй# hX @!E#o0*Ed1&*%4d.k#-S/mPc c$W Lvmx-,O3ӡ6]q,ݲf85lBp0Mx+F\Dtŷ9#1\ETD(8ZufD3pZMNGLX2z'~cB2iRA,υEtl_8++@S|kp(e""$x~\&Cpvѻv];vKUb4rG] K-rTgtSaUÞLr؏eU޵bb2S{FF`:R\򁢛٫&i|>|IJ!Wtz8iaO,QT6A/YOuX .+O!<KJϘvH~"q<p>[</W# mI8?ڤA?:/W* hbkcޫ2Քţ4 #Hg1Ju}9 ʫ]/:碘3nѣo~!/+Z %YHXyឩ`G{*2xK&Zm%➩tIY9B+,`;Z+I-5o/.,^%MLD HdOq"1ơb53 x%$b\u@+) xL@lhSm\V]+  ()}0pʴUVvbKZseD =Lfx;A xzފ/Q"Uivq`U?"hm݉ V|W6{b^/):b6aA4ً#u=V!{wj$n)VkGEb5zY*Qĥ.|uISK)3xiʢτ CN6$o"HY/ '#ro>zp\"D-~Ǣ7갿10hsTb3t*L6LB98UdC:Vդ;'7<5kN9 S'^C٤Jfy$a5uϪ0_kB^N]ݲi_-u6M( R&P7CuR,[L²zF5ç-v|!܋Y[ouD)Gan~? %z]`q懫?jO=hhROW#AYBI0`cPg0/?Ex2bljUܴAA9303ATfA&:Jƽ% R hz|  VF91&t1w8Ǫܮ*+:7h·U _gsekpw"~x"@|4!.G:hX+ޫl-AvWh=QgS5MtzTҊ5"fP{hD{ƫ RjyvvɈfOm60 zmÿw成M&4 ۦ;d-&#Ywf )#<@ 9+ψdny _Q/T#:pƥ;}ƠżwiA= ńZ ]juМWVD-Rgw {*޾t'fă|@0Dl}64qlJ#B8CH*GHVP(ěv(Dr(Ap߷Ovz3wЫq\:ghM]!\ 8䖶ntCxLϬYrpBs><[7p> mSEyU+(=!j뤕p:XIj{&BjmT]0t6Ν۲&reؔo8~WnRzuɝANu(5 B̗qIo0DCrDphBvhMQ=~oy"Sv(=PG * J%!E)ްWLLH L_XN *VG?O&Z;_2?&mkEHω]WmE@мkO yuQL2c7ÀW9Gfnӓz%E݇2Á(,m:n+(+@0i[6ԏ,pNJ{HK=KxI P~dʅ-BӌVd#^y,ڌҡ{ OI2s%!Oݴ6S--i!)=+߀JcYj e6<'wj`TVWNtc\ *oat"5z9>QHFH¾Iv*ʲ-$o^,>r+i 9JjԈ?ski^ޔdwn5;ăꃤcӘ eŎX+um. hRbjk5y1ED4# V2{0@x8}zz=@(ieN"ż>o]]~=b5{&fL :>i]P p?.ĕ]Qmrp ;~Gl vY0L3.&*1`W]ESKi y ׇ8 Ze%V`v`?G%T  Y6NɎTpa"QYwf>h%aEdb%l('8!zOYޯJf4 //|fK #{V_4 hzi'rRy* V(~>>$4QwHWکOl1[}-&dқR" j O9+U*!=*|# wRRߌԳj I/ 4A)iO|nBn x%9D(#˩-־2Ztqqd짥vhfntj`J!Y4jBeh&Cg1(?}~1?4!fڐZ8-:uu"8bJ]Ȇٽ<4IxQ#C/RY5ۑVN3`5_;YM0F2h}qy( h֨brF;MG 'VF7HnfpԎxFx&p 51WRsr]\lʞ}Se)blz;QsSC5Bs.!T[e"A%"=tfR|@x'!B_URQ;ߌ"jo~^ ?pƇM3hN$}<9Q=1 I~\SB?7->4'ZV]I9f+b+ @VnbWDPA~\y{a6e b/-G拹Kۓ(zH  A(*B\8fýxa⤧:>ޅƆ~.9RՓ^d f* )ZqA%GGھ.vf?Bg/մoJ *l>a}}s3GD![=O~7,n^^UdҖ':5H3F%DC/A=HJG "5i4gS"9JbbM bpF"FϚzj>>sTkT +NƘ`嚷[>x2xNmyҘQkZ`SQ!mbH`}jl::iS)|~G OhXk9`d\A^j8 E hlV$,vpeյ&A0{i`1GRˁٜ~0XXdC-!^tI?Yűmz/-Z5O"TJb=}3GCb>\Qf7c.DA@Z"XƢVXR[->So'~0a]dLq "3 $.X lfNZCޒ883_jVsMKeYC thCƌy(?H_q1/~s"=X8)0ABEeqlsd7M'(WtAKZ a$C+[Bf{*Zby:DG>@O Ұÿur"}6ϟot#C"CUQF՛ki5sU>":!LK:5<9Pΐ5>(a2]Btu}!4AbtBe6;|(0C !)k> Z?=[ol |Aݡ dkioS(*r AE;LcM,{pOcJTLqy_;x}j;>%^a+}^C[P+jc>U-]&ҍVS=+Hǟ0؆e-' hw2pŅ~P~$2DP9JDJpO. ])؏IeK Fȏn@b虻m }.i0.¦E"an؎t2YRqG5\ е ehG '&TIpuM o T01 @=hb O6#KXz-1"s)h+sjZ%١»AaA(pr7$fcW*^HOh^{Ra&Iƥxv. > 1êRQƆO֗v W/C(5ح߈XBv8aJ\s+7sCX{/ 7&!랚W5qro:p$ ozdK ]VF`EUl_D&қq09QO`TqQTj;U?2+0D)1;c{l4e;ڌN(yzЃB#[_?M:0rə-5DTλyxeGygfP~gq k0Vv{b6VqM^ŵG3!mu-d$9}D^JEu bn?aNbEEC0HqNG{s4~=)MDj2,/dH5DJa"JXn~ }'ǂp2GQ"d'~Fhe>2AЙ c#L 9LL̮FH6uj#-PS.a#2IcOt?8K#( %-^+#CU5\gc5mv+"}+-/vAׅ dRluhf֊|YjA4( z2I,fj+<孟MFesw Ss*ڗ_WYܺޣ,/{]陻@WU<:/>UFTSB>N0Ds+ۛ %BFU=(pM-͙f9E3|6,C?)`9Io#✿3g̾lngXleUXHn"`C݌T;0~ a) &JtoCoO/ڸ!g9a]! pgZKbRͣ {nYgUnLi4.!h.Ӭ9]iDheZy>Hs֮U"2,I#[RėR~*j`i7 K~>e5LEV+RA5h'<ٽ8Y8c\Sv!dhIb57s<xCg'?](UJlim* עh{vi,f0E阄3jd<`F/%[fJ8oqN׶i%"T7oUZHޤXr(O3k%nd}gM E]}H",Zyo\cV ].{E6tK9eD75A'/gl. 8E25Rҟ׈GPB^uW2ΚH>KG&?v9k5ү$5Maa(f~;{AB\{S9@Bp|&}n̗Buɸ*0c2n$-wkҬŬă,:9 ȷ ZwIZt4(IV>+Tq2:Fd`?^]2a}[2ŋE#3Ey\;/G/\n%>.i9P+ {D+DeM:X a˾T, EJSEBY1s`CO)1B[PuNW;1<Čۋ;6̜gw4ʆPlhhsJ12zoz-8MI:UQ`‚cr*=^#x?b#v_%;1{+ h-aXf0'y|+%iVeD.+'yD@~UD#_K+D |WScbK J\=Qן(Xn*BrTBi7jZA_%%t:oUѯfCbjGA~qvF6u4` Y!1y7< ҽWl] .OǟvA*:vvh\NEhFK[,e07U>b[%̅`kT٤bzL:'^"i8zy.3&!,czI{zNqOЄ% .b'[gP>1O dYN'RK 9 8I#ml r̲}$.[Ƴyf y-̴@{bgPZu u;Va5P~zK"H&9#H̆LED\rwp+U(4d;CcZms~yG}DG߈WZza)U^UhWMf7;\L?_N@v^F >[%^ W3Lt4cCCn67ʥ-9rGKY06J bSJT*dv9!֌L \[RVUQ\ EqIu5F+&::}@AJt4|Fs H{}iBXPHx|ԩD ȋA\eԚO<9ÞؔoNMDR# 3Ղ]0Ƥ]O&wE"C8G P' 2:T̺!v)h_f72y ϥ ؚuи.`=-INoϋv(58w*tw+jVuyEusIofE 00^8kSGAU׉-GiJ1 `d'󂋆D<f݀ b;!e˩xd>gS$7v$J`a9z)M,k[!àT3pt''I ,p Ji\'WoC?nњUg-A3[3i,(F LXP6[ {͡0Z(oNC~ ƑdY%M}^;RD4aC84-Lܪ((#E{N)eD,jp$d=LuU|9|kTA8T$"Ŷ ]2g^j]l*ͿT6{qT1cq_۔W=^A-Ÿ[ ǮA37>p㧍P?jn Sc*(S&sVlQ˶ Tt7Nn4$]sqM&== DngcSOF~...p!\ muR=9A H"@wFʉ-*!H5r/ӷH 59HHKV'j:jC.ehjӫ()+`7QkZǦ I~t)/D^9Q9K qЙ+[G5 gQXZ@ehk ]<4?mD6lm~ `fLd8}2 G0+^TFJןaǦ(Tu2X@bD/Iz;o?k%cf e'ᐨٖ/;cڍsO {$M 8E|C\鹁Rז[3؅,51}L}k/zG)5Dљ" Zf ?ʆS'vho䊅3 #k̷THZxͬX7ol]_?yGˤ&R |1/iٶu Q혩3' #}Ǭwzjo,w `J*0gVIȺ[>}gwO3PHeߥ0ؤH "e6FY|pu;P !#4?$JLƦrmTW8XOz+]Hcjpz>z4 4$qu?ʊsz)uIbˮg#a8X *' V+3Z@ÂjI&(TQfv/Mq W q4S]<.Fth`T\p5c[`F9 zIm<;РG7?$B~an{^9[J^gX66mj$'42ʾdWqaY'}016R7Gu&`C;4nmט'Sm 5NԟBB {M/9$iU}ӜRü"L#O]|o8LTC(kH  ?vpJ9ZBK7;y|׋g#FRm`]6>sZ֙?sg}~<"^r$x.G ~H^ؑɬ\;U ;t S-/DWX%rƒ )&-GL+:z1plYCT~z62 j}_=x=``dG|7I7>^ld<p*׆ؓ,) CP]ЭWܾC6h]ϐjWIQW7nx>?m쫜(: !~1?B/?t`S@>2$_Øjei_{o\8:7I@~e4<ς5c.DC T㟘RNKg]" 5S2.(iA]D R#ZVv ev`^Tmujh̜2^M%4+ Kᖙs=|8%„"|trRkVJ).!@{: |'<~ū ߱ wĪl!S`(}_]"`|8#cٴ8j;"޴qծ&[h~`-&SnMWa&Rr5{I rvPu cFHC#>,snnb擺N_ 8 iC>XCVS3?D}/čfkiGTŠw](V*؉R0}!K7ȸxn Bu% pc pET-xj{b&|hjХ"9V5}J $2h.vCmηItAԛ+RdY »x{4"B¬H˫*5XR𴚺M@g } ǃK;yD\9M<>V~7эA }R\{3K(RZwrug'c_kA$iP@}puHLZFO@s26 /UY|s$z[ᨎŸ3ga:BƢQοXՍߍ~}ɲa"Y|b! Y_Sew e}yw;2"zxBNPzh W83I en ݶ&ڱ]w1"40.^olYV2Rh3cnpP"IU!>p*$w_GT]l(%_uR3>;[W0ZZ`kGp?k;/YX=CE=t` j=.m9ka"ȏ4pp3 ҹtZdDx"P/r+t}2dN=̽?: T r_(W ?LOgd;냪+6W6Q. NoIk̗{3[#R?1DyvjLW_ε`i_;2RF6\)GUG6Ƽv?,"pgTw|Hq߿vΌϲu#>?#R,U쵽L>tzcnoKlڧ`r$̷SIo`N6o@?óZWژ [15Q?7b"s~W e#(o.%NV;YѸO7Fׂɏ;ꗯYOĬբP4k˶} = "ga$H,Xuy3+ ,̐T 0}4]mPm8M̲^viH0 )Ȯe8jh4!4߼ģ)(Tp3<25:mN*X\*>XTJ9 Oڔu2 }HCko#<Q7݂?1v7&Pp:nc"]pwσ~wE@=ۗ!$tCk%h#$ \~QVrb!g_jG6R\FPͯf[W;J.MmTe FdxŻS˕fB* T·bvfxFW²ݰ _i뺖oߒչvIBΖh JD :h ָ-SqQ@ʑO6W$VN8ě>PU%FΚ M4Pʝ떤'u]NrfG)'JH`Fsh $Dbb[ٮI5@4ͥ2':5I-_ zc7QB˜l/켋c zS'AU/ޭ?R(r>`(HsW_ !i)ґ%i'{qPh~X<>bBU:cd{ڞ~zH4]zZ¼;r@wݱig17G, 1]UNd5W w*(̶a0["H2Z7@!//Rsx_%() ;! :c3[ozoѬD4(uEP(U+e\Ƙ.41aBOCU'צ񆻚$'P8> yioԶϭU.Bs b[N*z~F\jvBwAZ@qCoDfጼ&Xq ȕX`}og`;l_>|rHy׈~t]#tDWP' k ~h*“ܚVGhkcd荋bkA8fuƱp&d:L <鋛w OoVr$l;]#A*t%_h{ُO56ŕıvṄuglD"<dZ tuwMt${rbjʽ&F$ `q xfE d7I,y7ykAQhBJìi41N?~☊0TDE;f+w$tzto1So7dv=:=捒|m VvN1Ac=t֑UnÄ4bUWkG2>ӁaZ}3²"w:! =fcs6p5eV:qD=ბ_P+%J&%5q(ݜAnm Q^u)a.wQ8"cBlE XZٌ[{GAQѶUvv3Am 6EDҳ]h]s<v^JĪ\7B7w14H'*=(ܴ?̲+()YV @T4MQ9v{}"*$T,^ :Z\mGH q,"rCL99NaTTbj@(>r:S0Ňi H3N`sÁ9C_:JfU#SWФ.9ZSՆ:Y`g=O 5}=֐Z $ ,]D47ʊI҂-"SgWR\">fI%.`_{fIΙ96h7 mw&3:;Q( ܛhDdzMDb]U.;#J!m W+_%-Ce4Ȟq}^XLe7gZd Xizl'yCjAk?f=MzD|Қoe*t`^q`i&\bs !Iq#yhTyBHnE+_0Xn{\Y5iqդѽKnb,{zrU`lfªpgE8ä@̲T^D7^"kh}lnan"aDYhtH o0tK8 SB2 )?z G$%HRM! N6*sA B~N)'(>ҸJ0&!FzjlXm5C]OIqkT^ӑ0}cP ߖ|>~{C,jscIBd*K`(?`ɇ^qb} _(=NWn7Tݚ@U>B gH)U$W]be`t ɢZ8zcucet wݳ5pܩ:@},T/04>qޛKph^( Ӿqt>G V`XsQnf.B&$%/b"z;k1 w(ݼ5ZqEdKŽWieREڤ4ʴF(/R{+9T~X() "];"D{>Vac}k".F?Nn?B(oEZNChtcy"M.nz{x\**[J}>YfBEȭ؆AeWk#:T/ -y mel|A!uqs^?Zԯk: mOP\WzΓ65Ba$WsA6ԵnpMܨNս5h%?ͬm,7=O8/!3 i(G$~~_Jƒ_;1OTU:Fx]yZh`u"]4x1"| >=xpYk`<3!`5ԭhVoЙ5];%3֌*H}Gg 25Xx[w5RƢ<+;;XCg|Io$~gߔaGa +βu$m3(,ߛ(JqL!d)P\ctI;vs9Od2E% OSؗ&J}6-my"ҝ^v/OKkM8P0L+/Hih -GKxj;₏h?2z;J[:Ӻb%ug O=W BɯqڙԆ +Їy&zXVn󗰙1 nMjN=׏!zz$Nylɷ'ʙzcSv>,*&x1iڑ m&٩TcFjŢ]`P_l!jI]Z0rq!sa3&/KCʕ'I/vY 鈰kzyOnnqp0!|{zK=(UJk/ZS?!ť(sEd=EWY 0Vt3QS•˂ݬ7 'ÌXz'3psٹYр0JPs k3t^xHg ÚC+mM,fZ [; 0|1[۰=v;dR| P>zPZPDFSq0N=󁲚L{Q%Vȋ ܨ:Go C˂<%5 urEy-~>)V]"\I=U$yL$*- lWW5yT0coS=%5Q"MX47AZt\(DRbr7w%D{?z3Mgt꣮i" LĖ<9KWS* !#]NfvovZqX.-F RHSx* $QH‘@U},s *5^YqjړQkftU:(} =5Ce!Dp5׋ s w?v Lo2J)ULٮû66 /egžo6@JlnxIx{>N09÷CiWD@ھq^.۬H,͢ʫ"˽N bׄY2Ń^K¨ɷ/8ܾ,ClQW Ky<ϴy-e1isH|*|; Oe<) 9x&ØTL(lu-ʀhVh~Iqeuf{ MO9a{dj*1a/11A 8Cg" D7r^Zd qM6=L:ix}Ud9IacodVr76)3\iM>\Qik-UK8pX&hK86 {]hʳ޶~Φ|퀍a>ye}ʫ&1h}Q/ hRH ˺?HѕO+` nAڜ6R7L*ug<a …rqH0fڐD8ӷB(XcVCWrLJD烴Ea\FECŏ] j6X}߭[߬Ĭ3'TS]/ `Cm$\ EB٪wGLOFtkYo1vp/̂-][$|weoyp3`?6he8urB# 籼/х*E\"TCBe/8hS\j;/y~Q@5j,2b߃ QB!7FʝrՀfo&ȫ&3/hT A˹FQk]bf{@׌nP!P 2hwI(Kؘ1de#yђWQgd)hHn}c-W[ $`iqʣ!L_+^%C :6F+D_KU!*ەmcYiǿVENnhݕ`xWUN;.ۆ@ZP2@2V=@=ژG+2.y`dW[6J\ՃϮ&yGe,$ @, o$U Fq6j7%(\o)+貕%]?ܗ[QʧiugV &j>{ʭ`"o%rVB2^).gǀxRĜ~B4‘άh! /Zw`is)ڢAZ, EWiKcu2#ӓ!zm¯yARH?wEqDך!W[3;ԫ48SlʟXKB_ۗ~aG`PYr Z*Cx?5VYys~)z u,/hV '-~ϴ#[9OWPɤ}Br3IΠvqc^*~I:QѲ[׵.#hm* uEm!E`VTA59c& awaZ3;vtD?b#Xj[0~{TF.2'ĽLv.>f%4^(ud=<&A<4&61ZKCS>#x1A -CFܠtX>?,s0,ǥk+DR<[)a6cfAFab|OED)VА_?7vh3<`=~ytiqkNd}ItkóÅƠnr&~ z$A2ԫߗst˪/Цĵ}I< [=}?I `W[j>\M#)Xnc~Fm聇ӂW.YĖǂϝ7b䭡r U5C9rU#>T&'ݤ]}*DHIC_O:l먠=jYk ӎ/߄{yvK;%UH.{ph̞){i"[EDcGGu+mGTISe'+FMUW %[lst$%ɨV 0D֐+BCV`S{kfLE5req5+ >nOg_diMI]fhF}w>[D y)GX#q ["{$U3m+Dm 2Dl"Ze!G`PDS}V}C3=<*rySzX!`HI @PvB|Q?,0.Ş= Fn|y)q‡j5;)AC]o-[<)or2F) Ge!c=a?'50JGVf)u r rDFxOvbpE;%܀cRn,6t n1YGɴk ,P 1=ڒG 1{z$jTE(р/~.{z~6;pX(")DNG1{&*b!acm= /ץ=۶%1oC±S'Px>nֹuIA^}ͫG\&6=7DRRX^eZv$dFD)'[Sw[GYt0; ds! FȌ AOr8at<|4Ղ*y@HRYj>ߙvME\AۇD/*f|Ň$aXWjDChzvt^!5hyu9"#9nimw~V}͡ꬽWRR\"a"8;9giEcH+*鿫ݕ(0f*ď`4[ωJV X <3 F̖H;@誅j{.xf(Z;}y!XmOMǂpK+qS=K̉QtPl(~h0:v.&x t|$=j_5u2t]7U͊LT%/'Ct'R T}tT9tP,iLn5we3yX=P@Tm0=46W(ĝ%QLf@+(*{m8&0һѡ. f,#Pj eF6hf~տeQ9\"4Fw^T)Oc9jݨ`BO$0k=ԞC ҏs)'Yb>y7[,3l4Ή8BExRH|dA#ʠ:T7Tp"2ã@PP!.jGd0jTOA[>x5`/c 2dZM69o*V!LFN\8Ę|h(VyVO(Ƞmz_c2 KD:ۆc ǁ#!T?búBl8""!:{*[ @`MnV\an+\QCdrtROaŃLɎA"C7/iI2Cʼn`}Nj~2/-\ pNW)gEG\Bf2-n}4pA_ކU>NPbצHxZWA'37eFjJx3 a-Lv/}Rmq(AS}\r^Dɸ((UDU|5KU}Y} 9*!^Ӷ -xQYA_o孈mwDG O9tx*0b^ h5 ƶQ2 GB /53׉@p p~WW[OK_XnE>܎>=Ь"r'?^EvDFf+UwxvaΘ(GY[թnZ41{(V&&D0%|S.{?#%u ԘcS6IWRధq܆㺜P3ۀinO!{`vIn(Tl>CK@ʮ@7lάi_W9ByQ&}h eh3 ujS'fy^̘'#Ɗ~v'?Tldv#yTE#`:asˆI"rchV[Hx{38i!990Ɋ[fZrQ!gYbėؕ볟. S><+l|]i#M4𴃡!~ ^?7k;-m z3-8ڵX CI:Ѫkvz%:nSɡ6SէNY]?.GINUoF|.lN`HE}T$hd PlHrA %0cPB4 Oa?(%JA: Q[a+BORr6)k[TL53ZXmtVƨ&ɍ|9Q\hu]r)Gټ M33)~ uSJ?s#*Xx%am IlLnE3b+Id(e2Z1JXe3 ?oުn[F*U>fZda] JSm&@blh_ S[zsBih}{>j!)u2rb-6n}Fk$s^*8 QxӪ+وb,"qt7H5Fa"Y)Ν3EtAOQ΅VNahEVs * (oҜS& nNI9m\JѯHɫ3/2IşXA5NIxg z+h': D6*"Q_p4U>?ƳA,y bN8UmI~"&7D !D\$ig%<@DVәwpO jXl+Sԁ?4 6=ǿ<(m3> / MS̹BZCZލhQ.X^+/[jlb w3Qy$` ͘ 1 ޲$x0&_h\YoNS&v, $/}w8 .JE;Ā*x HH^k019Y~DbeA (Vsĥ=hC멡M)ϥhFDKOq[H L ;(^LߞBQ |<ѻ*&XTSRbRϹ"_WPƙ չ>he(΃s[nIl=oC׍^˾JFQwQAqYc 9COp ~^c$Z"GaU@ E%32a9;օ衹J>~͓%E8|-|18 " :gˈhJ 4o(ydEeFJ3A;u=EܝR9JPvENHM3zfV¼jfȳhfɓ.frz墵% n 0[@D7p%L/+֮:Bt<*:DAH1-}%+D|sEO ,vŐD=λ-5}Bg#k\|EXya*nWUYGfp4ct V^a<_ EK_-MTCd'f_qI}}+1H~GmqvAƆ0W5 DʼK'=R#8Y"fBK[B\ȿtb҅P?J uUws9yILP؞)@cSib$Vj@=t Fi6kN|.T [S~i*DGxxGLo>]6j3fћva 3"yjVf/ H#c@`/4Ίr? ƛ0o͏)t+o>Ik\jz@k1FhZ2fٺGc.0l7)pO).k{wZ|~ϢSxfN􁐥_͘#e80@!peOWUG{%h)ex QAݽ; ¼ooѓ&UÙ6|s1#jI"ߤԒ`j1Jt֩v{+Wy!m513k ys tL$~3=|Z#겓61bj54zͅ*j!#U42,Z4E\3sB]1\\XV#gUSp~It L:!IPr?yC.o0oZR!a*y m+*ʸ"0`zg.c=$IV wZ?#c<e+(=bl>߂=ōLእd*R\/!y91;OSj@⠿g֓W3A iy13N6Y{3oJ\Θؓ%ǔ@X׮]*ӀL}*]ؽhu6:[AY7~iOi鿤i &Cߟĝ{S?-T"ZϘۺ #n4i#*vE!5F1^,D^*CaVkS@}f_-@/(M>ʘ*>O}6vJ= N71.~e$blV$bHlqj?Yby^R 6C"ay1ug,>G6֫"i'»ǓWzLsFfy-Y ]Ylz .BW|YE²uT%>TXaIU6Ft&{ŢR 5Ȃ3ayA&DC8e:H?^CA?g~8u!Kxߜ^^l>f( f"le jXw\;oy?堪/z>L-<:0RJk=C\7_|)/5GY,]nAM:'-VK"A|֨ ^C_ |M\vr:Rm{+f4z]>AFxoE qjp\grp/s0VT+} !D+=ꪠ)so[oK*e$r,%ͮ6 TW&\ǚN Rb=E/(VQ0(q={nw VcSJm(c#, bI-7KݴfZufR{JJ UВ(ueF@dXlΟ\:jr"G4(HYe $q~nswj }~6c1(j<hZ|__W톘)Ҽuwf;捜%Qo៶K%k# vhqђ\j퇾oh=]6nHR`hX7eq DN6.ϖb) aiZ[NTm`3y2k2<6 sra,,Dx]hpx9W"/Д4; 7M2QܶV_0(uv SJK޹'&$YiI+8U{S/7$#8UXᑿ%iYfw~ ࣊zJ=; ~k-@ZճGRy6J\Wl2_paS lfF!kC7cRY<,i`g6b>7#u\֓s*1O.{ U 's4Wz&^PRoi- 8y5 <}}oi7 n*\!_8ge\0_Cނp3˨t@;ӶZ-#~/a3 [<==Item3F#y0.lÓPכFfhQy__^@~ S.~xj OLnm 8ISkлjsu[UB%ɿ,X^ܲwm2 ?f06F 9&ыʖ{_ok?{ETIo>7}&J˒(T9w{d-޸D)&y{F_үVbV QI<')J|7T8촾!*V,$Rl-e I@da0:LisKPjzFΝ˸gd,a{Е¾,"(\!dzSWr36#ׄrAtM[kDB(Ŭ{X`.pdBE.}ɾє܊̠lZxX\.:;nI L e0nq+`1*=٫|ONGW~Leqi5ںi?3~`U5kKkE_8qWZ -{x4#w bjo/!WOC#,[|kgCj}r mSJn1?nu/i;۞R-d^D$q$RIf1m?ΦWv412s '#Ԫu$p%/]WF0W*MZ&Cw_1T^ŰbhKFtvOAK85n4VDt)dMhI+P+e+8 CvU'Ab§( mc|úcG^BJ8YW=/3ib>";Pgl& );@Q]o.y2}NvXMp6"1$ӳKgo^?Uqq@F >^PSS;m!CE&Q_Lѳ-nQ[l'̾>1!7]||2xPPvn > cMC~L ;m(v5Č<9iO>^O3A)܈zzc;oj\2o ֹw (jF_׼E+D  ^N98yǢ%5~IH(_>?n (<^H5%k"No3ebIχnaX>DW)}!H&AN-D o: p ȇuV3eWWƜIO^&l/莮4 r?#j~>Y ogtkǑu׏uzԨFbzlDc/Z9N 5u ϖC̲;hʽʖxD!l K@*Jt^a|13DhI{SE%D|H-$f骞33m2ˆ!"t鷾8kqzIѯY,FlGx\Kɼ# Jt ff3?1\;h0̈́CgW\H]ԇ'YݧNfĥ1\Ofm@76 5XXDzS*2/V]$ xDvyPd!qv.>Oc\mJkl-_a ?g3fF_⭏|q=R} R?M6ӹfPG-}Is #M]p:XtjJeH,Bܝjʒ_XŒkd5H5Ky&QmD)8Km[vfO.S8%fS 3,e* #7`X96`7`eT]'+eTR$3SګUc9r!_dfYp]O}d~,7oځDLM:6|iA Ki$A.A&*x7#H~}q~_-fKcz\z3 #:DیV>O{iqnM?~O~_OCvg{|ZD1# W(~t5~ZDEby44bBT@pUb{60$.KQ2ۿ)lTw\F;|DwT1_jU]em6DW9E&o{(*~tfܛbm!_GGOel&"I5(RN ~f=[$t S@ho^%D9΋x))5/P~Bk 7ɭ؂=֍:!-]!"']J#k2R)nn0o1 Q\#⻘U:\YG-Hznݞ|\Hb4_$QF3 ȼA(4>RKϲ.,^جlg)J Jjd^wXG`yԖ vܭ47P3@c&tG8lBhDPbR<#T(s="Xxp8Ww)ГDY&֡<Wyst5tE? [LcmQjyq;pZ_1&L Sw9^J#f : N'+%TE$XǺ#d!e#"y}=OүX.R}YҌ8m-N_Xkr Q6\0$AR4+,sX mjJg5eHdZF_2$H񊹓gyD{ԓ+F^zs?Eԏ ¢nGגGiʲV`Z;ҹCQɪ OAH5vNn=}"ğ)fXt8s5}j-dmצmluܰ\eJ6 @&͆fV J^0䄜 蹠~xkCs1tv*z;/D);CrJu8Xm~뼫^aOY;?B XE ĎRvEgP`A΂ ݃pYtϾMx|o.ᘀ"ȐmFiz"$Pŵ*/gBs<IPvg֎ bWo$QaK#i~E] _Mo y:sj`q3wA~tTo YWm&C*VD!gg(Aτɶ Pѻ =<x'9pG69*NS nsqR*9l Bu>}D(/j(P ʺ3E&2BVtUS/PrS,~H _ZRh)'g 3e7LTͻc/tI}8xЈw(q[^TehE:A5X"5wT JClIB2G"$ "l=%\sJ8B7f~nE'\tqcCDmeH,9c"GncƐeMPuЏUW4!2.4G7Gj_A*^+훦zwc+s䕠1+Ͳs뚨(ɱw4#CD $g{ Pyr-*x$|xKj ֋5/c4BCyfr421Խ >>jr'dZ1 Qnϳ5eG˃=Ӡ!0xtά!- f 4{:֏ï E[L$VFT/wph/b!vz&b.ms(v6&qFu@mBE5t=E)>vw= U*eliy#'w OWE:ÔC\K\ŷx')˅m,S:O#giw"׸M/#@ 2Uor0Ȝdxiz M/DT [(VjBRxR}b [)4g916s!}SS)-=pzP%(Db/ V⟝$V_,@V4$hʘj`sNhžI>?EټivycJ Su24}?>jyaӿr7F,AIoEK[O"^PtqPtޛ'ISbb "La:2e?L>o"ԃ@r," L(バsww9u<> ņ G-MQ[3_i`S>J#`ނrjZ*5x ~$JIGyC\f_1 (_C3Wc'c#B^]$Wf1l\ftu7\cH9d ^S Pa&< gU?bj{teޱ%g PΙ7 MtɽySB˗e٨#/ȺS>/|JC`ls߯K"$`ƌ(&EuT@hJ^+OMEcyFruia1^:6`INȲn\(矛AXn@ж߷[;ZLǾ\ywp9Vd(@j٠ۼh!>toT}gx 5+`=hjT(D9gzTgYm}\þƒS~]O;a 1+W`kZ{C*/vyC,gEg! "4ɟ~fCpuoiif{YLPc\<P qY B."qj}:x~{1ѲrmCl>zT]FZ6jZz7myL;h.g b=|*8PG vR sZ\Z1F aU${j{#IjZLI,[H-p"e<Y|l >[;.۫J ? ^O荨؄U. KtW`IhŘA|[ȁV7S ۉ6}REֺ"Fǚު]hu}mg.&5!_Irvf e6b;Kaf C6XORtvZ_>::rq[ƇMΛ?r_O%|=@2~? px\ҺP8})g9u/v q_1`K];V4b:3Y!~zpge^H6\ [ΆQV4;ZO{ysM r-HX֧S"u(s ЦO#9#29@c@PBM9*n8UE/`-T3`@ʳ!rY*/(G¸:T ](4zVPL3][17 x!RegY/al_Fce]&=P B)8'''Z<5sPg@g7S>E˾Q'gR~RvVpf)}_}BFj_EVzƭ >&[w~UPg'^1Lob2hh²*KwoѳBoelf>kRisGi2N`ʸ:6 ciEŻI$= h&;Y:H H n3#"9alJߞvQKcppGy$r(+ut^k7qG y v ^0 aֻ&R_!j0N0FH ҵsGL9XPT-wnId"tؐtAt0.juO:q!dҹ#1\IoǕK<;seRUUXE'}t EK d9Hc!x]/:il4+Uz/j L,9"ZC#hA?a ]EDd xpu 3٨oIG}: ,r0~GhI>*R'_˶,CuH MJ]W>xZ9+rsm\=0;;̡ySd l:oPbPek8a<.&g"VCO&'Iꃣ.$rAFZ-I-NXǗzni:\ia-zC#}]mi|KԄU\(SAyv<4JJ?ӓlTsӻ1TLK "=zEr?9ҁ3 WB<+4c pGiPQG9?+Hީ>$ Ԋ)7 qt%HyPiUHnu0|W}%w&yə+w(@}fA#qQ-nڛtq,u' ڬQGsWcMf'L㾴m;,egiduϴ+=q ZOSC],갦.hf43mܫ1p EYpOFv6_vOHSJ D ZFKu&Nట~!~B;=wDmކVYs}tu"$4q*@p>^£>&}~c:CNEL2է{ϻ P-7 WR|Of ?{&D;QB]ʈ-A*١]~k"C:[ \v+B)mq9ᇁ,=9A7ktqv$'PA6B7~YW diI;. jٯQzp9bGiaJDy34v.q9{4ccxE{{9TDh{mГUWGMAd^v 0!=;?I3`C#qWfʛ+e ȸ[SvgYp=6LJhHTyn،(ʰg *7M"kV O旝@M"Z]Q=4Nb绘":wd /.a~S&3=F?&վq{k'\gL`r[seQ|,Qx<u<*C; 9}}3z@)tr& Te5N䕫ZOnd#($"S+6 S IP lGY1"_6!H}a|#GYI5GYȢD%JGzUaVY5}_ VxЖkJYkVkOpkd%fG$s^򕝄HN @ɣG+3`6^~8Ć;ᒎ M n)}-WG;,k@SMCc >R "a97P -Y=̓F@ѺGK@LyXY5Hw{j#0KqE6"WRB ˗O*0l6yg  eJۮ>U6. Ŋ ]^Dd` wp!5E7RfyλFJ#Өg7"2Xk"{Sge垟m!^UӢue[ ;\!kxx&G/#^[;qM|%w8XmV/נ딕 eE/%]aca&\q0gO!/ :JN䎙|T\vN-PX6-m:0욖[C%0歍~JFy. K n*u[8 ]UFQY\X,4˵e?Ψ̐\dg!3r[LBIPTY3>Ř8'ڟ/kNh:q'ҠΕ®`d_G#l'A`l0ն7ɲH=Vg<3/Vc?}aYv>MN+7]Y ZD(m> =j?*&sI FvIZP%mvb(ǨE!hfd_,3Yq.v54o+U/ ksLYͨj__ۏdMjA~H8*jKD^>?-Y-Z p+)ğuCL%\cն&Q.L8j ,`.s42V __uT8\8? A2][i!o7%y ׻mrHQI={evjT`y>8+%8fLO2L͔eޜ5X:̈́|@u&!/p#1n:]`cY!JI^[I}$Aջ]JM=ֹ7ΟHX|0UәI]sb 9>3=M[e/WNh\CG‘#s06ny@b+ i:ro:~$1K_Z$>0 '9TULjezA&v1HL =X|,or[8!b!rH,"l}87C$u:LV~PoW+D">2qZ\)kábTE}$^bC{28bSܢ TL'Xm#Ljvk;m?󽁤dG٘3ſq%@ G C GEj!T׵ ȉ%h S {ftn-KAyB`?îeۭ%%r#iŹv Pr-QYމp>#aIvχf] w1OQ%NW*ߜٓg'75m*cq} eeR J*rߢц/E{ lTjJhʣjȩNteSf4,.jBf~ڮO|2{8)yZ:I~λO)$q6ljV}t(9\kD`km.`Wq(u<&XK յE0X6R=I4r׊ht751WVWcg6M]j5D$l.+.rU n+1:)Y/bUwW έVn L[ 2.n{ö& ۭGOTϾ(ə)rԑJp=}(]e|Կ<>~6ew@&$Ȣ{0 6#exkS|״L w>#S-!VmN).4I{;4;pCO.EUq0\5",`{3m%fVj'R'_Zxos`ڪɇ4wwH"D2`z@OZ:JUDʔdkg&1/Ow9.RkZ ,#,%*Zx~rs, Ȅdl-h(T_tИ1bFMҤwHT-Ix+~K tMALQwsxzY؞ 4B[N, ꣶ`T`%םQ}ʨ5=֩&Sq3]E<'\Hu-D63,i_g^mA}MV=2=*W: j̀9rBe,p* t 9U~XR2k}0L4%Tq34g"cP.sخĎ2\ .|1kfh$Ry9Zfa?|OK/Y*m-e_-Zxշ(.sYdiIf:yѬO*^0my[!oc7\ΖBtzHEã@?:$# CUdmA6ݱ'5JC5ț` O6El>~c)Wד367ܩCq 9X eN,.%ﰌzT`l|7^ ϧOQ/S@=7 /eŜ>ܯ}b± k] ^'OKƙ̺GW>H}Z2TL]!Ub?? ?B#+d}|0^x+ {Zw Gb[RC57~ iw7H-x0L<;4D8P$v\50˽n`Agu*lmyUwi, .>vO^^(FeRI/9w4^Mrm;!wdN^! t>c\o ֔]8T}q_לYUPL<¬GPaUZOi[8uA0mjMz/h;:o HG~;w~ $xZq[L_{ٗ~*XAQ%T$(+?kR\vޣL mo$k*K6PL2~^X[zr-6: Խxj6 Γ؛ڷE^iedB$Q_"]H8(i~-^D<*d0DaBDfe* !rHg73zA#Q;p藆)8[((_#&u-\B_v %Oewj4dQ兌O+^#"Mg*Qogn)yY>,9\W&ŊaxT1<uh4ƽ; S#J {EqEhnMXߗx!M( 3;0z 9 Ԥ4 H#Bj"g1G1Ek5pf?qM XΑ: b2XJI\ǼXBBO )Whl,(e?c_ӅO ;lˤ4 :$3^N6:ͨ׷6]{I%od2 oKd;CĴ:P*$M̈ f/YnKuk0ܯ݆W|[CbH%\n ]BͰC3gγإ&lmwMHbA'g-\%vBKtb.<8iXNW;--M"g9˄@HL Yg1vq-Mr"/Qhb+ gR4^_$k6𻔊~aЇ}tC:񙞬@Y < 饥i*<.)Sq6 VuYKMOLaT(RޜcB.cyE (B7 >Uߎm˯.!ĚGՔ\'CeP>\2W1G|=RcwtmiA"{ R6+C i[0G^@YD !"ʾA\DW-ipqdc'9zSph9gVq&l/AV;RRZOo4,yYNIxQlj49Wm%|XlWV}P12qt. 2D^FAE&(C< Qiq8<%h=OgJog ]).7 hWVh!F o@!a]Qm,9O*!K6>eWɩ>Lyi,k%=s)֙]7Y=,+d|@'NI15*VORR% ݾƧ3cڧ' -o ]#* w[ݪBjCI[Ɓ!?EV!7XvܤhKDFMrmwr8Q>IJ/\$<ˢc-(*!e`jj&+CQ Vf{1e{#OyZIl;k17C>[!ώWIǑ=ˆỾCwa!븹w-QvFzL$A< 6fd3 ܥ">'v"-Kz9ޠQܧ> (mPn[*#_V xor;Ϫ)<S{!N*Mn ̪zGݷyͬpYb,kT+dFJ1t %AT2>NOP2QKT9-S.%a,F}Û+ڦ3( 63.b*^ZqD|fN&\q)nѦ?cg b̥01Pn"9Wc?CgzҚGE0Nl֛m6Iu; ̡,mrj5i[9MmO[,:HQ llՙZNH#^fT-k`1v҇>~{c1;Drde-ӷOa׹Y0sG_jI_ y21#]\ҚJy pEyVfЗ3jJp֖FqdVm)tnT9tG~vQK)čiWޖiA^1 R'C}`%VѸń$w=Fxy'2{4#t&s'!7ўm!Z#hEe<e޻N)Fq  8u勩5fX?&#P c(Sջ`a_`U2fbLUG%g^B>%z&n6S;=w?ILGexnHMW5Z7Bu-v+dLޥ^'jTT*Y!֮ kB8%Z_`!] Y/ ^ R-PdƈMZ G kQQ蚠n#<08k_#D0WMhD2K'v,4lK>@IX*FCeHqz>o^BqnFeCBe:^XLS}!5k)c&- 5M(1V Ya_Ҩ9sH"lJm*q3.Kׅ}K!No![ ::5Fkgg*Ml„,s1ʸqN\ f;s} 5S7řPQDuiW D(1=R7,ż2`=D'gSdᨐ>LRY/ f N "@}ڬkg{_ hz}fmS`Sj.oq鵔7 "CH`d޲@3mD\ `忇4f@Tܒg܅X朘ҽ 9YL^ۻ$)Bi^ş0\'DS+ZO÷Yr͠#B f@8L.m#Ys[vμ#JƏZ3j=R}5Ճe+X5De̅7^$n8k HfT{9v59ө%F`b^h+W*^8AF)N3Ʉab'ɤ鶚oap =jpagX'\@)m2+2 F Lo&XM@6Iٞ+#6݀v'ܑi0U~"#F]wL"T#̟yNt86b}ݯCǕqr|j/mvsҐL@lսPo{3˂TZfy;(2ێ)^2wHGjmEsZ ݄'x[D9jߗ!qMq1{D.16S<+` ^9WxӡQQV|\2NMBas*=4N#>qn6Ѭ*"9nf"D:jiƅ/ޝGRb0_E3hmihK¶.`r FCGcGcrXFdY|bKNKrwY 8]! F=y|eߎ`5!9vΐ΅~~`K$"JՠDlߋ1$la*_,g%٥7qK*Fz6F)qguD^sE8/W3 L]\Y2źFoq^F|H1'@c&A]\$b,wzuE;TWOkpE!Μ'oםzL[ sO3Ed%tB'<ѐ=tyTWxF? + 0PSE%>#栎%w"xty.ȟNaNM k~8:Չ; HQ>`7 Pϙ5kߢK4HuG-,KDK=JtNVF fj-Bm o5N(U6G]fd CZ/S#\$b9kegg[ ڲ'"cqT,ǰ7]FjcnF, jACu9NE;'w4-}K Bֶ4>҇ p=YS=~EX9, BLQBevK&xVx0WzvP7VqR:2|OU fEEgooG^`{ENWD@h|[toP˓):{,=>ʶȠB;؇\1Xs_ R]' k/AuhW,R7-~e1bMlPiI-vT}_kdbMh!)l#}{WI}ϳOVINC%4"hԬ9B;!!L&ĸًk{۫>M|+-y%}6FӼ q'##vѪ~ ϛn 5ׂC3 1%~[Uscc87>_=2!!PcoPN5Ku$.֬~!o #Hkp]p_ϯqp=p8llΖb_wK@Z-{hb*ܮB:_vnmIY(FZ~3+Pōጌ̙WS,@͘ ]nXN[ٗT )~scTGIɹ"U%>@֥j%&׌i֭͢s+rݟUAfI|]?5J.z¡^׵"ΑV'A1pU B޿z|8*C 'æ S |u#N̐.guJp*n* 촸o\}dB~#y-cWt ]+{FuO7Tse$3)%ma>J$Fuu]2Z`cȻ̦(vL@[4͎( C\+ ^DGf47+Է&X!-NF :_~>Dq2 ǘ5%7] IUN+Lo p?#i;j˨7?,vE)jw3hb@|1K`L/mԐXSZ9{D4mpП)g+{nt^J([gZ '܁G,=Dpj6% /r+pT.uee%? ܗUKJh#b!tARA|6.xu#\ γXyQ1Ugl~0^7-6_&"$ 3\4vj{_j/^V԰xHrJJ1JyrRR8МxnR]fnA;U$MwPu x"e7;1VDgܴJmϥ ' 0ϠLـ+ I聯*>/,nyRN<3. MKla+TgrXkgCO-CPٛI!OOLCDI #2kx:eUΡ"5bp6<6~hM6|Kaؐq[ga9MW u 4Uey02 a`x. <d}on)/3YҒr rs}_ZVyݛr!5tBCv8Q$ʒu/3CV_pL`и5mN~B;vF4SWm@h=41sIΙ< >sĻiʇA涮..gg])/sBc}N3|N݉'[O+VΑP֕LPAhzx`1D~?~glr8/ë2 I,3i}ݪ:mJyR=;A(1P&v‹Css5F=O!UOW\Xl5|$&Xݷ́i2k w8)yiXQRƷh|%fY},z'A;7R0"//cGmhպ/0]kF`L[por[rueEJr(LxA:fHN]X`^|ӭ5.B+u_=~W_WrZvybhѩwk)[m8|siu&β[BαSnS>rd)ct6اxJ:E><|aϼ_qofN5:O0ųd𯯻ʗBwjϽ |?C!{j55ڕSZz\9 jT)8QL85T*:) KP`0$$cy{®Fv=Ե4OɰW5q\];ii^ Q BH_5OǀF^L]DY=xԲs(Fxt,)< KFg+dYCH%>bQ/ky  Eś5D:!iT| .}({zuCgSLtLb(֭I&~9APoA wr 4ТY30` 1KCѼ?w Z؛QuLwA~Jv:%k;s|͙O䝅Ile%vZks)) n+MviNZÔvƓhV`hQ"B7aG\Bvl HVte|z d Eᒁ* Y-"5tK&d2y'yMLW t7&ց UNxYV6h8]U}{Yi1nƾ<#1Ǽ'`.Ɏ?rh#i {~ݦl ~g3|&m̤kyp .G0l9°GMn3} M}[T?@Nh ,B`W aIJ6 0 bAS_x ia ue Yj L)VkhR`qbz^ uȊ>Tf`Xo5|r3*O]Y:$‰=1y@4O4*Mv^=/yK+S$E:fnY٨kcuF-jXej=%g .SeXI!qg-6{ob+wVTQ坃8d/@N&:+]3%fy-hJ)5p3Aܜd-B8,WDksbϺY ڼ>Fǯq7Y Ry[DE"Pn4Cu Ipo$ѵ3ܤdz-uN 꽋s>rؐDҧ&wO|#mc*R:N{_Hk. :Y{Pҕ O/zqjK.Ļ_rƾ%ՇUurI~)7t"I\{7T˝y&'1RVA]mEEft9B5b}~5Y-|8_D * 3p#1Fb6["B,pEA!ɭRUmxuiZQu\>[3wPie/ `] I1`swrۡ!-uh$t3-#}H!O2lcf}{w9KR\cyD$,uلi]oDѬa^9?⍳hae0=u(0UBTh <ێһoQIUm%Z _NX7bBKAd8Զ͍opA Ij٦d)hľN mί`ljC+50+cNВhZS-}9Mm.pԁKݔŻJM"vCP'a22%b 驔},$K7B%% $ų1R͛0zzQ_7p[ԁÅ^J.XPB!#=oq_&%Kc <>q>2HB9#zJ`&sF:97s-nO@Ed[2!Q 1ZxaQLgmhև3[=$4LKw.ii=YC t? jei?iљ*Pv+yh,эᯀ)9uTVXէz~ׄ ,lعD?R1qk/ĖVaIGK?gmEi@ņ+3]LȞ0#ۖz%-1\U|7eFb*gU|BFGqA( t jlE1!F2Džu>GtoUTQa㗆FSP;U݋sY.:t"B⇺GԒ:k/ڰ!+ߩ5c(A2ձT$!Ms 4 r8 7\|Z4PEuAC?E.,%m[Tyb5(ֆ`>`dm4Iѝ:􊜠Z%y/1M,ށ)ґ xa2҅GcF)$1F}:+Q海tS\@d?W.x2尛wt׶ƃ\cqC&ͷ梞SH YMym,٥/2 >4"ԍW!Ι[0B]Ztg|)n;iypu@-kIx)b;-P|F+-w GՠQ&Md1hvfh:dճ>[[*ȲD/ m3雟.D~]pbP//& l0CW29% V"$桡a't4= #E['Yh/cY H谉bZ)Ts(HB tcUhO?8w? lIh9BǮL9X!'54:mƃ+1~(j6>P)6 ~kVZrUNڶK9C*:<ߺ'f2rلKj󭞆>W=ub#x7|925\88}>"7:4S݌WGړOq@0(1(&2lp ۦSTu "P^2[ucؒ7ߒzq[m݌"B``U1 Yב}f2\q=!wTWQ~MX˳EM䏨)}EnWxWbHz͒ &˙(խ) ߆*x}d۲.<;k02Af XT, h}lHS#qhEcG~ۋ?q npTE Ƃ4kc23*|>Hwt5 j:p ٔQFrm?O4e3Uhcq FE&m%j㡦5DVH'E2ݼv*CfquգX}1e,*Wsh!#Y{#- ҂sٙڐJ^sz# rBF .p lP @er֣Q_YqLd(O ίa`@.تbTZ̢ba'J`Zy\ Nc`ooP9DJ6LjXx0,18}5l!TI5#W>:ꆒS^hQrRME%H=sIّ7OtŅ3 8k{\+r>-_:jJ7Jka}g? =XSF: Y42(Լ%(寓O5VȔ~ғH#[jɂ+Soi\+crB!e e6w.)rDGz7SF >$o@Aͧ./kب#xXz8;{h9۱y.p6֛35MkKV$`!(aQQQkY.1$t۾Bbje!eߨ 420]9o0\'=JMG)rPO[|D&Mvt׎Q8G+uK҃~CR=\=ZͳV!X^Y a☇ӕu `N"OѸbn/MJ>{DTi?t]a>>4eAyѧVo=xX:øؼl~gBc.>rEŽjmquE;R$,tG7C)."t\WCBJ)B0=n| nAKʦπcEw;:ⶇX˱8Fe-gHĘE? ռOT$Mv7uDVF /%@䓕CEnf4nq/c9 ,|2o]:$:(enc9$X@p5ٴq^BDq  2*ʍ"{ YݖЉMyj}9KbjHu"v;?D9{ux4IU~"Wq,Bn܎]hx{9U\c _{EwrkݢQJ\V P22>=N/L<&;b$t`e*a׺lhu)yR %d诵 hM(zzk\0NC !N)(1B*J⚓Hŭnp0UښD79LNDݜNvgJj6~ G!Os*OXzI!OVyWv=QAhRj|@(ؙ}螁;F-oB}ri쇾H"Cmn9CXl! C=)CyGSfחcci{&B~p3^`EcѪ°sӊFaiE7[l^%D ߝ!yCTKE~U'$ס[/."n*UŦB($5!8(Dd3E:ҘWpplt78TvZTmv7L3!:RxqكJH2igo_:|@W /V,F?L{D=Nkx`xB:m:4 ;Q}jF:(WӶ+7ф} @ \gT34lRٺqժ^hcuRirӊX"B9d)p_Dλ6[yM ROzI_Gݑb>x~+BێtJ]PɃ%*DtDDcB!Z$-Fm{_L}1@ @٢mw!Їx;"R x`LH[\B?iZk:C4[bTgWfV qLj0Ǖ'k@l䖫>I C@ rGߦTnƠ-LA-ewӉU 8\ 4H'ZK 7a/"Lpv"P[8~{}쨙aE^~nN2䦊N!,+1K9? Y9M2sHn.Ir5y3_u;YF*fc/2|~/ݛgCCa_A%y]Ž4&x$.'!~FzV_D! u CˇOS+;ڿ}^\tX W @K):R)<:ͱGu  KDFT3F,2j%ye!ɣxQ^~Е+3:Ebn _QD$R߳li*㽻VO,IOZ.oA Rn.)̉#ٟi%z}<;.FgR 8=Eco# Z HyՒ]Wrt2#C} ѩ57 Oo7hLL-UOV=݊JґD> Vo; wx:QH|l}r6aƖqcT'n(NuHv|ͱݧ'gHB`~2"xv=!xZ=EZŤ(:V3{ZUCJB{uT\ueDkaUfp$B8(8K+5e]=$J燪d΄%y?,V6<B ,qfgik7ڵ.,K?"ɯB3`6u:&g2a"\S#ЩԟX;v$PcC0VfA3. "Z|$vdJL$A9PBcBD9Q㠢ᮑF'Va)[mޮ1L,z=2f/f?FV>:μK'qHHN }[ǝRD1-iPJz}9L뻲.n2.) Ȗ#C@8kuGEx,z4 >9(UʗEL8eiYfpgLꓖ^0H?B}>z"o,YYj)֝~Kw(&8i@j `?q]NKmSTc[6n3OyQPnI74!D Y{Ih[4y-h< )R۹-K!D@mn 9fokgj5'gJzf͠Y*Uy6ց_1% U.EsJGZߢyA]W2 aqT']`2B2,|mޛ jYLW?8^M!75m k}zRZPj eoa|hfXʦtrݝ9krerY?= F͘ s0ֽl=\vt"[OŷB#W^He 8V{V|N쫞IXl8(یNB<Ҹ@)ɤ(S?ۃ\{/kIL z쾉Ӽ~`mvt~k+KSvOC=Ҷg;*r.`j7/Ie Cc#wħ.2jFfpytŔ[ڱS0 w^'ԣU 0 r4G'tr 3׆wҹlMӱAX6gqAS=PfO-0kc^kƘo!aާ8gNNCg[[[C<ُ@qَOOKCLΘN hv0ϋRD>wB 5O܁uګwPlDn0<@ @H'5ߴ ?~b򚸇ro.aqv{hq a,aYx Y\D'f&N4%k)cN4.PJ# ou"X)$̞Q)e27VtX(6m}VaǬmVSz-w Hsa * 2HhCƋnrMBuR=4&t!¥RxOK0Q]MWSLTHhMs;]ESI<;{yO<3qq>susG/ʴ(8UYGT|BPe>揵%D Q4<1h?_C̝ 9eȽ}|,<ъ-i9|Ao}a:hsY!bӫVZNfow&wIX36pVqtO M`˼9}>+P١D))φs\j]1WtH.bpLJ+*~_`_ށ"WJ qH>cO_G lΣߩU69MtJY ۗY}e-Q$Wa7zU+#)틗ʩѠ=ڔ+cdB.;fe6hwҕuS/S͂R#L᫱;xB-Qʙn%7χS*;5Ө)!<;o6cś<BP6V 9p7yJ-+l#勖3EPٹl&Vs@A[!S ]tÝ[CrM8Q]leH OB=~M&3W$*KwU0g )uvPUbKC?rbZX~8iy),rtC;fD6P"sMbs)|48cy0f_(3ʆh#%-]Y~s LW %l8J=o~=?2$qwӘ/5H*$/&Hcl&^h~P݉gDs)Jwòՙً5n Ƒ_;jDJxr0B21h|V_[ v417 6Qj}`(^VEwaQ2`ib"5 ;Q%XxF3^ zK<7j`3$_.Du~uvvm2$j1,P|zG<e?ؔ)9,tܬfMթò&pWž42-[c퇹FdU\r@貀 ģ 6&f9K!pehsRV 8|43$eDIn { l‹/~Hk =d@=>/4Bc{bᇜRɷ&;>Ut k0IՐ䂯fLv~tݝy뷑ro C{+XS1'_ȀFQ_BV3y94jYfOɛ}*+݋uHiȟ )|Ov 1R"bm m{ݤ_r:t sRd0`q+LM.@l6,(I1.jAo`zjZ'JA &h߭eC.Q Y-W1NzUM/`[.tHt[y2: > 4ky_ f<,eg760%ꇺ08݉r*Mim)'760*C5yul`]ۄs)Gy qELN_im0ʊw~ѠY|wYbY椺-ɜc2q #} hUBIK ƭa͏f°>"g-/uqPC$KxMep_ &^DМvەMҸ]!U4R/8 9%^EmPLA_ݓט%s43&< r?u:Mz*qz9R;,65uAߥU Eq9Ex[_}1L`W^p/ 'p*@.Y/xwVxvfv0zqa IESߍE4PfچD(":ھq5kK dY0Y,)ҏ|ײ'HbH-s]B0<ՓT>r8~8~""_mC;>hJ$X\j맽A}"BrT2tsN ڽ4.$Vo뇎?ю BcPut.B=mGh}% }QT*Y0T&R> Ƭliy+3§b7YґI,Tx{'Vĥtݘye 7k E- [f][le\dzu"$<*X| ͇7QwO$,J\THRȍñ.Z iec !w~f  YDP}bzBj ?xm1\@$7u:14%V&$u~\4kx"bJEYbH3 3h# }5RSZ=OF@Ѧ'q'kMO J bt͗4Sd0i>íi Oo`)aE<w҄W!oakG(: 3T 3;bx& 8%>Ⱥ w,K/Z!+Ⱦ]GޜiGG.U L["a[~[D&8@= Hud؃.1Jpq+O dЉd%,'фlcQ5&?dztsoo1CA)x3]qu@n,*=on=OHsHnЗ UrgxT§ly\d?< p2s sy>D?-Xl`³!YvI.Cga N-#_\^d,TN1ذۥ݆ 4Q"+7oHϝj-LE<8* 5M ڷk3Hp DK$}03WJ*(`ao-l l}v ֛]YFFՎǬ SlR+^4Z5s7]{I5:hRv@ضuϦ2tLt 3W|.n|vcbr)-_w5:cpvӠx(V~a)ia+¢Gy8[wח#4[ӿqT85&E>rVB~@le3@叞Ƙ1zdV. <ԸNHu~{ QEaXo#T=S+1#.ͩ]S=ѝN8h GVVQt1n5V0g^g_L^5vxk r1ooÕlH. MD,#͜lfDbw&x/ηh͏6^Eu&)Bsʲ+zutT5 ($M/ʫ}|hor%$Z4Eqw3}à 4ª&"%*H0lW/I`OiD([q5 G#/A9 aȟ߭a7K;`ߋaɓٱX0e1ni?,ٲ#}n,@ (@s= cP Gp1a:(4{"߆û12jT\b UZ Q W<O5nB(|?VBxXޒv~GyK W꺀Aԫc}?F_"Ǟشp%nrn\/cNJQ0!nhs<6O{ʗu$cZ }mJV单jrZ0o G@JyHE8,WOU';X2>#7Pvq]yd ~@cp a`IT #IV·O.Cn™EJm5pZL}TPMm%?3ի@_ޓ2S e}&`K,l}Pp@aMwc@Zh_^YYPҖ"(k y6jHaBϐ{L1@Tw^/D[,f4 ٭Qh (zo,jZG9Y幹= eOÒWցĐwf0"h.oާ]=omx-tSh s2aEN sļ K!w_^$j'#Mâ Z9xkQt3c!9`x6aqG9#B1o;82}_}T\^RMU.mGwG~30u.vfl&?]7f ݪ˺'cf`ž5@GSF '@(]/k IvCݒ:v4p裭-nqRv7KW?Ҥa>Y(1{vEϚb4M*8:0A~1kbO6#Hf0n[2QS̛st2%*8 "nbw5.CC%O'^0ea4d: L;bzē}tgtaC+n|←]XI4j|"Y׽m~dQIPV .N t߄e{,-Da:CjhTKB¼pZ^W+P,@sEu8R`8onV:^wڮi Rzӵ|B${'e{kkqM q`vp OG[[H`ۿ8A.GFA6@َ{'帊Z]QYtj*؈n|rرd#I+wߤ;[q!^:]l+;u8E#W zgmmܳ|By,%"B#6bX*wM:pI!S*qZ@Yfm^tWTa?`㖩*X.KhWV?r>qQ`_.p_Jp^[lKI.y>gQ=»ubGƭ&OF~*s.x!&T[.!d&ěczFsWmUیtPl lc [Xj5-.*L6s<ҎgUM!%yM (hiX}$AC>yVz~y"x0y F"z0N2[Z&o 'w.tTࡶY*ʫXA ɖOaCH?oeOEmƷOўМ$8K,~f-D-٭7d5y%ʁ-jxlCwi鄥ig#n9fli{_5oI]Ti;H(,xN dc~OpWA+wG Bq< дμ=P%/+Qbɏצ(2m2sIL\7tkRJ.L*7ԥj{μJmXR<1fGirnM U$*#$,>)BUy[Fl*/ W눞*& cPTʨt8E qɥIEژ vaDy4ft%Q$97:#1^_:J6ZN^V|AO2$.iv7v%q$;/S\BC G!%XvHkcɬb&p-(+Mj6oUk˓+$qD _bdy,}exެbO|IArJ%p%%DUcw6WInJUY=?N"\:YZGvw4[&'@(N(3%~m%\ԇ'd&hB(D !tT|`xđ4|z{8w@sܔ[9 bd/q_Qk]V:j Oc&{|p##SF< IK>.R]u@(\RD [Q(\X{p.d Y3aE80fuwGp>ؽڻOzk/i>>z@ wI&;/`GiX$|)]Ga0VIzȨ{H81N}U ۦڏ-`asZ*CX]xLS~;R5[gMq4Z>T XO?!{hVrC@.'rD V|]Ah#@8l*au٥~ꝈLf ʣ, 0-n\-|"@@iSH'5r/HFV+N[=J4t8krec7LG2K3.Y1ZIA:$Vg,IwF,fl:UKN6"ҟ {vܲ[ Aa @ݞ E9,$W֖chAQb~Sڃ wShjK/S"$l5_侃!FjpRb|1s. ZtW!×z/ 5lDxG7[/3qTwH(WsGXwPus)B=3m j w7_8e$>L[:?t( WzԜػ Łez* V_È#*jB%2̦_jd[6R7\>wƠ:dpo6x733v4m;:*U&B?ՋKVB`.i̇? zT+t_&\g`3p5ne#g?CQ<俀]f<N y5 f5v9) &`G G)h%m&js3"ǝ, gK8i$l?5% Y2kbs*p,oV\bSRd˜ia(Ge7ߛ%ln ,8 ʕ}-}z_h^1o."|ѷۙZroV7*>_rDxXUֲ͂& F "{C@ğ٬N)_XiLRT^H_$IDlC:MĮǕ_{ܨvI,>/ [cWR0}vCKmuVtr ?:oYBqqc`m2ig*9H9?3Q:]6ߪU:] rUPclemFB꺧#^!ﵪY%XRY3>9(3I +Rb"$IRf(}>Krp=.SMPPljVB~Qu z܁o;XB݇ۺc! )@nrews b9z5<1VMdV{H[vD,.7៝j#EMrk8@C [zű@x1|5^-D;B.&cz qS5vƋիW)yB o9g TUŲ:S~04=D[5O$UKP~kP_x,q=A+dd!4?!mA)`6 H6M WKF+Gk2W'oD5 lҍ쓃|cYKZC|Q$k@WM@¿)׺[ 'L%f;ʇO)K?dX5n9Dʮ5T4x/!}i anNָcmw[_2>y".ˌµ;nЇx-#G{`FY0La+H~9,4[BhĹ韾|d\Þ7/1!}e{xrTC4J%4pƷx.*٦w}nqulj`;&#l4$PU ~X*Wj 6Ü\+}fۅp ®ojvp>%E:0n6vZ<~xmq0:N5މG=1K)bٲ2--ׂ9\.mB }Wک\y46 ~Cqս%;E#6G1eT  pPj)Tsz:oOv*IIEԻFmqH_q|hX|xl'fjҠ*CjN>ϫV}+ri7] L8M^*'p<;= A;O$Cyo'V9ν&UPUHH@@`#Dk$\I$β%wOY|^^o[!_>tO::sYf[{xj_mr.ҙׯ4_(h9n8NtKw*9n9<.`uD +PlPp̓ B+(bt!hƍ?h2H(/}*z48l^7wՠ%B8./et! WbI+v_ AwĆ~, J̇kBoKvQ-95~N,ALF||urg(~"Dn`Zd-sl?WŃKv~%3eQjWMBU(jX>I u??5(V2($l-D5U`&1^Ź7 f4G^#j` Hgp=c+qv,暼~6+S§CSQC% LEm;A a݃OQ>9`+FUjya$GwQ /yyɡd62)[KKBaMzlgBv'/j*%ck6HBQ~$'vB$[BIJF,Q;zmĠT'^~o /TU"$>Bg9B鏦 7e.g"Z;Lu }:H`R~!骿u5=DSH*Ʋ+WJ*Y,r^tsT55vN`p2feZ5e_\I3G 4>bHNtFƠXz߼agQ`A7_{3 kK}%ڃjƃ|R77JeVCdNc^5_e!s_Bb~5'[z|<&0fC{qd{A^Sq|/ׁ }tJ)$lA,*<C0|`(6yܖ.4rgy-I9gD,\)=qZfz'ʬxp60o B:>= ?Y^-@fdlC&N؊ՅZ| ?.zf8pq-1}9lM/eyG2(e4ģ]_ar[Bb0"CU<Ʉԕ:GК 4'  Qg0a; N63he|dʽ> 8MwBDrRzseNԓaw}&tvmr8:5뼛S xm*5H+$H~jT mTPQ1k,F4:: }ȅUXh%S~58>o9T$q#% c52Xy-VuWQ)T/!MsZ'+V|J l 5Nw$i>x=3LVm2tC|@,.LؼA+ ׏w9-GXh_VHмDW|BKc@ˊdC:nM#0s:/pX٬Yeyuybn X͕`~Zq{eNbhxQ=L>¶Wİ~Ht%@A3}JMAl2qՑ+%I:xGf<\F6<_3}>߰Ne\{ ,ނp{Gե/#$4׬%J ~*ENvh rGaQXMov=6ė0_8U|oȓq*$.?dktA<[#a Vqlu;rGۜI`jڹX3?'ં&/صw\JQ]wv^?DQw!oZJ+ӯHWe`JΧ&L͞& |f÷Z>&RRmY7sbv?IOg,^Xiiz9B5in>LthbueVw4t'nըs1SH( \``3 *wJ|r1 9ϝcNY-U=l^!W/an/ rJ C uqa+ДΝak M k';~3EE7IiZFJ+;XXiIG/\Of <4qM}i3sRLsM>o&ǓgI6Xo_3ϟf8īHEi)# 7lhX?I_1Y{F$x-D4ཝ<:cӂlm*)佑"GwQπő00/!DhBK/:4j_,2 D)Ct8yw qk: U: K/ "U38h؏%M.r@\q5~^u%3] c/m  UքZ#ɑ*I|5iRA5c̗Cb|ŸX1eLK5^6c|![b}$(L\jC|6Vl 0 $|_xۣњ=Ȃh%ؐ('ð!#L avdGZS>@/LՂt1.Bhp.{P]=捞ā0$^ͣ[w* ^k^qzl:3uқv7r&UR%OmA)>CלA9k,Dn'pӻ:R%g,J7*gTZV_yYo!.1k4@G-d^%ǹ(`E朰>Q2Ezui1JlAZ>|ـ ^@<_IKL (P??pW%\xkK/`/mT_- j*YChUT0c$_;:fZwS=4]t898~Fhڋ  Nj ң s*Rgm+9O}0釼[zK#,<0b&"̔ȯCI~]%wAsiPqe < jfOH[*#!ks&A,Ƌ{"Ҭ1Ά_B4#!Pqٺ:NS _D_yccuHi%4 ZT7cL7B0iK"7 xŞp?Z#ZG@`C in<\eNHpD#Wql@-NհGΌ>r|R%gFW}R >"tQ'ہRʟGBR},mqo8A iuݶmWGA*[MSXC񻿹W18=ߙӠ-ۡ60L,U7 N Ul9B`Da qwš!\,Ƌ%g|FVKL+B+W3 k'fҜ㉼w.edS#EE{? 75('-B8* /vq!(}1.AuZ-`ߧ! z\" fTn0:E(hupf!@UDK1,)3=%#,wj.8;˷>4bsJa$NcxQ\bS5jT*c{OΕN} :ڙP*S"Kj9$5Pw& yZT2`r\.3[·Xa05~xXU QNKnF!V2ܺ6_Hr|jv+4ە UcW#K$VGQ)>`yW9Cxؗ0@?rb?`#&%Ϟ'\߱UڠX'|ffE|E>K:**xfz(}P ,>O^BF$/_œH }I>v4fHRF1z|g8hNPeR ׶tX 9=!J0 ʡ+؇OBsGT}_nB @F_0%>nv"$ L6v^G]?ЖM.w\o!OΜrv9Y^ 90"~ks3>BHNW*{S|meT&8-%Bo(е|ējPT8aCym)Wt]vǺklE_ߡz4f$xʄ|Py(ĉՄ1Giyp,Aö@eAͅ*1j`'燯]yf9ƠНm(PRXGϥp[L% l%G#+j+ zA\!Fw4+,yif^q6.>q:lͺ.X.ڄsu$|{?g=o ٕF6t%J X|&yhdNcoHi=tߧ%.;܂0ъD&яo/BP Y;2~ dOC[;a;@c+)UXWg̳woY~18 \ԩAsɿv $2cJFt&6G&T%X_qӛ#ӂ~Ôh8Y ^[5sula2ZV -ňwev߀n('q?a/Qf4gЭJt〻x [R89{ {|0 l$YA-/O. NW58YuIVO2o>9 9EeBm'xDP8CACY8B=c\Glnάz=(^=s2wЁ?Q,~#;МE ?_93-Frz( 0~ǬkDE|q B3x^nΆ/ 4Ƙ"(ofb p!E[9tw} }7`-RT<4Ke'~ Νju(w|Ujfv6dfͯ7;dt|Se5Lr. }G <u~rmef.%za7Mm mez>׉ɠ)LNA 0E AԠO"ۅaBڕbU‡"#.5*Ts9?>(?H#Q?"!Oā0  '  @@⺺y B$'| BP q հCW@(_0h\ݻ|mEFyHEGBkB^eL7jE#q2 놀kY9a.QLBaJ|PV}nBC12FShyid[B ',йaB,VΤpB^IY\V T >M4RSR6򣩚x\5M ,,noi4_}Z 5![0vHfS[!nRc棖B@GeWo!Fb(Y|hz:do32_MyxS6 e*+z}CuȟݚTbg7V|s`[+fY5ҙ츋Ͷr/8˜+3Kj=(\&+xmSMT[qwyL0o&>-oM+j%a ' Mwv!־`\vPwko:ݜd9UWH[VHr6K[ʹ`gqjs\X|lN8Yz5;B_\64o5PM@]!n Z[1 5=Ƿjl됥 6Mka't!;]χR AZ$IDH3e5{O3wqSϿȄA}eo$n%}3\$Cu8+Qւ M͓Bu.f*=Dl1.2kc! DTN#RBl9D}rbd`wrAx#vǖG1c~;}H?$<*ȍΦZ,jp㉻1rky[Ift/ Oc-fƈ$j j x\:5=κ͇Oyp g 2zZSEZex(% qԶOF1\ \:G@hW_&:NK7֍dm$ 0u(gp 8HOSf$Z}?P;G Biz~o#Iǖ W=beo- , ߅dY„*QxSQv\P_'g,]{VeTZcGcX>Nqo} FI A$ƃn9Lk/4643μ涶C| 7T#\5h2\tEf1Ƈyskg鞔f3 ujuNNc=/*?7,hX")hNJ̃g76-T"U:VKYlGbӚUG^*W rN(I?ېt֤ˀ |2Lhb#0uh%p&W LBe{ZIm;Ds( wյ.%g IU~٧[J@Q{fLJ'9IZZym5AS j],E%qKAr`rt$\y./vv:*&G ;;VL~Lpㅈ6$W20{nTا+8=8P"#X֣=ȀI$0 $v5>Ivo!>UhȀڶ~0 %tІ?M!vkU4MMqM.WWƴozߏ{e<;].n,9mgm|ޡpwwV1vO6n$'ޣl&5t52Z@-  "R!T(P"bRPȼxȝ(iU{"yPJ#BNB RBH! i҃wr1 솀t:4/%4 %"+R(RPJ P--R4!B-RD HB%*4 E+C4 J@0Bl (SH:J!ҚCBR}º:@y&ySJ *P@TMRBU% PPQP+JSJtH4 4H4RJ1*se-jFhbT9'%WH%r@E CB R@4!@!М4CBO j%y MR(RPR H#-(RWC@M ҥHiGH%#@ r>IQ9ht t(Ditb (iI(@( h^š佁 BWS Z@4&(4)Xh h($¦iR A@%PP4P%@}¨@^J4  @*@(Eh@mM*4ӡ4 ((P :T ( (J(* ( i& &*1UEQAIS4TDTQU$Q0$MQ)EQT%lji**) h&U)h F$iJ FBhi(D U())J@JA( hX4<&MiZJbt(Zh@)@MNʎ)B(i<@ ҅ M"hVQ hJTid R#.d)M!h 4T4#NT<@SG.E!HibB9!< v@y )!H5С@&CJih]4#@4  H5 JPP:Ut%ҥ'6SHR!J(4y*(iF(B(2*(+)Nؕ)BhhJ샤Z(A i( R BhPZP%tTJ&)(E"D%"%Д@4P)HJJZ_ (h(4WN<<AJD)@B  CBHWvi @(TB)BthEF4~%@ iPJ@ѥi@PvMЅ4( iM4BDѥt:P@J(RQ vP>]'Ƞiw뿼9=4 "@SM%&t% W(hJ>ȅ(JiB4hBJҴ)]")̀4 * B9vDZ; JE;(JRiZ>G{hN "N䆑%^9t >H. E{PiA4+ I@4 *J MSBݐ hA)GtZPQ4JhEC] #G4=Ey<Z(TҁH-|(^Gh4dC?&& rCJ:ihS$O~P EB:D Hi *)PІ5KJH Ht%4 P4P*&H' \B) "?!9 C@JҴЉEG@4P' 4)B P(AhP4v6Fć%@BBy 4M k@'& HR( t*4(ZJP9ЮkN444) Jh)TA?/dy!JhS@%(4\N@&CB# DN@=44*r<9) SIB!m҇IB~$Я!CT RP9+$; (RC4 T%i;P/%䔅)(4CJPҩȣC4R+h9i uJGCЅZ " D4"hB(:Q6”S+l%H@iV@Hv9^gw#Ga(CWm(4R![(#HWN@(-4#] Ciy(h쀚NAi!C _gB'`BCNH'$Ju@HtAІЏGI4dVA4P_vRP_rDiB!)9t "ZSJ4BtiZENI@F PI@AJҩOaХU %.e4|=д{ o/# WB>NH>HS 4}NRJ^& @y*rGVrCRiNerFiN!CerZCXWBR$WAA@y/!UtrZ4P֑tiDM Rҍ!BhҔ`NJ4A{=PiFh Di y(Pat(pOv9#IBR]'NBiJ]tP(ҥ._$<=@CS\ý}u@iUХ% AJ <(u~eд@P={(NR .J_y HH@}>@@t'9vQ@!A(CКGI)@~`tP9=(P4@R{ )l!< #ڽ  >Hy:ҁK@ЉB4#JWJH]#M+ѹ@%VJFH?4a4;%MܣH !JBer4h)B{&9{4#hh^R 9PH=I(y)?eZiC h~BG'!(=ȁt]1 ЮHJ miH%!W%(URt@ZQ䫤+E B * J9CE)FҴ2R{'y;O'A䜃WJh;:Z9\B GPrtH&?i<'#K4#y#]'HR!f};((.:P yty=H9iұh@-!@ ROHZдRrh{%yr  #cW 8e T@9"'$.9١i)CHCPPKҤG'=C5 (+StҴ4CHtv/ah U^O')M+IIB0=䦀ѧT9 Z7e4/gZhtB9q!G+)4!ѠK䴁SDO|Y}@%4)y`M!HhCO'|Bih!C# T?0hS!(@P/Ԁ;$<~ևM NA4)ZW@'=^Bh~J)䋠H5h7v^Bwe ]&hN\MG!"AKt% ICJӤKBQ9JS+C_4 $Cג:sr H#Q+C'P'a; ei)/𽗒 T$v(h@>%"i_& Ү҉s&)Pi ]Mv;! (t:@ (Z2!#]rM&9)H!tRU#(h4iM*m쮎BM HhGBJ4.O䧰(䴦)y'%"ASBeCvUhB4 {.%LOg\@HP*}s E?h4PPh HMH: eNB#PytlBڝ?R$Gv0dJcJ49R]@iЅ($<6t)lX4v2Rii RhDd=<:HhI -J ҇d( PHSEv ^ Nº9'dҜЅso?@JP P]A/ 9.4P>Iy!a(( G])t-!>BʔP~d'AM P4r~@~cWJ +iZGP&h]Z%!+e6B)I()n䮄9 iAH hOka_2>½=$NJB-P\9 i iG0 (֝"Pҍ 0ZF@䆁 AܾK@-|Km}Bybҥ(FZ (>H)ҾFOa QKć @~ҞG=ɠ&)hN@i.g\GHCC@ KyP (]hh~J4ӡyG&TJ̟R˜ԩJ(r-?9Rciv=ѤO%4M&= @)"V)iAː.PI@PPK< ߦd9'SOd4 4 PHeyJQ/*A % <䴉M?r|4hCͩCT$Brt\uϙ>G#MaҾ@4}C)hVKX72NH@vkTӡ{BP/cSH}O!?0$?v$mЇ#@אB'hքvD0Ct'!i6ɍI(DH"ps TC@QNI0>H;yB('J?G@r"NZ~y>s~i(y(PV ^.O'6@Y^AHPJ? J iSzZZTiWBR *y!O <= AN@JA@R:;tSOy!T4)GA"i4S'|(OTv{PpmSdá$!iM5]P#IA94y ({ @%:J9hm;)JRJ4QI@@KOCI>/cZ佔 AAJҁBW.BSGHB%Pse4͐MD-%ycʐ<vB/R`C{'B9rA@rlv;K?7`hO4/%>sP!E,5GEBh_`[<|ҧ$9!@ 4irT !`@=;&_qܩ'ċ . h(9^B)yvď#r#yBGr(G@܏t(D !wh9 Py~ uwni|y9 H9y%xJW!*%/BWfyҏy`y(vVHK((;wgϼb|Cy!?=;?))|_e!(rS6s)J'Q䦓 JSJeT4wo}_:켐9 MG Vs>@䆁)=WsNAJJQ4 B?= hCۗ 9G|!J\Pt)I5b4 Ȯ\҆4Bɠ](:O^J^(_g@_=4' Bd4h rh)ycrl˥iNHiI?$QJSA ]"}s~>'44Q͏v'^Bi{:AC^M!ycMPrCM4h^CH5m r/$|B JbCT/N@CQ4-%A}\)(ncCJDK^OMP$a4C 79{:R+Nh%'+C#9 eyEDIG'~ ߴ/!B:X9!/QЬԇ 9iyо)s)6BRMRC%9(Ph=#ɠ(st=@GCvWv+Oe}_'< 4݅>l4:ZJSs .`b~t%Z^K!䜐kKIK^c"O =t NG0|Mh{= 4>NR|䡾g{rWH=c#H}{Hr;P4<ĉ䮔 P4v])ED O`4G%Bv9{QSC9)jy(4rw?_p!H9i(>Z%h'䎐A㗞`<ZJ(TW?~r}Jy<^G=2'Rӥa]}YD)< ɢw?הWRcF(<>@^OcPBOe4vy!ˑ@PH}By/vK@5HPa.4I%yw3@(͗wyXm | (%yf3C@!:9+A ɢ켗^ڇKv\~ctRBPA&K4`}k*^l&4&'%O8g= IڇCC>F#>NϒhNɥO .=@yWI '9@sDĜC'$-W|?hCӠmsax]^I(i (i(iJJ(B݊+]͒]'69쇒/y! {!^F^I>Gd=y~;<% _Rvh4/ުKIIKCN9 Ti7/4JICB x@iZFHk䆽rNO=!H.e'H)g@$(k 4)N@h=`;P ڃhM)>Cy%DZO tJvi켅Ѡ;!vQmܓ$9 CBi<4 "cKb:)@y'# Id{y>Cw{v/oϬrˆOK.[ItP:h:A(<O#N;G a5@m;ĺ[JQ*vӧsIr=NCy8rF1Gaӣ%5GdUG#E=!9</Iׇ}(OːuW#d99!ОO=ṁ+Tu)QivNHhCCw0y=ES^_v>N/$<]!wly<%R-%O9bIDrGp4hKJa>svVN s.y{'!yJGe/ZCۑ?25W~( _+m>؎Z7 $ZIC݆8C~'A P俬|?.CD_C_B}Nw nAԽoxv_s8(ւK̀4=4rNA۱vPrvM之`Ҕ: 4T5Ts4y:"4UxytpǑBhAJMM`0  B}vO9#'~8]9gn\Z+e!4M aM+ɬT$9ɡ|<ç!Ji;~v <8M۲rԗ8Cpcmhr(JCAp%;:_%y%||w@v'JONE?@uiZ~xv"5\C_d>ûAȣpO/̇k};%yFyrO{7w?'qHLN]ؗ im`j߽_hOFs-Ȥq+|Z%4<4 W%9 ZSOS(? C@גOk*ʕķ+i{hhJ~N0)Ѡז."ӟ\4[EDSE09}܎yRry% 9vw}ʂys}gv Ov 9y]MR[DzKbxv~i#݅'>AF}~ w bJhg{s4>]a鰽5F| yrt:G}sy!`9! ͻ.ovIk-k5QU9<'sr;H},A7;-'NMQ sk k).S s!#2"An`i99@QnAͱvo9ۧ`f>!?2i19ϸ9Q˛Or;6p*jg|ݹ4|"r>@ |o=Ukwy|~g!ᯟ:iwpݓ_=;JnG.IE[*S ]ƘiuGv9 4}ܗ GmRsE~-'n`9+ ̅:4i$ĚCO ^=T\ˠ~Oȯu(⵶۳5OQiJ70pTi4;{''mȡ4>E5C^OdgO#UorQdv4Q.'AskOgMy j /&o/omsd^d/[=o.tQO4i)4{w{|k-]Gb֔Ũ[;({{Ф];y ;9rZhv5{M\gnBQ7>>@[K* )y߭x~v&OvO}nU<$ok?S˛W;p#]F!k'rbs`TRrH>F5qԛd(G9mh UDln֏$|C<ᵶ#]ۑCsqwFڴ}FW0r77*9i9]79iq=j9W'G ݶ~x{"mb|~s䜞OyPW"q %Lsc:65w<5^|~c^w?7Q%q{8c?y#lj\u*fss66j mrc,"`_Rjp?G*jH#b/;/p8\0\|9)b3뜎S=9EۗYŽ13%:OmbT1O}~|*C^O U8T\|9Om~|"-$y<#hF^F[E'#^=y‰b5Wscr"_QG7 yޛj=*c!WQ\ˁEιSkEbmM[8?Mقj9@M~,A~7|m|Tښ`"wDX'Dcb?\jivkIt~*AG}ƪ* 5M;j"mN%oU3D{_{S<Z[] RL[rsmb,\3]9US71r}pitCAW#<ro5fֈ+n-SKv)(jbh^ܽڍm8ty֍R>s%nZH?A MDlձ?9 'I̶p[X; :-b9ra+Z_ryc~q۶y7(69ߞͼRkATUM%G=-h˛<**D{mmͶݷ9 Esb`T&*/2w"""wㆩnEI$yǞyѡy.ؠY9jHvZ V3O8$w"(h&H|XZmkNjɌoiAbv E,b&;NΚ_p]h{wkq'!ܳE51LyPDr4UU1LEkU4Iړ_4Y(֣~:<|ۗj&m URSWjr {眷:u˝Pp~~j?"(5>њ6wocq9<۟^pKvE-.I&4F>1[bgsjcF||΃mw5q9NcSj'^or.Z."n}>e<jŹX5hk:4rTtnvכD4QW7|᧛7mZ5MErs\6y #yS9UvkIܜַ1ͪ4cki")9b 8sk[b#{s<孧n]kJVy:*hh >[slTktQ61ކ")&pj N^Ã鋲i`3Eݷ9Wn[IIA364ùWG#hQ~.3IAcݮW0QEyy{ fP5W(+5QgW䝓}r6DZb(69raj&ܔ_{r g46*lGynyȊ*3;yE r O6Uo U Z {h4`6ƍg:(8Gm= ͠>|Φ 颪NhQ ۷9uhe4'O!y^F(ǜ PQUF' ƝfTr5TksGZ98^E8+b*4o6yr);9ӿ]}'{ûED{ABDy hswh(94SSۿxJA\rꂚH)=y72|Z1SvTsj{mQCTwj}wrJ*$&qENI幼Wa Q*u]Ə6m11kZduw;.TEL5DyrQ媾yn~8jĔ||` &94DD]uM!䚥TE1b{S_wd(9D}\>AUGMGݼrvNO9'g}Ɵ<.& 1IUP`FbCs욦{xU^dG'AW`Ec>ms%PC= 9C 8!m!7bJ M"aM4SQ34seh(ֈ)kw 9އ(j.\gMS`wh(~lTH{|O&^N1vM S]L;O7㝩HQDPD탱nX[d+;{MiqD5E9W+Nn=i)/r{c"b%iZNN\NQQM}/}GRw%msP 4?.T w;Rj)JF6nm>K05TdG1)"4_jd*8_b8:;A}O!,_-b-r^ƃHi|{yw_[dtCIEPr])AAUAFu䜿Go G%9 K{T%rR!_:j;vʊv5NbhG}[ ((-guM{l& ?0 RNKd CKqrI4E vi{R֊ ht<_1@UCuǜ/%C|C0n`!mCК4 @V_-GvGIyiSM @yv >y!خGr.a:"" iv@Ӡt/t;-R!wvA^b&"@rѪ|4?{'mPP[f4^jKb;*JR(C䆩C  @CeHr.s#K`כ&)9!yi4%oy5]CSG 4[ bC\G! sP<y-(O%4ƗGBSBr{Z >\/A$)NlOrM}<ˠ>͍"R{;5/}ئvJ'?GT܎N4'֗=hSЄITd["(h.'"D!t~m;*r4h?NдabRȠJC-w;CA>Tʅ̣wl;#iywAMP=;$Fe\GmR)~p/<:E iS@ꄪ:Mr^TrrW "R +B%h%@ CvC`hNFӣK cO 8K t#r| B4r@iIH @DR!^O$~JO%*cFƝ爜OiM]i~4*r~G! GghtB`^]4`M(hҼ@hGrNȞBPåh@JhNK˽)ITRMvWCO!MJ4mI}d=hGH>~HxIIT?weW;)lF{?WB@  h(Қ A&Bu@Rč"D+-ĩ44T]r%9>C>7tЩJHײ^ER!F%-P@Ўt R)H$ J44 JiEG&Ү<){Jҕ`;|*R  "/v9t P4)J(R䜗r^E)J`)t %&S?K_W!; iTHr(%9"v ۰Q͐4tкiZE(K (y 4R7T伕/'e)$ HF iSP@qB4%)@& ~@/ hO{dV()()WJi R!J&J"j(Z)F]!B>@{64 mjCH4\; rJJT 䆐B4:/29 @ҺHy!BM ^Jt& (rQt+_R= y:(Rh4@֐CGe4r4 SF]&@itR r n`n`̇ܯ?$ () ( U@G@DhPB)P䫡ZF *CFNp@@ r iJ) i "ҍ"PV>C9:JPHthAWB  h(@)9ɤM!A9Dy 9(`t"RI#B;hD#N_O'$M Bꓲ%(P@5F(4:B{%9-"@NB0Sa(NKWJi)RiBҺ@Ң.JM*AIByPzT )D(hRM&tQ)E((D֚4*BFpd*T%P !@¿Tv+@|r V@~Ц @NBD)JJJk@ (@ (<r&y5@y*M ʾM *PS9:4^]- rt&)>BQEP B҅(Д РPRД@ " 4vA4@BJR Z)M.(|+B4 P @ "@@"НQ@!J#l.JO!Jit!TP"Ph9 h( bF-h@(Q  h H_dЇ<)ta BhNi= v *RЌJeD&hB^CTҺ)9@D"ZA % "ht.jBm{CB]#Bit R BaM"4)"H!P9( "F|y.}M#KJ@U(AhNC_ !KlVd]R:aJJ@ iTBJT t )JB&@; ԈvT;!@9 IB*JJT#BJ$GAAH 4 R%^@JP%!@!KBo9#f(j-1j>NQ$F v(bH $( :$ vp~ H_쿤 Ɠco}jW32uH/8f= ^~oVSo%Hvو\)f Q~0?}iO>wsb{_6Z|W˘y05Ll(w}i YD$wic$VeKH- ՜V>V3˹mSW]WdS_n[Gǁw Ob-C6٭[\Nj>КNYllsP?T ُ3~f7*Nn]m懁;D^J,"3~ uw_S*JL03gK[? r-Ol7 ixNd7jvаf\x}r?q n(Z~dIϦf6S5j7ٲzE^Dt 2pD;5)9P=}-h_4 vX8sWx}O8#G &E>ξ%QPB[~ޕ_h>M%q`R rQ+>JcX^/ ,uϟ͋yS27 {jA Q"Lx)Qs*tR6>N5`"{ :'  G_(n>l=|Vt7v^g=OL-wI `ʒ+c+X*abu okEz^SL*|\=CS ej(/"n|?:_OMԿ-F nbRB?ލPxq\'3$k铋M-s">Mor4 *-_EI-Ú;)o^7]o(5 @|zb/.F$7W5]'W:nMGg§FY,~ނ?Įt7j?vk=|#}.;y))Y[HE UgtY}'/#Xң]kRR&jȶyDlFFVkY>8&x)"Gxa&@+3Fp5>HF|2樻@weH[@w$-.Ep?ciۼN쉘ˊ-UN.ځ('[@%}]WU}Y,w +(.ȧsDt78QƋaF!i7tkn8#o.at[5a]i [Q zp5еyƣd+Lohwu Y7y 66Auk>Ks} OTD$HQŅ i(b}YNugv N\_:B+N]zYPtxz7^|7BSVJj7 X{(K5$eijG1`5P5IN,f.E9.L66Q!08cQ DV,o2/K>YC(d?Lov9fM᧝ lM^HTn4}d[#D0RYexbvO;X4 ?\/gh9o[9,<'}n局a3':.)Oʕj,zpU<зHMET!":V{M?'V pU-x=̔<zFj8&DF#YJ&tQd쩖} M:vBkYȜ8WI$E-%>m ֜`[ox))(k?fÂ5NNYpUA7%>{ȕT}J#< t*L?_CϔC2X30#r%$ іzy4Mj5b06M<]yȊa?ILlBһ B'Yw0Hi} T4R^ڃ*Y/_Ox )xx)c9+YuX^1*\?U0גϣׯ-@k5D͋䩻Sx̲\l8g Aڥ)BB+jpٴ IlTsXK4-tEd "j'zI^)hC C1>`x1]? pdg }}m( r|1 Vl6()nAhJH%w@`h)h!^nF.k4Vy- l^AIZޖה5p關y_71/X"p0q8IXEIT.77Y k.TdifnnB CMk[k<-cBC哄T?$.C]\TpGm+7 j7:9$`d7??fbB@^o'kX;vF I%N euxro :x@s3RHS0%gXƇ˕'N$ۖ6fVyctkW5䡽*S$ Qa${y pgoBJo=/X-+X4*գSjzysfQ '»$OQ3qOEI/*adp?P=Jxx-53G (l<6U.fʂjpiq5LĖk 4'y\Ki`o/0cF5IFYzfU3iׇ.sKS Ƞ~*E~YOdO8k5p%2P $ʃuD"?ooB˫|$?Ƹ?ւ|pN㐦]/0dnLM(?ux:d" @)M0w#7Gy䇷G^BQSq̄g@c:nRXܲ7٬SdyU2$d݅|ۑ%'U%L"L>m%%uNݖ-%f4ReY ߈.VFss<( Q)Mqo-xw n`S)=^y`]ǹ㩓m+"E`&嵆;IQpbڵ@N&\Azk7!vR~rQB)яs8`~8^ɮ (O˹UU,orŗB֢~$ۮCee%;]Sv+ | T[5ϥmneh $Z}C3F?$ 3<MWx<8ͭr`$k7/=kr`$#u@eCЄ)A_.Efѳf_ܲjkf!dufM4&Cq+|%Cj·e3lYQBo` FTZxBu !p BM,p#G 9@p/s [0նoa_iP3 B l/PTx7(eA/at4/;Jan1{(a 'I˾FFבDKv|_70T A]4ӧ7G{-> ,  HIUccKg+< e|za ;aF~yש_%(P$4!jZ\gzE+ZE9uXuų|"(IUGqVz8 beQ0Gφ(}ȓV&?^ެn<2WfZʾ4cHч׍b@oph̀:_U^`;/ǚfZ Z囄1RM2bC& P@hH?x=򳺓 LNʷt\8JL`~;(26cC1 ]R|u ׁ᝔^ Q;bC^$HW"yAf"i9Zs' -4L#ڏz QxqOA,^* tӺ'وE[$AXYCӢw82LP?ԭETiG˟1zs(%6.̗~B&9!M[`ubnbqt5+Ͻf%dVtD &Oġdv)'=nXbPqAFc@Y2FEPA[2i ]*t;#dD2 _Û);ARrn4(9)eMcO\qԚ[i |n Rѐ|ƨPOعG {Uء]>9G6"ggy%wwzG (JU:9k ĉ@Dqٿ%ADM]fOå$9v4rIUiߖɐȡ]yu䗹)%;͹y6h&|s:Xx%v;󥧛u҂^h3j-βW>1 $b 5gs-ud|{CX@H,Ⱦ;YU5嫞G#kw7R),D,(NOR d%c1.Y%}`Q“J; $K< 2|.A҉ 泂oO9!Ǝ־,o9A xtѐeŢhJ.B\ XC̄!ٳ_ >ߜE͍;&`z<>TP^b7-T.Q?؅:lX:A]zGo,_|jxʥ"0L{lu0Ly~%+b0tIQjHWyV%+x Eӻѣ#\Ɠo` Gކ 0aPa;3Tv5ߠf[R B-ۨv&eF/?9 $&n-< b˺A-l9’UwAgQ1XE m5>([Ո $)*{|*/m n˂+]有[VӥBG|2*[` \1f,> Eg/(5$kzK #=)G%-V7R/~ӇruqaI!F\5*);̖K}4oV>` A9Oe}ӞƝXH֦tn S1(qv;ih;ђl͹xgR-V#c)yn3'a_HjZ1ELlml@3ݦhojzW=(1 ʕ[aAkWly快3g6{&-ϕ;G>qNgHFwJT##Oɺ7k2P PFF@@zg+[+'%Z)rDգ_Q&_Rdz030% +If:nP-JHxnȪp\p)˨UrrO<_^¯v!~HJ(vahN$@BhץW_B5 cT{dӞ:S/B#&[`pJХ7Wk"o$e,:PHT.C}5,tzNTc܏"_ICS\cM:^z ͦz5)zvftjK.+)AZ*hyB$; WzWyUyeCz݅KPղR>݁ >~VJe c~pu*8-NMO+\a豸'@>S }P~^@}GP9{!Pѕv2bKVj2G2\j~~Qx-|RIo3d+\. $ r,[1dz4a*'ɴ-|wBZ5*6BnU˙"qJ1r5."gN:pdgM WL>5aC}g'Uxj*c%:%BOp*oe3W/kQ4!N-ً,B UL BW~R˜lo%x)[B̤x/X Zwv%&-FD`U,DΊ1TK%o*p^o4H+#ņS|2!V&(UGz]:F@}Ab Fl890i6DlV9 ng(3헆fl4Rs* *w"fI}4q0zۮݏ:OEaSvD<0h"w7n>%"RxO.L?QҕpK8lU~2/nh{|(ǮWC7RaeftS# A}Ag20O-3ؼӾ^~Ger5@,gx0](.eK7(yN {ƍ>ƸJ J"XiapBsTO On>5g(Z7T)e5 K)iJ:R硢. {_@bM4*d7민M[t^ }n8s[j#_wS Ŧrso"ӯR!SCI`'} `bqnKˣgl@!{N8H_ _/ a7K}VkTWҝ(cm{a5 IQ2PX9x>mkhRem4cWsg|SkKVER1ԱLIsIe%O .F fk%p$ {'ߛmpY- ّGM)}j M:c, ޾"(y활5pB,+p):^H*KoV0J.j#U yDL) Xe G@f}٣:]$CU bTz}lHciқAoܷ+ic;M=vaoG53p@ @Bmjv"rvFQw3[9R1Sn!Zx9/Ne> %Sc0<gA>4Eꈆ ɠ-d7&a3a֨oriLpˠrߗfs8ADZNJs:A*di}NOno7 1ŷ67)j1FF?~Κ{Gv^}܍%x3o@]S+* ·1>6»;eaZ3@аCwO03 T,TRjša;~sV0G SArI}&fo4m2]i0<CruX/vJr8XȨHrHmmgcdzP7)M8F`ڗ=)U6IےYQ c6,ugմaC@W][cU"&\5qCI ) sjtNKv})(Q ͣvɻO.ǀ-l Xw@J2an sѨ"^3:Lڒ~?fCފ?d6jP$IIgm!_gqwNV6'T?,Ի%$e\NOӗ6soC^ej;L0{mTXYsa.jB`KR Fl<C.B$%ϻQDRp2Xn<۽UK3.|4\ Ozt׹t٭݌]S6!I ɐ&qoUmW!%?f^oef"mMSK,,n<&܏MOi?̣,#jqΪnPUmϊZѠeUB"Pi[h05j%yd#1l!BB*z|__]3,ge@VK;Zg|TFgy2\EӦ@Y+/{GWv~4= @dsӄ8l*nڝ|AA`)& T.kEqx[6䧽T4oG 璢L>ۍOذ@\ћ7f7iӟa4_yAnRGrie|,: |_<_AUqO 8t8@1@!e F'4$L\z-FpwkЙc waim)=1_);ZJOY%V1|lbT ѣY$|Q4*rD> h07^N3M{ isfDȡߤSJrxH3Z*\-Pe=0S-ŋ9K /6Gܚ;8r`x>]KN[V3یٖp`Ӷk.zDaeS뉀+X>_9LP5zގ"1>Q/GqvDNI J'P0BvZd4`Bqg$r-tI"'K |Zd!JƱΜkxsSMm+cTURm$m$AsHr [ ǁp gGT.b 7z"(?785!} (;x5F[\S|cHD)TmY 0c%) 9vݴCZͻ[)7~hv b^,w+L49ЄKC `C(1mHt=X*%P0SbEt`"0Q*a_ RbP3̱t0?z kv/@"-Z5?&V~tAqI<"ʐzlo]X}f ZHNBR]Fʗ"X_Xʥ#y@;,ڼ/*ẍ́\ĥZ-=y~40pBZme+]KŻǙY;86NX|Z7j)BG7A_r-Ie(uk]UV.(l_FOf\_$'g̦C{ iϧwG\"fh1]A/>l?Yt;аVG5Nh_`| 1= =MRӭ]&,\rkIwT2е[ `Nހ[/&L w'z*T2SF#{P͊M.fCE@SQɨ} "o=*yg N9jzENK{~2B@zSLؒ.:(m*V9qt_Ŏ~ a zJ: qy9üQW{u~  %̰ C٪{M]Ź:ә[k }۾K{籖 BcP4ayhWxt#}JUŊ? kL^F1KA%ѭل|QT#kS^mC,?h xfW xW?'bXlz>R' q̞}NM,`) Bt6%Y?!u./ BzcB֩7@%t.0bⲯޙb[Ʉ[(Aņ+M?યaX,JFʮaj7uxJ?ߕȗ5p"ݠLD ~}<} b& 1Ƴ{ab]ԫGɏe̊%? AɒM0O\&gV:]:,|,dC*[RJBhSss'+$fG~] iބАw'>]dHH ^AJ!ɦp6cea +$2bgD .UhVTd8+]!Jr`m 4:o5| &`7@޹(ak'3Q ;4ZDN \]hf\Ws.W R֪x,cL_t 2 !j5ٛTG[ fk#;"m("OY-Y1V?s~|‹S73B)0g"L&L Mm' "Jw bOh[4VKo*΅~)]2c`/w(=yTơu]T>N_~D._ĺ Dl=bG{< 1;gwu#=:W"hXu*X'eM)bsT!].iDBcTsKKsˁY&oi+ljRT 8){_[:}rV2?bdXm[A/qL_;2F3?(0}\w〤4>f4iAB+aYkEV/&, ~҅\x M0 \D϶RQjrmTiX4ދ+Ti`kmS: SU)pwjVU{kPJ])ע4>'$~ 9ܣjDE/^1,_gX G+/]NEdW<36,d4XL*p\8V7= 8JDG08ĭ UOm0ՌKIr~i&A3)[@4a_ nhHq:L>$(RhK ٝ]_hW - zCisc%{>K)U%U'& ƃEj?s9 BKH Gm+2w"TEFjA Zq0.SRPy.>{ȟd5oQ2'ObM ;g^*V㪚ԤHâ-J7@tj^)蟍Kw }Y2)~oQ`naKFqTK-M3BJ-9RTΓf_Wx)>2YS,!5'x˄6Jh3FDtync'vHE?/ZkQM|vt^L#a{,GO@:5H vDԻBKw1*!vΓxD~84ΘpJn܇[(]i7]i-?3@ ylHS($")Cc&Q94]M~\FeZ*ak6_Ǥn=Rt84CgvmV!m(0{_PJX)Ct+Ypdn-Nagh5-NPΣdfsɶ-#+ϲLͭ[ y" <I:Vhßz*Wϛ `56)Pcn!E0߼1]Nh^J|/>ĻEJMoN`BJQ`rw0N1ͱ 67!`pd/gkGMs.1ObJ?h00VVt羻|Z9HT/l NK0`2T\7GoS;kmUDG}./i)Z,@9 YJ,nV`n>n_ږ~JbB$[0%VVB^~':DT $6h9yD14kn}qaF!:o7&bZ!_SЇFӱ-J5PoNyV7֓ |#3$$Evva͖ӮqR!} =V?54RߝHpza$wAnDF&cG`aOf0䲊1eHڎh*:8}Ps4p mUM4-*[>su`5HzK3"dq<:G5{E~d!=P$}RyYul<{;d.[2? h#`[]P:f˒nw`bDWdlzHu&Zd2:I|E=KlxmI_:w V"-)BGɺ|+T"WbB!h#*7Bdq^2м76.qQ:Q8DTRZ=1Ev{ǫb7͕s;WɹY׷ԽjLny'*MLbso7 &A>㙣4ƅxQ:P /t@VHƄutL% -n_T<4΁!ह74i!m3(dz CӴٱ/jB^2~$ڼ5⳸U<_{$.t uJvb8VReɚ`x}jEyRs5^6' DoCgBT l3ǹwFHQa$!$x!ꤔ)6ӗ:!ӁѾ wL *d a*IHw'T, ?Y(q+g%{so-RH?,kޝu#xO١Ssh^HOЯrDT$&K Jk6,U8,Z&_ K6/,E\{eet%H݈kT0^d9 AGm ̠YFU:X"r>b=i#jY ǙPսJs{)真j,s6aI1q^oST8u.9?( Ow,0krVVk"`# OvqI1IX{6Oel[9+Vl~aTo7$T1BaV {|l/Z,ݗs)`|NZ4^(Yɤ+FYx$Zyp A [TTF%^j~DH 'Y>/䕸nb9+*HrځdX@4"ߍFPMTY&ÒtBK9Vb5^,RmwbDGP-'^-a^#?S-jgR csa0C9;hBb~% Riݡ9vn3R"Jc·jf#hr=yQ`Xm)3UpVY_6Q85`UIUw4o'l*V ;ߎ'_gu^H?aq yti eӘ3g߮G obk 3L j~Z+W%LU(dҨaWM{/f/x;SV68{ҟP:s3إU9ILdx,1fqX4B%U{NzDK !]![Wq .dQ/ :^A-4dÒN5˅lHj337QNAg"=1fjD- K2Ki~Һ5Pʼn=do eDw#q_u1hЀ_\^֢<+VUw%YI~0M& %<8xOxVkf,]H,ۣ'C Zu![8u*k6Ưb0C>^p$ Oٜ<*g 7x(3^s}b>eљDCBīߴ8*g& ~hV4 4-34o ^}Iotcխno|GZ3¹~% !dJ{ۥA 6~k攳pn Ҍe[d:xp>3DKP]lt=ӑqG\eayhy ׸ dLasNAtwjqu~g‹Hɏ@;K h`%%*.@/a׮rF):4je-:#$-v:tǂ'C-gc |iBPFkG].r6!q}*Xdϲ (n5 Gvqme+h&x}!۾᭳9 \ׁBTд 93VV` ^dRӋU@jITSߑ] sI*u҉oPhD # OȊE@5XBه?(Lj=jN3Ǖ`T7^w$xK>>ÊEL9B9V@,S֠$2"k4/CRJx 툝 g@1e8#b 9\(УB~T HvkʾYڥ!onnq,_Ѐm|w 8,Ф`G^^dPѭaG;F_Yǭ@VV։LRrdJޭ܋ĪF{_@3gBܥ6b#CEYD %I:5:jmmq&gkH$i_sD `b"ҹf> }6<={ϣ&:T;ю$o:F|Jq4-AYDE<{atuҔ 0{u|hHÚD 8iV1t2UawKRt%rC*!F"'/;ǝ#jaC),.#WKifn ͂ >%8=H5[OgS ,R* 'F H2OPBf4`Q* Xz|ҍa)\/U0=qSݎV['SI&eC|x^ $R Mj]d*d{eȦ ҨFvtbvRo˚8? +\+M vڴ| ZL0)$X!`#TmL[]g\4چK P,@Utkhv[?/:B)yBς؏)$]M9{Z7uFB'7Gd<5I5a7QeTWI浽+jZv/ؠj{.A'P$J {U;wN"d}U;~z4綊0u.Դ|-W180HvIY +xjnY5zG9\W [%\ (0p&Gg.}6qQ.c2bȀk;(!E''/띲ʰS ^ije_Z0'GSR;X:T j/8rHρ^ڇ5PUq6~d/@W*[w$4x4 s6ݔ[ ,k[Z׈>)pA FT!9M#lx֛a$ =4h1Zy'@ F^!=e&V7PL$GY G;m z !aϕog].I:: kLt+O~d^(U)uݨP6cLm ѫBZ&Q(6ۮA(C aEytKvswX3M~dc$~L˖rziWap\qZ;D{ VhN9-Zuܹe|@H9D֋wH6cF #w/+|@Uغتyrx[,:]*ABe͛u2o`ᴨ+$oݞ])@_V1]Yx9,!ROtC Idg)(g :ʆr¶ZXtέ,=fL`#?5HZ16{(Yc-&4Ւ5*; Rqiȯ->-bNYʫ`Q_Z᳧ s<m^~\=(~o ,TPy{A5.yp&-b// DwSg[Wwah~N-Y Eʄ߯bE̜!`AVѝe6jT|MkcECrw#?654ENTvUÍ(GƑ7E&Q˗Š:KZRD@dxb)H5qGj R&8\̷5B(>q2-goJ^eݺ(Qv!ḧ#7 "͛t5RP);bFb!(L '(> Ъ Y6!YqN0(xzwK{ TTY]$^@NT腌50G( t1WQ`^;s 0u~8SDOl3_ΩG8%tʪL0o@X7D"2+, > K|p!s g=Wܐ򸮸w9A&u>)OŕfWk/7K 0bRcҽE眝weT01T)pD2t &\>bŮ/=+-K\XY[@} y0_+3e2ȊƔ Ћ aNjy؉e 73G V vo1 Ԃ?L~#MsO^P=ȧށ#3+P V (`Ѧm"h+&,cƖr4 ye-jwfxXvV=2ou:Us,݆ZM)Kh s籆Ku"noij*Ҏ#z i\-5 ԹwlRiB Q Yn_YƪC1fG8A`E1>/6%^ʶ-ײ X 3m&:'p .G(mnUha՘FeNRH܇Vw_tbGhroFm`'-ăsCuN[C=ZP/ߪ+>!S~q2iOvAg:Tuʺ}6{µp}6ooVsh" Z>j|-%T q׀ qQpZb"t0R?H5z"q*WԙZYizo@xP[1b-X0 Bhёގ eޱG 뺏Q>f 2FwtFvڮwv%C܂guv!(Y'_FIKm %{L~~h<=)/ p!h<\ Ձ%L;a|Q0;dp)%"i $Ƃa^&~orW-r  {BREZtjut%DpӈSChUN0+6Al< N""_;B|j{zb7,k5 r*He@sf.9&T`kkPNdyݙR`Mo5uk4 8 ,|D"S9$"w! L$Z(tql_Ŋ/eٻ{aM}h-]@Bob yKX{`m* ͙S?'{J4DO@>a79>^|\R{FiF8cI\n~5V`CG,>\Qj⇚b|0⌈~ H 2Ui.Pȏk_!(1]rV úMGn2z'NDHܣMKjX~p"qC9D"2f/yePV*5 8 f,r>;. 6Ug0K]u0lv= yYFG2(#(PUm)~W['yWUmڡyQnu;mٯjuL=,߬R%Q; 0w\qy>z`rOI*k{'8ʺ{hCHzw=RPJ!ߔZ[#|2E*0k!Qlu2r5x=}FyN\aI=T~oyk:9eTK_`+F\7 /Sl!h9x.q?wc, _0#0#~l6J#򖺡{8w KwwZo4 Vxtj'h͒eEdp1Q R6>+@01̓*ث;3T܃'"L㜖d9p1Y  cUpc9Ԩ7b`mtLQTD+O)MH\6{CkT\>PozytH'53kCܝD"J .E>p4;6>$#K>h B<p=Ni.`^ٞ|A).G̜ 6 ,K" PUYYFzy Hy_9JopNFׇ =V@"+kn~ `_&]}LљI@Oc I;<1k|MUKB:LjaAqЄ&}[Y <$5aW0n7\q$lEl<9iwj z}^eKmd&BdWv`T67.D>LO2lBcġoYGh(djeKWD:wl_RZ&ֺ? @ĪɘſMlYy/7Jc|)QMb!YjR 2,lԡz.[,Oe]}; }:a~`%S$ 0 4+̰ udߛ)J`?4GO$9/JӨ+ޙ3MwYʥ%$VS ~mGAS#ml5p/v!/ PY!uap^D&iSCk-\JTTx("˹h%Zp5jAP4~آ }`99IYp ]sU+3!`Qn18k{@ ^jL #R DdȖ0bc[d+&Gƪ=NRc|Gm_̾.a6!zV"X)\3}{y~M>zi{[>jCG<|GTkʸ_!Bg[RkV(4xS :Ms};,-r`ndCdzuA ĕ=;}K{+-nϟ>~ƖZ} F0۴2pjgk:i"s-RיPɛ7N.MX&mu?0zxË8w,I LG$T$  uGWQΜ\7P@_SE^r_Sf*G]qrE&~x ]OG\lOPGOOK\PD]5B')kpG`a2Y ?9d6>%i_s,z?3 s.sytB~P}kYTRe4 RDZ2cm8\KčKP ,Hf2}~u'^$$;Xl Η[$CAv2WhqR\]­.@vb$m%'=s'Y,"@x&AgZܤec[7xj L [P\UsNGpL'eE$>% '.mibDt ƥJhZy$'mwV|E`R2?fv[&djCݳ*F֗X2PjǍ=5".ը){i3rGujU7sB!!=FOiG;%X0aCsv [0״ZȪnyCC~ Jg;Z- ,?-vÒ~, ~]szkk!َ9@AMZ4褖.OpMp%9t2Eeq>}s~dhۚSΆ8pI"n GtqW8BYlc*`BV$TPT ~ysn- R0,ְyy%WF)$,_vh/k.}``gYY7rh#Ȑa nuL;FFpDj5Tz k5_exSSg1ұ4k ]Jig?aEYs ԝ`? r+u7D  +ndb߶Ic2rpʺ]IsRѦ!F+ {FzkWV!VW6dV%z3S +$8U3HQmu#eF`Y)(͑f|9LNB~-af N(i6 ⾰Sf B]wZ^?oZֈA{i0 ޞ߻7)`+!ZI%myȨaf0ťU*]MY_D$A^w9[:y2̰P*ͶC8NMwj+KN\{T9 dוb~fc T;RT'iPJ:m. rcoKW_[.qͰԞ1a5ADq>a>d Ӹ` 7'G=<"wb s%_,CW$bBR/0 pnѤe >0ZFF  qoK&yK4, dd]rE 9]'(6WlEΔ4W Q&*<-B ?z(C1{V/Y RPP{R !PCizI׎Kh~HyTvಒOösݜ۔ң'=m%&*WU^:4Pgʼ81nJ;{|YF75Th`st>Ý{(V=Y!a 澙# I~$G-mίc62^8?rf5m) 6wNSJu %62ސ<i7su8Ɲh 7\`*v pdqʩc&~#RiًsއH =ֆ50`H]otΏxQnfc>ķzD׏gLC&pXϠ'~Uܐ!j)FTߵ"SzS( v(k) KƬB]BRJ0L[׀y!pn1\$ ˏQoU N͎bw\E4'Sc:_a co ktyYa{Y挧Jˏ6quXbh:3&: Jd9mjG{Mua2 4(oïwwQf,O>㭨 N%>wd)&;@W1A͝eQP/]O<F4 0]J01@9Lh.B T'M˛֪bYeG5۵V@=:$R$1YbOGHaLeĆ͐F;WY(=DK2R"hH0# H@^ i1GU1tV1㓴Ռ2Pj5"2dPSPPe)uVy5UpJHx%7ؗ~)ZfH&(jQ]gʧV(s4of-X`%B|jFbL~ЫFI~ #!8 ٍ624Me> {9sWuǧ%^@ )BTҼ/hF}lTtOtzONW^7^ycSOe+<5qĆ`Itʖ"lOD`es5T3ԩ-UXoUtk;n>ښ$% j& 4Yn4PA?[7t4TH7- + 5w.a'<0\|ꇺ"lfLеO|5+54(?]ؙ!Uj-Ł_xb/Fh]ͣ` HBTjJb=yP JչSD]:Μ,mz{Jvbt'FC{kYS?ׄ$YT2l}4. v9mQj ߕB5^Qcet$!_0\|^^hѤHk܋YS_?((Xu.H~nEE"imo$IJmq{Gi)ơFCg(yMzZ39Q%<[ \cNjj1*#u@(8tП`ӝϜ.k2hDq,`Ά[Tc s94Xtוs {R2 N%piի<] (NC|wⵡè@']´ʗ\A|J4i- NW lN~P>Df=TY!ւj LEJ*t %za`9S8=roܮ\XfDxy5li#9Sj, Ā Vn͆.{ZY4Ure9^<)zV,>i<]Tv՞K>Q)HFZ:[¡L]q t2mBgsr+j`5OA҂<3m|"Rλ5p0@(Z^;HWCe5@7:3/'.R&)]G♃{t*d_^ / Y_5i)@64\ L_Ce{.w&<]c&TJߖ\_7}d8-d=TR\dwMU"6C|f٣I1W F;\tZlN}&$m*G8_lYӋ범zdjX**)(ڈ=K!j3?Xv -{.( )R/0>}`sLqT#(F9 DmyZT3Ԥ0JJ@Dkt}my)]iN4Mv 8Pℬ CW<4$(ycDg 3sY]E"fU/s .y< }@vomij>_ԧ*z~p ofVW( nrKmzONb:٠ Kj0Zɑ'*M§՝A*~(,h-KtcuWKjE],625tMF5`,!qb Ed ,n#p(eK'4b ސ0"::EJw&9t!m]Ptx$иϠ[t$QR*7f[WMk/WL_%/j_xr2%AD1WRYi(yC6ZU3[x;Qn/KϝmXZU+h3_nS{稃JK)iW!("D[dSSY?a2hSarBoUM+gB& .ՊM=) ±G*OY`|qi`9Hl>d B5G7*hH׸PPBe'!kb o5{oŹw䵁MG;N&od7*(mi )$hG&,4^17X51- m h 'lay p+()ixKQ. "LLQ{j:fy;aw1]~ѻ܍,S@dr6vdRүeM7g\ρO:b|=dh&w@1:C1d, ~J wY%MAoP T3tj}NCnJ1s+ˌ JZ*wcV:֑ޒye~h,pd"o'ZȢ\n_IFĪTu$'i2N{A֮)hJ}! y1P8+MV/xVUOs]`+%CQu:K~  LM؛4=! ?'fԷe0Wڹ9coC/?{4vLZZ7ω\up_ jpDZ~CmʪX,0;tYE$$בv2z^,TݫߎPVfR@Q}4h}!S\wAdPPnJ}xŜ: oӼw8Z^FR8= {TI3h|=7gίpIBcP8bh]ٳm`-Xb@1S|cq44(svgoys2g7Bu ʘb)9B '9AN 6ygvvv{ t(Ih. S$X,Hg~;wT8TX.z@'7{dZ#<{cw.D؟̞fFk:Uۏ ;˹ A_]bf!KL?ʘ.W`_׆,nZW.3YwLi.Cpx$K0BC/ 7ry*psxP%? i&t<,AH _#+Y]&zt7jϺ|>nGs?%=[Cun1ڹpjkŗ-thIvh^+,:EX@@x4s>ݞVk.\&;XdE ɏ*5VͮXd8> ]mSR .p GK~ǪpAIjTyUG93;\H+-ڪdRR˕vI`wVFkuS` էn{('nYվH} }VJ#x']Vb%#7w朗:4a:ߟH藥5or6Rk+yB7~Lט)O=A8)Ў(yH2l%]ؔ`V@ORZ#qLh,ȳ| Fx|-PJIRԟT4h$\1qΧ)y\~hy!I04 #5"ͯ)ha+315sH8X3& %;J"ڥoY\m ]}u,ѩup<Ł:A6- 5T`Y $PTxNfC?c'HBT_iPZ,ZbYr+o(Kץ٥ԨQh>) QEk16%yx>hE,OY}=F6qț.rEٲgx[5 Vg6ЀR1ќ}u p5īRE+)G(/$(I^jčQidVg/fݪ=$5t-qtpLXiCZކA! i8rYO2 FV?Ų?`{^ۅ2,\*XABRjڿG@fFRKšOԼJy,mݲQ F)`iۘJq#IŝxD` _q(IJٶNj cYtW=Y4YJ2DРAٍդvן"$I b^,d (HwH hUh5qu"gpn'ĞmqֱV֔6zTx6:9LC3l"\G" K& M,+M4T$sZ% }]XA]+S|Z_-:0HT?01* LSI%J`$.:mbVMԖ׵$<-n%ÌPBD D']ZZ 3FgE:395c{1T=Eym@[ AA{HWu-R!jߍD SwSNGblVb*%K<;S$|s$ьN!1h 2*ڽV1QL_b›VăI`@:y̒ZRuh/E{4ukx+Lbt qCъj5zIt-z!?Pݨ$9p7:V{4S+P 'C?*iGI4{L)%IA퐁g]߫U`h\ab@ &# d]ɍ< |5;%F]w=v !P\Ku%=ni%C$ ̫oHl=LJt1uy` kp-Xb(]~axD6Ps]?7EUTM٧Ur'Z R 6vm i0'147(9N CZh+fZ 1Gxj`$s9 hnHc~֟Iꟸck< ]sjH m n%jSul0[Ovk mӇU|l JkP!<;;25HTL]-!b?mh0c9!}u>3ףL6ت8C IDGF˼Pf}"u5|֥ [`W- -ɤfQ"O yVPfmj_H6B/A.c%"_kaڔ|޼4@^߲0xNM^W{/0mCO]@qft>v3[jbR%mԄ_|NfSb<3AjC!1g;l><|\_=VREx'R(m8vͶx,q2-{[$l`cXP,UWC, l-@>Q_" ؈$i&7קs@\"!p 4JVoYMB}p ٔۑS­j4YZ_@=/R`0g]ąXc:DOLvZΟtvJ7"{]a e `>\{;7Z$ƾ޷ۨC1ʄYac آaR 6tѥn<]?V"~IXڄ^=M`@.v rڞ[(Ej P3TxR?RɾDi&xYL-z.-Dǭ>0.ab*Vy lG-wfЬ߾ ffÐ6E~BP~72g|sZX-Kh=ո C6{EbF9fcH6]-&Bs!Q<%Q’<Юs2A8P^kwZY'!Gg):UDY5+H0uEQ]Qc:L/.qɀ5g*O\4bgl;ړ窯Ng _~riV,]8@ djAsmPWx@%g u~;$w=*n.Ы!?X%DXƟ2ţ;Y㲮BP}(@=MgÚO%=Ov#Z7Wv{EM͔T<\ýC֢/Ǧd~*q{6.qеL<.]g*mn,1\d$N-3mAlFN4e tMpWˁaQi_Oe^1YvC|+G="V2y([=ԦGWcMj0}!lOF<Jmx`֎ w/x|\q3{Wiו|3_"!rf 408%YlV^%S.ULnc`,?K#̀<ς4]g)l:3gnK51+b <|Wz4U.+.l58g3e!$"V^F*ws7ӾJ }gFFI/z4ȇe !Xb}R+>6j) QwM ڍq]-^ʋU]KsJ @(Ng[ID\N; M2f UBRZDJ*)sih&X_~sҮ[:Qw{_C@C^OyԎ3ы]ʄi^D0X{y"^m.T稩0@.Thh:#ܐZՈVE/DS/W$Ǡ%u>@H3[3tɰ",-_!$nc|X;jڒlAb: @S `u2>WaDYX}ySN^!5<}+b !++L?hMr5;|ӪNp7a-KtBxraDiQjA# bpO#L$%`!38xKPh=V͈E:pшH 1;IЈM /@ǂ5com)w-UP `-Ea 1+ xKK?͎45ܐ(S%{ ݯ$ ?GV!| 8UH]~sjG͔KZ%UBRBH d]v/clcCB>9vP[5$4ҸV.Ai~ υޝ X)D쿌: ;& 7\Aƕ\^"cDB@0Tlz1xS ]E[Խquض𝥤O<:(UJ[ Z?\*[wK|Xd@Yb7ӣ6vY4-G/DQV ;:ɚ(ł3ڤj5ݒ:W73+D# xҶHGlL'Z.! -d0_&{ +qi #"*HrxգBY2-eQHm R@r>F2]4[ZBRCY((#+0.[H߯"6kyVW#+)*?w;:UȖ`k>";( pG - nq?ad"lmiH Lӟ;4ka9 UY<ϐPQΰxq_l!5/ ZN4uA [e֧ׯB#9ܩx㖓j] mMhw.R84sQW=9!g!"<͉tCq.RCu0}qlwk2[ Ĉ{[1\Cо$~[|?aBna1E3]1Ԏi![ TjX&@Ak˛,11W&`OYD~\}Ǔf~m<Ȣ8S`# aa\9 I_c)ڱI_4wX3\G2W ?8ԥ5:$"$4>k$p$j]*t;I)E?)]e,S*`2NwMĭsc> Aس51s5* ͡|vw:IZ^?JRlZEWAƢQ=d 55W$iv׻ Hjvi a$['Ώ'i~,*d=#yx(Mt >lWW1yKڇg DvJ^E=sDJ{R<3 **HIljlav}ua |uf+3z0_@FĄf=b|UnJ kJ=t@3ţg\@(HG].(Ѱ[ ўm?.[Oc-r@֋7 ۺayF>((%n5?!L?䵮7 )SzLFcS7nm3Q7Hjoʦ.n\˛Ɠ G('謉;Q)24)@yt]-0 b:+>0ni;.;G]1;X9` GJB0%#}&#LTMzf.H9(*Aa> rv_ wr d6U}QuEwn`T}_[^}-d#ij(z!FGv X\h`) hsS9i(/I &BA ~y7DZު D[J(Buҗc掌 A ByXa<lciP,# Wў3o.&a@^;q "˄>(@ued0 yeEiN3-j8ltoC8 @_tm٠G+ֺ̪qν߈e 'q EzM%|͟_0'`< zRİt3 *$I}@H/|/*j]H |ЮAx@PDyMZuw4wbTQBdhNsz l쫮Lc;"mQ=DsSo~})vqRw1alؽ%BWAa]ZC$$4vb#Oй; Ѥ<`o25>cH(FQGPi$-sN'c1g4 P-$4 "@n-Rl](Cwʹ@v* cgrS:C ^svOFRaI@I5?&& G0:EM3\}0Z]#Mcy bJt;2W%=DB @t|5K5ihl6/I3D-ޏ{@ZS6Ŵ]q&(<쾕7t I5V,gi[璭*g#vj2YuLT+m+c V1 V?.O@RvfY2T0>T*k|| |iݩJS48TN66嬶CPœ^mgR-ISpZ;gEbC•4+kҠW)ؑ Ic,\yR:("9싳&Poz~XM9^P(g!B[8ZoRڳQNs86P,ayh[H5t[xH#!)te bHqb1KM)S+z/Z1A k~:FGt- O]՛C+@+L)b<2dؙolqFyٺ:E#m{ T?(UST–W?XL0u'M Xf`ehu'/ThN~0ԋ8J1m|h|tyXq}oĄFl|qHpB Z 6n:j#K+bWj;kd2ϯ #M--_]RN y9?zs!;* %yc 42t͞ ,v c08nH):kG 4I -uH˷[$([DKtP {#V}43yarxѓﯪZvQWD3x@ <"VguzXARlj tY]ځX .b3.sbRO*D/QfrRشڍEmJ2;KZAop?^hw$.+jfU\Oۘ-FZdXC (ڮGjJ&_} GaDm& a;ٸDJk^C;d_O]$B&pOL #J?qE,?TըAr_2c·AWad  iL ЬcOP؃jsm;:GtLK}w«/W(yՂb!ӛiIG4LjMφm*kT FW.Tlv25tEBXeTrO^]>l;.1C6}}%ي sܙ R3阖;S5@t[9ӫ\3l46lY,DJJ>8 VfB'RU 4& Pho̝xڼGJzPv|j&JQ]1>pݰP#>ܜykB@?(rjxQT6*}/a*-:u];hRՇKf _:<ʘȰLoE#UrKgt ӏP.H'e7M(8olo%XngSc+p JnY~ڝSY{ ^ٹvbP,>ksM&eji*lGJykm+Be dxB|Oo:x)D2Q )GyT=o`Qsx 0v.WQ42@` t CF,--Xm`Qӛ`wBȭ^R pDTbd`ɶ"V sE0GUKg~/s s!_$|ֈ\<)~C\S#lӵf4 d&G S>t:DyQ8ӥ (}f$6L} v\IyOL湕QNMT 7E;;lՈ ݋Cs4br(0ĦiI9Ծ^RAl-33Y:,=YmX"Zd7 /tQ2ƣhq=A]Vt@`9rgAVjWu#-*"A%SsF󻘵EƊs* ^P $Q-r ?]xa2έi,@2?,̝Juվ tX@ͿanK)q -HNjOiB$6A$ώ3Q 'ox0+ ?*b 2Y],P#F}b4'Rf)RdN\S(d/`X&!A:5-+>9.OVG DLF븰gh8d Ha3 C$~ߝ1Jv}ZS럧[(L[Iz̶ͬ#JmO&+dѥ/HJ,p>TNKό7s3=@=FSk6li ؄ePt?b<3OŤ4Y`?? B[-aKٙ`IXuMVf_W>B\>ONzr ISr&t.0 [nJ@ Pf^j8FԄv6k::ݢ~~F='C}rgK &hѹœX֘螱CNIí P ҕ ]i yi<J}Z^g %i(6=:G1+jŒE:PT;qvoql6+tP2DjSOZ@=mK:ף+%iP{jfgzt)Xo`8:2d="d' W(>"(=ŶI,9ÐoSc$g,C+j7.9{B~PATMTWNl,5)"LVyMf#IC|ޑCUV|jL@2\nz^0\-<^g=g$^&ACL\jn^Z-- a*OY5Dh{.5"9L ;$2 .1WXBĴhw-h20 0cP虪~쿛ySzKW^dLfe 9 qik4&Q5xW `U0nar"H4@oit}yPXS L+]6WE؎hL0o\_?yßsCy9k y >/or""r;M5VbO`~řSa Ջ'O P} .Nu Y݌e`8nrsw=cjiRhVp|h(\ xnk-!X@/tOumM440KkG"RSA\Ӑg)y aDDɁ~}^$@J@j >3 YF_1PƦh! :ݸn$96B6}W^mn31!0J _మE{g(W,e%C^#[G?&w3+:.N$/%͡d+=D1)f})|BU륲@3Kʠ':yFWxMDZ$ X-1MCT3[S]>?{&{(r{Hز(x-y\bGsoeνaUͿIo(`Bsƅz&h*N`u`2~DN*dU{Ozr 9eD$H]D7ҳq,~0gQ FKb OXFCg%] EfJCԮ_s-cC[N~XysL~CM/=#a4[hWwӟVٽo ݎDGf $2טJnC0s>bwbQ|+ܨG3<:sKU|%}9@kgN˵p'vy/j!TSaDWdSYn~!iɻQcȕ;?Ayӱx$\9'9ܚ?4|g50ξ:^>lgrQG@BE3x-u%&GX8 W *mf ViG$@vJ`-Mldq[BZ&jG`ضa%!J)~|9/+3}gD Aiɠa>|= Za,P/lKj{e,_=0hB6](OB+p|#ˮѳ|{n= xl`)R'k h:gA(#sjVNw#0B< t1b1[Wf 6""3-!n\yAEZĩkcEEm h֝%T G? y;GӉ"ջX+1g!\ G *e%4bAD~ZeCg#?XmUֆBQdU_1r HdǗq95? ^B!;kY%@IA!Ϡ/\(> &c\w] 81#j6u[* KΜQE٥puUoF5ٞǝ}AN;Cr1l.2\M/ƆPn}PA(A+Kq񖾋<泴 D/VJu./=ǝ _`1MJ݂aIPr+˛j}Q>Ks&Șkh52 2O~^C*'h밼%^Z,KnB~ *"Z&dcM:ɐKqfTmoE% w$ p n46MIbE L7 on8̆~R=郆:ggm|i}3UK!_ƏSMX*M]p)wn&LM"o<\ňR!I"E߹{{>5O tșh n !sQEP*GB7ɼ-yY6侐A#n鷸DDY:<"~"|ڔI 1٣޶LI5t05Z`l*pircF PV E^<=8D:B3.֡]J)@ЫM7\E~뭕?Fr  ay-e+ٱyƴ!Z3޼H\<҈2f/0O/9~c eXG Ls H8"bRSAr8h iۃ[ނ7İ`|,1aP9pCqI!feSKLb^1P2Wjߵ֯J7t֡?Va.RȾ|L;FGng0p+F #37J\㉶OXP) ɋ3"͕@nk.ܒvl"fC~D jGt; sjn &V -}|cV>"Ftt3BEQA !cQz/} gsybR.#iEWHl-Odÿd vnt,0AXuF@tՌ79b\.lx㍹S[ENU_vN)|9#5LHXw@ 4rŅ1o\f"4GoO}]q7]DEF4|.Y:ݎ2.&2{VDY^w/z}I)N'&e/l:ņI|TL5|h'-<HWoϸ]pri\d4d0sGg`S,IMK0ߪEioPz}+g9pPJؓ 6_ ʍxeרӋ*DTlKS)UMp9AȰ}V㒙P%ƮQcj>H4R $OJqNF@El2u>=WO} )GM0 Cȧxt{x^Q.Բ$b Ĝ]jh7!4eȹ+w1+CGT߁jI Ͽȱq:[ cN/ƾӜ7PV`{ X H6}BbenY=Pھ΃P #({LO]dcOat?H,5V|L|YyCCQm Ϋ߭"^s8uqcm^Brupr9 gFp?g_M@Pp(>AWYRSL+D:K݊($Î '螺 vS *101;~ψ3M_ecše.9R@1!>tᯝc>wJ9[֥m}:PAQ|Iӏi7O]Gtu%Wuq ]k!zѬZWf 9%P҆fzKp>~Bʴ31\?ܷ.}tB\>(=6R1}Q"˯P~ݭgD(W-IGe8y!ߒD/G"bZެUF4o OCVy1:Zt6%+[wTDgF1j0gPv9f'Ǚa{;o,7)eʧd̓wk(A /Rt3py٨uH9$A#"=tMV0OI/Ja7#Ư]Df u#OŔ 7OS5ϴ]J(")Ec?8ӝ-%X_$;+l7 23D{׎=fƯS#Cs(#MQ=m|Fl(,Ify0-ι׀'YȎ ){ ѩORGu<_τw4x~N#CQPڳP]h>J6loRl/ GH+86_,%`p%^dϤԱ1f2:X_TJsheh["=j>=yٰ {|S/X pͼ Ɂj;|yj3wK? $nŷEVf|0I3Qg#LRCAwG ّ=) &We/"UV.7LY0 k\A7$Ζ{Y[RmRA\j 5:Ɉڑy [C3=F,r(3k SӳFE4f) :~f$ W˰ z#J_FtpA:&ˍ sĩ6 QEYұh哕QZr~wv޼LMC Q@r06bRHFsߟ_^:0Z_Bݶlu+LvDWYkj26J}OXBjxۍ_tgAzԲJE0E~hnóJ$T3 yBTS|:h)vHn{q:;8֯b}]0= q۩ e5# V 6NeN6;)W8J`4=q%Ś#T$k(cHSE8 ݙ*;U POd6~ 0LŔVrG4)4,x єtI,M dghAXobWԅdEh/j>6zf`%*;@x%Ms%ݳY]elƧ=ك4PM6_qrƓx8r̾(b+䒫 I,Qc5^+(Nd)*gb.7gV`%SJB`bI#o?3\|ɅzՋ@v.3w"HaR@?O]2MJ.=z$~ut̡aQB@:;-8:fy'kIÌk!t*B\jEvty(JP'&_9q_cro  RWFJNN}؉y`^dzmy\J>TtWNR\zKrcw;^>v撄`҃q#BrhR{W kfCz(SZrP)]]AQr*Z *|EsLP)BFW C5K ɧǍZW$a!lgL'0>-IN͑89tSF'dy3|qiͶd}BvLz`:wKp 1i.Jw DFE(Im|j'v/E,ZsUpv1FQv\yv5ocIFw | kK2_"W }R?)w>)ϗ+f3Y8ha8[~@뜼Wmj3a>kٕƝ%oDU9ҟ9{xK(ό ʑ݉.8q5 VPH{FM~H`AbH[}r47B vF tqܵEb` " 冊rt Ր#]2Q)w *Jĵ;A?I;IGȦ\{}$SmIRrI "t"JrEٵFt7.g[P*Mmϳ}Ÿ'W 0wi' \gHP-F;>F߄nzBLc-+jjŠS8[ 9〄?V X 7вPs@2),5,Xʲ:'{ijZFݫ,g{^`#'-*b/ "J)(co_ʬ*g/O`2&!>u& P/g::JDB!:/%Iŵ:r\dJas&$E jFT: O@[~301xFFkq4 2w^i] ^&]@˅ 4Zvp8^uu: ?9hȮϞ kgdʊpiEaڎ6S_]:ٵBp/Suhf [cމFyo`Y+R$Bexs͖%@9[Em ʪzF݃=eluOMU/ 2foVYE>5@ЃJPP\)hk! ;F(7~i~8{5\74b `pP>k0ECv-W,q0EަdT[u/.qٍminUQY  S:o0HZWSJ'b̽*SYԮFW[uZ,?b<)~=.{@}EӝOBMʟ*ѡ.9٩UM4^}#:Yֆ(|=me14\TgVbK,;A\dX7TRLyrB8 _g I9N&%[xKJt i"Bdoz_HT)< ;qMdjq˚iOī><ejޓe@3Vaչ`tU5ܚ~k:"*ᎏd[ Y=m]S< =R?&Iq[kD:)[Cuf!.g.܍pf/:8x)'x. 0E}M# E2gܝI &V[)>bnxI?H fBR(ZWRCKUvZwh9S$=a EK&Qvf[6TA6L@㽻m:S!$Ԑ\2ʌe+hQ(L?;S]瘾uugۇGɢe˯6jn#ǰe1Q|v.Zكe6#:)_1{&)Y ?@1);"-SJ`fǑxYr|2" Tt8N/xk=l՗N={ '_'"܁473#??_aMcN,بQ.{+'ŗ0 &2z0K6F{ALAwVЈ5Hm0ϣIYۈuEYvY9'•O5?lF {~LCu3|Ȝ;4}uWQY%S27s.*&2NMsZT9ndBFĄ]Т>^\]To ׿ˤ:1jBK2gr*b b؆2UВn[X&+iXfQ"r2ßc} Frxd7q16ؠ0v\-XNzDfRį9d]Ka[޾6=,{2&j VuLFYU$>sƖ#Gγ{f8>Xi蠅|+b5jaq)Z#Mw$z)sjgRʒi#ޒJS jL<+n?ŋ|ޞQP/$ݾ2iyM;N2k϶{oeGѢsH9gDP:4+~2IQ|> .;"h=gRK7Z'ۢ ',蔟T:ny0Cm7Vث" f޸\ilΜ"(TU0FG~'H{Fw4)un_jص]Is ͤv[a>P> ڈOCmsz]3ilddtmp'ǠY:E#zf"TI'&YrA|T'}Fz&lD ?/0b6O|VAƹJS:L28kU\J\`f[u/G(ݿdiVyj&БRl_AubAlf,h4] >^ ,;#88SOūaߵO\̈́v23N^AK2?~#)k'FMS d˲y2-u H2nYF6?x^ƶ>^1DA:P/9D6:^s2tRDie4~ R(` x%ޫSBUuQ Ҵ}=6H]=mq?I\-2*lVv}2`|wH(gG!Pq̢Fx=ѹ@c{^GEX]Qϩ Ck.xPr ]eϖA \(1#ۛ襼 gGcJ%sBFpHm;yʞ,SX|XnǷ1_T%¬׆lDbj*K;gͮ|UP_+D7-ef ߎ@Pr HE":-oʗB[ AYkFzE> tnLX,Kvu|oRHu)tX/ ݵLVFFf׫ p4qjRRt[Ӓ.(TtngЁ3^FS m6Sd*D. ܨx4#w:kI φ._ZZV%z5,*|s5,e/(?>d#ySSv@{&'3)^&q`vk6mφ`eYo0m{v=7O;e r:lnCwBR{zw^KnMe ҈ Y\d$[U ^gڬd?zdYqDz@Ā-6C0GVan,dڎ|0J4(kMcpoQN+ sdLw)!-fU@WSUk%#[D ZD3rއ@j+NŊXt8D/Kol5l4 r!.2pU Xˉsk7/' %{ӰAw9A}!F>%&y,{,?GFp \rF (HĨvi QwV^n '.Ή4o6|l (P=f0[|R-ʇ"STҫC?׼9 Gc@+f/R(R,'ka \O '*F*3  /O|/V{6pS̵vk̷Im rĬܤ%A+׌ɑQU#9m'1kJZ,4 W>;.MAewx -=n&@lR9wrRpѕR~pE!1yGNU_Ƴ̠nՠzɣ 1%@",Q!!k!9VHa"R岙VSF ^c]z 3瑋܃?%{Vv赃ke.W'ˇuiu@3tb)l' R1כ->Y &oubgl#aƍVدuES>c`ei? Z*$Y'R;Q6ˑWߟ^巣),λANv(LFwJĬuuɲvX`f5bW^#VZ)U8{S@2^jGkQc ɥ2".k&4iecC~Q'#z o<@}$G@̇n}YKG1%  9*jBH mFΖ&pYMq(t5@se,u f/wj߭-`zirۜ"v)VDSm0>[f/ ݠqV-U|UꔩYE00duAqĆRʰur$1J#tIE_O~+ ȑE*Y)[HY@+Sڷ U)M3nj|@tec[F;*h \gs1vstrz%άѢJj0M3ЛsqNbjYc|?ǣ5~ᷴͦkPzm~|wA/zBYG c4}4Y?rS*xVZ1'=[l@Lo+"2PnoppG>T< g<ޥKUK5C*}/7CiG1D?%䀯cUF1w0e)؁g8=4ct-5-D5h"^&ZoJ ; 4j#HBX tg*s,Ai-*K:7삱S̉z]"8 1!ʜGF iyޘ*:-Bݱ0'QzQp 5>/nx[ng0MԏdPZ*u;K3ŻZtbLD) yC>}(e8GH*"J{j#y.b }b jΫ8=Sk'#uYHZ]SWΏ4o$MxOap =+M^iUkOdgr5_O*S/T wR{FRtO'Z8 $G`=ƂM:+ ;qUbqpT;Ya<s UȪddRŁ:kS4Їi m+[/{]ː)֚Ohe0f.^q/F7)l_ߙz턯@oeKSgN~eW; y>;=?>^d^21 rYYL͛Zl FؚO9`Ԡ}yUXd籮F10츆/~l__N ';$6:R6H~_Ҹ" B|# |I9vJ5Ԉ{Tpϴ b})_w:%r3ti˂hxٖT7(%Czh݋v!;ck"+]ZGh5I"^EVmIL~a!ۊkD+yXL*>7vr<-LLɺ=6Y{-9&_/_F K *Rd#p&/t͚xJԵ֚RP50dBQ&--y ӵubs}bn'C9k}򦚔(Qd0^ԤmrW'}36@9Di 9K$׎p cUGh$Ԗ|1-y VN2,H>s+>C{SM~`^6$cQ6Mc)J3p|7uDN *=X_М$5$uhkզWP^' 0OQՋEB|69:x鎔D*fq)3gsyV$\]1mCD>'#sW;ܘxz"Uŏtn?êC(N%bS vLIw1)teK:Lܗ@(z`BNfbπ|3=ԕS![f6iO F>㾳2ȒYp*F>W_x&gI(`RI|YoO v4T}RreCK K+m*^KHwIjNOs)*KC ۢ/"Cm}c)9>HVťhe*ˑjˁN( >`ȷOլ(<Ɓʫd !!`KRzEޮ4+Ynd VJx΁WDF끥ʡ g,46} l^2sA\25 -uH-\l>4!Yk)8S &qa2mg`YJ4HQq'$&PeL?,_s~-} c_?3g(F8^5oQr &E #)NvոMFw% ]S2X/i|魁%pyᏳؗ- nNgnKjߍçҾ|3uS( 3{e;/f5Mo9BY{@vzSH`aCI.B]ˆ$;s+&o}~i0G{ۋ8uPX%KT3I9,v-~0ָ}Ou@1=`[U}Oi, (,G-rkEqQBh>rY*_1m0iLz[x)WyY2 n GoSJ%&[Y*h[/nP|B0]bx ۟qn5՟WeϹ<X5BiJYskL4^ZBdi^R(`EiILVDuUho:R)ٵHbbcޯ-jx@[+(E;яGt ży峖:d~bxGMB bTz:5G aj¦6Fd?Q "N"Ab$?j"U˵d%=G2^¯IK0d|No˩y'g0qWD-C,9'z[T ;<7zƾDbtcU)s{S0k=tr~(}BV- uBˇq +q/phJ{5 iRs?apPCNxʌH.uO] ˤWG*:e4}#)hG H>e< ܹRSLv؜dW@lJz;-cw^?u=󕣦/ ?T#uïy-ǟCwB?ZS;&zo'1t1hnڢǰv*C4|)ʪp4z,vzkt9єP#7,-;yq̵crL^aeȔ"h-Q"}tP,[IZgyC]AtKx佭P$z) .H;i&8B)&6n|qRh6KM"#K gLp=f htk[ѱyX P1nb܊| h5ɯIw@/u]R|&)ER'3^=>6ӿ-i;c巸%USF-T( vaB %RA;*R]=)oO`bc LWEa> 8T2]akOv5sl)ܭ6$Hkǀ%7d 9q+x@ELʸ=i8ϱprR,ZOómaX]=Ny3PMrY9n@veԸTz+1fg=3c8?0^ Kݳ?ZRU.uZaJ\vהDP D>i]M[Gn/6<=D*Cs|)t_-v4s Ϋ!ڑPy4Xj |wjƌs]9}Uau1ox#h@ÚR_u( Q^ej26 kgW`[)ǃ\w> u/ŝ'$MrCjt7޲J]sjè.27 D|v9a#ɹ>sӃ omDQѯ׉<5*J"8ɰf@).ɴաdhcSQT1B uD6)ogCms,T-!sG;ROd$Q|FޫV!CZ.#$8v%LC$yde St6}ݾ{ԍkId@ڌT7mw'˚O>D3E! 'BTŅi^`37zzβAv _qA]OOR_ uYDULʏ[RE^{Zf ,#Mx+)(^9&&( Ѕ*Yԍ .i u=:aՇߌA컋:&q-/\'Kd);K]|띆)Q)hyYMrMBږa$7`ajUۨavI5H{]-5qUZ?4Ӥle@VnKRuo7.D贑x츇w5I <.EVȩv=d>,;FP{ 3 xBѷ[]BLbaWNg/xU2.5l[7`A [#7O̸zg7WV)/yw )Jg_9xѫ8rgoiY r}=ScEڞY;mqXiKrD^җq ;.ǂC8=]N) w֟*.V5D1(j'm6JUWę e/7`FDiV/!Jfb~lg-ڳHQ<883βWYQ')U=WQsE$;EV Uf_RF3>r5ͤ'K +(ۮ%K_+sc/=M3=RR/^r޸L uy*!w3j=#CYgGߖ"V691=3{Qۣ[MIڛŴ*䇕*!\;Zi%xF+Iɧw+CwW:e9Gjƫ ag)/_=H0ߑdrlD:BImjQŷW Km[g^+\9)#) ⫓->f7[`Gc̕i GE'y+zO3EzM o8@J'=&g9OnAfȊdXqߴ\F((g7ˬ \kLg6B2'[~QgtoZS@,T :a]ymKc(! }^ᮘ+'١IaMQ(=sȜQJO 'rr6Yt\: Z=F9l=5}sli(Mp)z@2^"]g'W31t|X+W&]JsէFV;XuK/5zu%y9gfANA@NkŽN+ơ8:~4 5Z/C#oۓIt*+j~}4e;K}M5?0 =N%_m}Y$RǤY=F%Cм%n F%[ HƟi\ҡiRKaZq'arPRϮ7&;IEZԏfԘ W/Fͳ/8O騙 {KKjld˿Ͼ4=>`XNJZ_5G!#QUNߊW Oɔ_ YYx.[iI!Zai>?:HS 譖]NC筓vߔ VrEm`65QK ot?+&$D.,b or!g^ k9x-(#V WD "/fS]m+̋,Pbf;U˜|c +dqzKw[r:bFLN[y5lnѾ90GaFL:l(I\|vs(CnmtnYη0ia*ٟ}ۭ|Ⱥ\w,)nw}i~8` 9!߂n+1T&hr8<!P8L* TWJXKZY80:ak햎W&쵣=cZg0 P`/E|;c2^=^a43r)"sl*ud[)s>mS鸷7>zRU[3mR@N)3"6ݒ7N Pky[3t/vCs&?gD<;M4.Ft'j-+Gn3BIY%r`fM,H(<~o "|6PLާ!uXt-$v=5njǾE{##krjj^}/ɴ1_=،rW󙬏Lņ1p`߻Y1( Ǭv gwv~xe֏봛x'2S)aSiF ?&4i^n(~_쮎17:B(%4Fd_mZK؜BHHж&)5Fp#/}ʬ:))fnNlǺxs3pvJY@:O7ʢ ۀq^[#;ii&xJѐC$=!ߪ/{&Dc7S =K שEOZw'=xKIac?I'2;ňw]7_j+Glb"ȮŬ˼1'RF843 Za}#yr@9R2E_mζfμjMWhicѷbO6:W5J}nze*9s6eUh_]b̅ҥgxQ3~D!ݯ;d6ɵ[GίR-o ~ npkqd{G58IrZhYUYmK rN]ȌbW$YpSDfИlj>-5V)e82}oQ/Fj9^4t4³6Dn>ZmpQ6\le9H F')KG ly0K|F^{.}ߜd+r8>E+%`?hddʾRLbCXP0hCI h-mdFβjFJ!j?)hb$hO<&ӵOd}["< n@%&FWƛ>Jh9zxҦSӐ?T(بkT1?/h[ZשV} w8$r͞Yf̫L۬sS`sg@OO5T?D?ec-G€LY'd9g,c9*|3}/bҖGdjJSXo\#hQ@'SLs*vLҶZ*C:]ĵcuLPVTolȅ]͉qPt|Zd0z*J/>xщ&5!bByy9Jd%wxŽګpU:WQ^L1*6\jwg|cڽx3# ydb(^ K|˞4P.3Wrk +xgSvz꽦pgV1#n}~ -ZK3 !dʧ .ޮ%pC%C'ig:k;ߜgN G#v}q9 ?b>f5 vfwA瞫|.L2Z:4Vƙxar8v_ kCrku qiAc܏j!DХ_G9i3l;zY0 И@3̺?u3G6_7t3M89PAaS"D^YtAca硖,ᴩGu1+|G!3td;V bKnb)_6OW@+Yub,ƦxԷ3t|JwZ:h8^"1Y;5.zU#kKLw6`菙.<,YFROExD‹b?C̃m]r\X|!|4a1są?˓\/V^9kjn:W˹;+X7.,fs𸛫ڒ~OSuR]5r}>HX-u~[)͆]{BUCOVކ\o/PcwF=x.¬۪e#M*<0{ۼ(@r,`;g{Et"fR$OX Ee{pn k/7[!bdJ8r)9)B *!ɒ^|'M{2c壦sI. [(q%4B˗~2{<#dd+,={Kw]1EЁ~鄬9 .txhz9$G|ZWgu ^)iKmĴа#SK$LǵTvx$U<_p|Pitb"ݙ2UgѸ|05mqC R~|WNz%Ϙ%^jQyyc4kv3+296qs7p\^\謾ڟ|u3J2zsݖY~VUum#'}J4[k3*''^kT㺃`` Y:" gqOG ЅB:ֻ)]_cMw\^5o١zTUX <3@`،c {Q }" .gLMuW&/a fuJ3'JtVzW}2V]ʼi 5պ%V:Qt XQPU{eOXUeWbSLXN40uYꝶ?=0vicc|Dm1~!؉鯾--tUtƋ5?xʹ:8.<(@he9f!C3oʇhK*)>䂒0[Sϥlv%bOXsY(ەnFt|=h% ֫͞KP͇cNϸ[ޒ$~ M,κ+^5]:E]򲍷rO3^ㅈL;{^ I kiVmD"lSej`#_S_=`-w޹' o&/DV @ĆSX&hxx}ӞMզWk-&Q JFD0"" |'^ڦ )Sݿܢ%Xly>ryMmȻ+KG{zwYa%f^`2}N.ƛV7 U?t!. ]$ AɡW(objwN0T[i<}1ERH$!t^~&h0j̗+Lc7q G J`:AEc%ƻ-Vsi#~UzlĉR"4tʈY͒i &OgһnҊ%xzfufb3x~kJT<ǷoDȐ"~ ((}'لO!O})SV?J8(OyO~d!?os'_(BS?W!_'s~}g~s0' ?Q"eu&`L =)*p,ܜ;lN`z? "R*lSWHt 6;g;ca iCIȘ/NB}ܜ?P}>qfx7=@|᯿?;zejz jFt}fM';~{י49@ Շ]IGԘ(v##K'WCߏ*~ zϮx>n>V^.|X`Т,z%KrDMpO `ף#>Hp/KѨ21  IL}u{l']"59uҪ3DAC+ xct+DD*zBnSU"]ei(_*D@zYT@8* +#^*U_AaE?aHT@A`Q DUO%+JPR@KJ,JPR<4@Q4 ӡ%yP'hC#FZ(UJ  U h)JQh(ZPZDM`{ tTҥ RrдSBtRZiЃGB@ԉҔ%+BBҏ#H"P@:S)RRtB#M*:)]+@-w(p;/dN@mP- G@U( Tҩtt()EGM#M.5MA3lIhb*dJd;vUZt)iC"h(PP4 B%iS@ #DT$t ɠ4 Э)N@ hHr{ 9#@B cCR4 "RЉIHe]Th@B)@4"BQJRJ4"H:iFB#@QХi @~6{"R4R)N!@W R4]NI(|rQ T4-.(ZhKC" J'%iTҥR/P 4ЩHRR*~*CB$J>Ё^@ SID҂hB4 h@ayih))P*~PP:@}474*'at  4 CB>E)CJPiҩI@!R*ZD4et Ѕ#t}@}HhRahBM @xT4 PJP (H)B CJ@'@ eT)yiJi@4'ab@{ Ԇ)4(:4v.Qͅ) )ZD]ROR'rJOJ 4)BB {å@!FB4Dt A<R0%(hS(y*:CT xH( ]!SKH+J=OqUi6bt%IJ:t)M<䴪B4%)iihZI@D(y.䦝t(`iM"P *PEt*Қàԣ@ P T%*P#KK@ {Ga4/`G@*4JQ|y Q9SJ)JR( AЉH{:(= _RB )J9"JvN+#A ^P!ROR9PrDЦ4(Ё{H4РDZP;aNB4 ͐)  /=A;Ў9!^r{r tR iJ֍iGZѥ)CBiJSCA `ӧJ!@94iTBzh hOr^^NЧd{<#5MG4)ABR-!7$> 0 C)SK<])UUUUUUUU}^R$;P4!vНO,AМ%qz=>CiOrtRkგ(9#@4ojȧ+'}Wd|J{X9(SFiOPtI4y;)FBt=ҚC =%4:^HJ@v)O^ h=%A{OtPh<=J>Jh;O )< _9΅vM#Ai]<#Tv}s~ !O =򝠓g; +M'ay<>Cڗ*9rvBi4=ΝJ,G=&'ۓ( =!~C%W i=^Myh#b_hav;>A}䷘|5)H3;`}Z)@yd(9 \hv<:IM4!/W{%-w@^Ezˠdy'~R]<.sI? 3F]R^ds'3(L{x!=AM!GrNɻ9r(ѡ^Tq|!D!Hh7' NAl$PrcN}RI;Q QC[p~"C$QB OjJ9hכ C[+ |Ct)?n l`׵!ʇg =Ss`ngiy}6y`4moyyrKmN<ӣΊ_{ۛ'';֮Ulih֎%pIny;zsm۬r9M{\;ۑ)}\#CAl l'#ͽ̭/$v EkVFsm(bI>wq= [Z"1:Fwkg[#GͼCZ+Q==8D_-?/^SQ`6˘.vPb<"Ʒ2}{^xd_ ϗcʹabE31QGdWc}Ϗ5^֊|o4pVyn9=rS;b燖979ss "y|wDUvϣ۽;hQxowsgr v̚ulrHc{|xrю?bK>[kKE?]{˜ wz%3T(Od TQznj"/5\PkJ֊mn@P1PE URF;Mh4К|٠" ;>IKjN;%vyI'c^ːr}J=e|8f4{}P3Jbi9'vC4.J5wb9M,HQߞ}Pkʹvl9\gI<h(1ruS RSO>.`5 WURPCEPUHQ%-NH=41!Q\JN@{F{TS@\ˮiCJ ݚCN.Zh >_/ 9Sy4 FC24 =@s<%#J"T)(iBtH:(B. 4htSB&9%y)ZBoXWJy~9 HQ ]z9 (H;*}ry@hU4 hi_;*Q_#H)H-4 rҔP^кC4e "(h4 vQ-!@SB"iPt/$9'`Д4?MP@q+_ NAB 4DI4>y| :Hm@i)9 (M KhCHSOyCJ4 t U P4:DM%P&]4*>A=H $L@1!G!{4'"6ΐr+HR)+@A8****ʂ Li7UD@;wjQ4|b` OUr$Y KS/7*QٲUIi)zNxO9,בqS;{ 6jۚW9""x D b-T=n~r^r{PxM_a[kfOzƻq{Q;Bf"̯U7vZ.ԳWg?6(0^F y'nSl/?vk/KKkv‹$/'Kw,w%jNyMNhaa^ɣV[َcir TJT 2OLh] |7Ud^b_Qq &9cdn…5bh'إ5['PeK}:7/BNjAAosVO쌦}%(_8)0H@7!ȏkf^]fN8v9g-PdPlQ, ۍ4mB8 ]i3DC~Ku-16a]"NíyiTC|y ,/UCT+XTZ Zzz?WcƤG9@fM7nz{Ԭ?+D̖6061]'1Y~.WWnCG0&\M?El_pMfKDnDo iFoG*x^W5OΦ̾(PM3#U [zو@p.@hg-+z,7}49kQYf"{틉B ~8)C7k|JFN(,m{) LlC-)l!c _ww17h W<.[<F)fYr֩O`x_'Ӌ}Ni3[t[%F 9.o T{?8SZ&ErQH|Kq滶D:ٗƿ^l̊dI0&J]eU?Y+F2?[F*9ٸOM,a(tbG3رC|бJjg#B;V7 YBգM?'"YKF_V`O8zAC3}R8czFNF#$suk$mU2 ?Bhx!B*,,B"Ș\غ W;O%S?ܑmIcD$t&LE7#F=H ڡ31}SDLDGM~mgs^xse eW@jAo%\!!j5BI˰U[D\s6 CQI%06d W|Zr}elAJqEj w\?zV$O%VX$ZM\M^{5a7PaT s9@'OC+iR]VP@BcuxRG5g4**ܲE2?e@FxEÜ$gqG*ڬIhɆ2; Zqmx\o F Art8fM*2Qjh- e Ӄ7G\fQ}?ĭ LKEQlv M,z R_>%%{(gPbAӇ#!{ krEgPfUln^t*֊<|ֵ˕6iD74"<: }E%]Ҽ_-ɋPlCv];G'H'+jDљQss:F*55~ \՛5'2yj󭨚`pNURԢ%"54#?n mLB$1] "\>^0|j3u:2ƺx10'hژ'ƕ=7@vSDUK  YA.`}HѮqmX sLOR.!\R"oaDwR2|AÅ5Hy*UP4=0sqB&#_". ۬`S̰\-P6`Yg D3%ݢB6, H 'Kmg#IAUT\iiYQK/!^)Zp4+xS,SD>8O=Ɵͯ۝ Sxps@E:.gndȃ585'QO<1c $E Q8Nmuݾ1qL"e?2TPE-_2hY6yC, w2N'YNG_"ņm*c1t'H҅h֨Q8?6I*ŹNnl$rёyg&N(u߭1L_OOvn w!K.ܨR&L 2/ q#6\Ts{ HN~ G `bz-KnBWcU.mY̠@~" 0oR"drscoeAԝ{?2_"[1?y_h25^uݼeotf]*Do?NsIE1V44&((Bhg#_`B;/koѠIQU Snw\T II^>9SkldV"Uk`WE2ns yɛVpç>>t>Z@ -*vv2[~ǂzP`H$,B5a66!YK:S3Ɋ?fޛI1.Ѱ!r5(Z9cP=BfX^K#ZajCt}ɗk6BŶH呺~R7$iX%a x8UL_LݲdUTY\ }>Wь!7S/Gqw4`.,5o3Zᵐ|e;}H:c{M$ƺ0#1^px5!̓ z༪`lKo׎-y@up6Xfy}wsݴO".SCO#/MLuš?l% ֝6~ ΅}5A#j\.e$lΪFKʳ+iC'7{fcw:6-Q !mK|0`'7}P-8wMW мzƠYq2z%kiH 9ot-L{OXzO>SZ3o4&f`*+XzI3Z(t5΀V%X McOP$dozHv#AExT~YPTU7A0I|c/lA,,XE[7eF{8XԻ~Y. iウ(iJ Z}K}zSx:hČP.@ ZF gCg!7#B$MSD-![Qm& ExXZ^I&A:ScWۨTP yk] 7 01򄥳ЍD3ZaUVɚS'~1kQpo8HK:|;Z7:'>*;<|4*Mi5q!*K7ǮXinb9&ؼ8rބM,w oes9(\SYL*Q_pYKY{XaqEgB*EiVFsNH rȣDTǬ3B O흾k)H'*a7x Ճ!$-/J:͞%X 5Q%:onI'œQMoh7FrС8ϝPI2x{ ~H8@hW¿”#o̖h)9e¬64^`u!&}_)F,<@ ]Ȗ<RoےqXzJf | `S+T3T_}m~HvSi+nQVƌ 3:IqagMI󮩂oi&D?H~68e> sՎJrksj.9*w"(HiG7mutoss/data/notterman.grpLabel.rda0000644000176200001440000000020114404061507016735 0ustar liggesusers r0b```b`@& `bN /)I-MK/*ILJa``ʨ@UQ3Q-',5}59'nZZbr X? 9S9mutoss/man/0000755000176200001440000000000014404061507012360 5ustar liggesusersmutoss/man/requireLibrary.Rd0000644000176200001440000000061114404061507015646 0ustar liggesusers\name{requireLibrary} \alias{requireLibrary} \title{Tries to load a package.} \usage{requireLibrary(package)} \description{Tries to load a package. If this package does not exist, it will ask the user whether the package should be installed and loaded. If the user negates, we will raise an error via stop.} \value{NULL} \author{MuToss-Coding Team} \arguments{\item{package}{Package to load}} mutoss/man/tukey.wrapper.Rd0000644000176200001440000000372314404061507015474 0ustar liggesusers\name{tukey.wrapper} \alias{tukey.wrapper} \title{Tukey HSD test and simultaneous confidence intervals for all pairs comparisons...} \usage{tukey.wrapper(model, alpha, factorC)} \description{Tukey HSD test and simultaneous confidence intervals for all pairs comparisons in factorial designs. The procedure controls the FWER in the strong sense.} \details{this function, it is possible to compute all pairs comparisons for expectations and simultaneous confidence intervals in factorial linear models. Hereby, the all-pairs comparisons can be performed for user given effects. The overall variance is estimated by the linear model as well as the degree of freedom used by the studentized range distribution.} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{confIntervals}{A matrix containing the estimates and the lower and upper confidence bound} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function.}} \author{Frank Konietschke et al.} \arguments{\item{model}{A fitted model, for example an object returned by lm, glm, or aov etc. It is assumed that coef and vcov methods are available for model. Usually, it is an aov fit} \item{alpha}{The significance level} \item{factorC}{Specifies a factor}} \examples{data(warpbreaks) # Tukey contrast on the levels of the factor "Tension" tukey.wrapper(aov(breaks ~ tension, data = warpbreaks), factorC="tension",alpha=0.05) # Two-way anova with interaction tukey.wrapper(aov(breaks ~ tension*wool, data = warpbreaks),alpha=0.05,factorC="tension") # Two-way anova without interaction tukey.wrapper(aov(breaks ~ tension+wool, data = warpbreaks),alpha=0.05,factorC="tension") tukey.wrapper(aov(breaks ~ tension, data = warpbreaks),alpha=0.05,factorC="tension") data(iris) tukey.wrapper(lm(Sepal.Length ~ Species, data=iris),alpha=0.05, factorC="Species")} mutoss/man/BR_pi0_est.Rd0000644000176200001440000000243114404061507014575 0ustar liggesusers\name{BR_pi0_est} \alias{BR_pi0_est} \title{Estimate of pi0 using the one-step Blanchard-Roquain procedure} \usage{BR_pi0_est(pValues, alpha, lambda=1, truncate=TRUE)} \description{The proportion of true nulls is estimated using the Blanchard-Roquain 1-stage procedure with parameter (alpha,lambda) via the formula} \details{estimated pi_0 = ( m - R(alpha,lambda) + 1) / ( m*( 1 - lambda * alpha ) ) where R(alpha,lambda) is the number of hypotheses rejected by the BR 1-stage procedure, alpha is the FDR level for this procedure and lambda a parameter belonging to (0, 1/alpha) with default value 1. Independence of p-values is assumed. This estimate may in some cases be larger than 1; it is truncated to 1 if the parameter truncated=TRUE. The estimate is used in the Blanchard-Roquain 2-stage step-up (using the non-truncated version)} \value{\item{pi0}{The estimated proportion of true null hypotheses.}} \author{GillesBlanchard} \references{Blanchard} \arguments{\item{pValues}{The raw p-values for the marginal test problems (assumed to be independent)} \item{alpha}{The FDR significance level for the BR procedure} \item{lambda}{(default 1) The parameter for the BR procedure, shoud belong to (0, 1/alpha)} \item{truncate}{(logical, default TRUE) if TRUE, output estimated is truncated to 1}} mutoss/man/rom.Rd0000644000176200001440000000325114404061507013445 0ustar liggesusers\name{rom} \alias{rom} \title{Rom's (1990) step-up-procedure.} \usage{rom(pValues, alpha, silent=FALSE)} \description{Rom's step-up-procedure is applied to pValues. The procedure controls the FWER in the strong sense if the pValues are stochastically independent.} \details{This function calculates the critical values by the formula given in Finner, H. and Roters, M. (2002) based on the joint distribution of order statistics. After that a step-up test is performed to reject hypotheses associated with pValues. Since the formula for the critical values is recursive, the calculation of adjusted pValues is far from obvious and is not implemented here.} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{rejected}{A logical vector indicating which hypotheses are rejected.} \item{criticalValues}{A numeric vector containing critical values used in the step-up-down test.} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.}} \author{Marsel Scheer} \references{Rom, D. M. (1990). A sequentially rejective test procedure based on a modified Bonferroni inequality. Biometrika 77, 663-665. Finner, H. and Roters, M. (2002). Multiple hypotheses testing and expected type I errors. Ann. Statist. 30, 220-238.} \arguments{\item{pValues}{pValues to be used. They are assumed to be stochastically independent.} \item{alpha}{the level at which the FWER shall be controlled.} \item{silent}{if true any output on the console will be suppressed.}} \examples{r <- c(runif(50), runif(50, 0, 0.01)) result <- rom(r, 0.05) result <- rom(r, 0.05, silent = TRUE)} mutoss/man/fisher23.marginal.Rd0000644000176200001440000000104314404061507016063 0ustar liggesusers\name{fisher23.marginal} \alias{fisher23.marginal} \title{Fisher-type (2x3) table association analysis for calculating all marginal p-values...} \usage{fisher23.marginal(data, model)} \description{Fisher-type (2x3) table association analysis for calculating all marginal p-values} \value{A list containing the m marginal p-values} \author{ThorstenDickhaus} \arguments{\item{data}{A tensor of dimension (2x3xm) where m is the number of endpoints (genes, etc.)} \item{model}{A model object indicating that this type of analysis shall be performed}} mutoss/man/mu.test.same.data.Rd0000644000176200001440000000065714404061507016112 0ustar liggesusers\name{mu.test.same.data} \alias{mu.test.same.data} \title{Tests if the same pvalues were used by different procedures.} \usage{mu.test.same.data(pvals)} \description{Tests if the same pvalues were used by different procedures.} \details{Internal muToss function.} \value{Stops if different data was used by different procedures.} \author{MuToss-Coding Team} \arguments{\item{pvals}{Data frame of p-values used by each procedure.}} mutoss/man/Mutoss.Rd0000644000176200001440000000235014404061507014141 0ustar liggesusers\name{Mutoss-class} \docType{class} \alias{Mutoss-class} \title{Class Mutoss} \description{A Mutoss object can store the input for a multiple test procedure and also the output.} \section{Slots}{ \describe{ \item{\code{data}:}{Raw data used in model} \item{\code{model}:}{link function,error family and design} \item{\code{description}:}{a general description} \item{\code{statistic}:}{for Z, T or F statistics} \item{\code{hypotheses}:}{of class ANY} \item{\code{hypNames}:}{identifiers for the hypotheses tested} \item{\code{criticalValues}:}{procedure-specific critical values} \item{\code{pValues}:}{raw p-values} \item{\code{adjPValues}:}{procedure-specific adjusted p-values} \item{\code{errorControl}:}{A Mutoss S4 class of type \code{errorControl}} \item{\code{rejected}:}{Logical vector of the output of a procedure at a given error rate} \item{\code{qValues}:}{Storey's estimates of the supremum of the pFDR} \item{\code{locFDR}:}{Efron's local fdr estimates} \item{\code{pi0}:}{Estimate of the proportion of null hypotheses} \item{\code{confIntervals}:}{Confidence intervals for selected parameters} \item{\code{commandHistory}:}{commandHistory} } } \author{MuToss-Coding Team}mutoss/man/twostageBR.Rd0000644000176200001440000000301414404061507014726 0ustar liggesusers\name{twostageBR} \alias{twostageBR} \title{Blanchard-Roquain (2009) 2-stage adaptive step-up...} \usage{twostageBR(pValues, alpha, lambda=1, silent=FALSE)} \description{Blanchard-Roquain (2009) 2-stage adaptive step-up} \details{This is an adaptive linear step-up procedure where the proportion of true nulls is estimated using the Blanchard-Roquain 1-stage procedure with parameter lambda, via the formula estimated pi_0 = ( m - R(alpha,lambda) + 1) / ( m*( 1 - lambda * alpha ) ) where R(alpha,lambda) is the number of hypotheses rejected by the BR 1-stage procedure, alpha is the level at which FDR should be controlled and lambda an arbitrary parameter belonging to (0, 1/alpha) with default value 1. This procedure controls FDR at the desired level when the p-values are independent.} \value{A list containing: \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.}} \author{GillesBlanchard} \references{Blanchard, G. and Roquain, E. (2009) Adaptive False Discovery Rate Control under Independence and Dependence Journal of Machine Learning Research 10:2837-2871.} \arguments{\item{pValues}{the used p-values (assumed to be independent)} \item{alpha}{the level at which the FDR should be controlled.} \item{lambda}{parameter of the procedure, should belong to (0, 1/alpha) (lambda=1 default)} \item{silent}{if true any output on the console will be suppressed.}} mutoss/man/printRejected.Rd0000644000176200001440000000137614404061507015460 0ustar liggesusers\name{printRejected} \alias{printRejected} \title{Internal MuTossProjekt-Function} \usage{printRejected(rejected, pValues=NULL, adjPValues=NULL)} \description{Generates standard output for pValues, rejected and adjustedPValues.} \details{It generates an output on the console with the number of hypotheses (number of pValues) and the number of rejected hypotheses (number of rejected pValues). Further a data.frame is constructed, one column containing the rejected pValues, one the index number of the rejected pValues and if given one column with the corresponding adjusted pValues.} \author{MarselScheer} \arguments{\item{rejected}{logical Vector indicating which pValue is rejected.} \item{pValues}{the used pValues.} \item{adjPValues}{the adjusted pValues.}} mutoss/man/mu.test.rates.Rd0000644000176200001440000000062114404061507015362 0ustar liggesusers\name{mu.test.rates} \alias{mu.test.rates} \title{Tests that different procedures used the same error rates.} \usage{mu.test.rates(rates)} \description{Tests that different procedures used the same error rates.} \details{Internal muToss function.} \value{A notice if error rates differ.} \author{MuToss-Coding Team.} \arguments{\item{rates}{Numeric vector error rates extracted fomr muToss objects.}} mutoss/man/simulation.Rd0000644000176200001440000000610014404061507015030 0ustar liggesusers\name{simulation} \alias{simulation} \title{Simulation studies} \usage{simulation(replications, DataGen, listOfProcedures, discardProcInput=FALSE)} \description{This function generates data according to a specified function and parameters and then applies specified procedures to the generated data. The generated data is stored in $data and the results are stored in $results. In order to recognize which results and generated data belong together every result contains an element $data.set.number. The data generating function must return a list which contains a list $procInput. Every element in $procInput will be used as an input parameter for the procedures provided by listOfProcedures.} \value{A list with 2 elements. $data contains the objects generated by DataGen. $results contains the objects generated by the procedures augmented by the data set number and the parameter constellation.} \author{MarselScheer} \arguments{\item{replications}{The number of replications. This means how many simulation runs will be performed.} \item{DataGen}{A list that contains the function and parameters for generating data which will be analyzed be the procedures in listOfProcedures. It must contain the elements $funName (character) $fun (function)} \item{listOfProcedures}{A list of lists which contains the procedures with their parameters for the simulation.} \item{discardProcInput}{A list of lists which contains the procedures with their parameters}} \examples{# this function generates pValues myGen <- function(n, n0) { list(procInput=list(pValues = c(runif(n-n0, 0, 0.01), runif(n0))), groundTruth = c(rep(FALSE, times=n-n0), rep(TRUE, times=n0))) } sim <- simulation(replications = 10, list(funName="myGen", fun=myGen, n=200, n0=c(50,100)), list(list(funName="BH", fun=function(pValues, alpha) BH(pValues, alpha, silent=TRUE), alpha=c(0.25, 0.5)), list(funName="holm", fun=holm, alpha=c(0.25, 0.5),silent=TRUE))) # the following happend: # Call myGen(200,50) and append result to sim$data # Apply bonferroni and holm each with alpha 0.25 and 0.5 to this data set # Append the results to sim$restults # Repeat this 10 times. # Call myGen(200, 100) and append restult to sim$data # Apply bonferroni and holm each with alpha 0.25 and 0.5 to this data set # Append the results to sim$restults # Repeat this 10 times. length(sim$data) length(sim$results) # we now reproduce the 6th item in results print(sim$results[[6]]$data.set.number) print(sim$results[[6]]$parameters) all(BH(sim$data[[2]]$procInput$pValues, 0.5, silent=TRUE)$adjPValues == sim$results[[6]]$adjPValues) # # Just calculating some statistics and making some plots NumberOfType1Error <- function(data, result) sum(data$groundTruth * result$rejected) result.all <- gatherStatistics(sim, list(NumOfType1Err = NumberOfType1Error)) result <- gatherStatistics(sim, list(NumOfType1Err = NumberOfType1Error), list(median=median, mean=mean, sd=sd)) print(result) require(lattice) histogram(~NumOfType1Err | method*alpha, data = result.all$statisticDF) barchart(NumOfType1Err.median + NumOfType1Err.mean ~ method | alpha, data = result$statisticDF)} mutoss/man/oracleBH.Rd0000644000176200001440000000272414404061507014333 0ustar liggesusers\name{oracleBH} \alias{oracleBH} \title{Bejamini-Hochberg (2000) oracle linear step-up Procedure...} \usage{oracleBH(pValues, alpha, pi0, silent=FALSE)} \description{Bejamini-Hochberg (2000) oracle linear step-up Procedure} \details{Knowledge of the number of true null hypotheses (m0) can be very useful to improve upon the performance of the FDR controlling procedure. For the oracle linear step-up procedure we assume that m0 were given to us by an 'oracle', the linear step-up procedure with q0 = q*m/m0 would control the FDR at precisely the desired level q in the independent and continuous case, and would then be more powerful in rejecting hypotheses for which the alternative holds.} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{criticalValues}{A numeric vector containing critical values used in the step-up-down test.} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.}} \author{HackNiklas} \arguments{\item{pValues}{pValues to be used} \item{alpha}{the level at which the FWER should be controlled} \item{pi0}{miraculousy known number of true null hypotheses} \item{silent}{Logical, if true any output on the console will be suppressed.}} \examples{pval <- c(runif(50), runif(50, 0, 0.01)) result <- oracleBH(pValues=pval,alpha=0.05,pi0=0.85)} mutoss/man/mutoss.apply.Rd0000644000176200001440000000264114404061507015330 0ustar liggesusers\name{mutoss.apply} \alias{mutoss.apply} \title{Applies a function to a Mutoss object.} \usage{mutoss.apply(mutossObj, f, label = deparse(substitute(f)) , recordHistory = TRUE , ...)} \description{Applies a function to a Mutoss object.} \details{This functions is intended for applying functions for multiplicity control on Mutoss class objects using the console and not the Mutoss GUI.} \value{A Mutoss object after applying the given function \item{mutossObj}{Object of S4 class Mutoss}} \author{Kornelius Rohmeyer} \arguments{\item{mutossObj}{the Mutoss object the function should be applied to} \item{f}{the function that should be applied} \item{label}{the label affixed to all slots of the Mutoss object that are changed by the procedure, defaults to the name of parameter f} \item{recordHistory}{if true, the calling command is concatenated verbatim to the commandHistory slot} \item{...}{additional parameters that are passed to the function}} \examples{newObjectBonf <- mutoss.apply(new(Class="Mutoss", pValues=runif(10)), f=bonferroni, label="Bonferroni Correction", alpha=0.05) \dontrun{ TODO: EXAMPLE PROBLEM newObjectHolm <- mutoss.apply(new(Class="Mutoss", pValues=runif(10)), f=holm, label="Holm's step-down-procedure", alpha=0.05, silent=T) newObjectAORC <- mutoss.apply(new(Class="Mutoss", pValues=runif(10)), f=aorc, label="Asymptotically optimal rejection curve", alpha=0.05, startIDX_SUD = 1, silent=T) }} mutoss/man/multiple.down.adjust.Rd0000644000176200001440000000051214404061507016737 0ustar liggesusers\name{multiple.down.adjust} \alias{multiple.down.adjust} \title{A service function used by multiple...} \usage{multiple.down.adjust(sorted, m)} \description{A service function used by \code{multiple.down}} \author{JonathanRosenblatt} \arguments{ \item{sorted}{A sorted pvalue vector.} \item{m}{The number of hypotheses tested.} } mutoss/man/Qvalue.Rd0000644000176200001440000000410414404061507014103 0ustar liggesusers\name{Qvalue} \alias{Qvalue} \title{Storey's (2001) q-value Procedure...} \usage{Qvalue(pValues, lambda=seq(0, 0.9, 0.05), pi0.method="smoother", fdr.level=NULL, robust=FALSE, smooth.df=3, smooth.log.pi0=FALSE, silent=FALSE)} \description{Storey's (2001) q-value Procedure} \details{The Qvalue procedure estimates the q-values for a given set of p-values. The q-value of a test measures the proportion of false positive incurred when that particular test is called sigificant. It gives the scientist a hypothesis testing error measure for each observed statistic with respect to the pFDR. Note: If no options are selected, then the method used to estimate pi0 is the smoother method desribed in Storey and Tibshirani (2003). The bootstrap method is described in Storey, Taylor and Siegmund (2004).} \value{A list containing: \item{qValues}{A vector of the estimated q-values} \item{pi0}{An estimate of the proportion of null hypotheses} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function.}} \author{HackNiklas} \references{Storey, John (2001). The Positive False Discovery Rate: A Baysian Interpretation and the Q-Value. The Annals of Statistics, Vol. 31, No. 6, 2013-2035.} \arguments{\item{pValues}{pValues to be used (only necessary input)} \item{lambda}{Value of the tuning parameter to be used} \item{pi0.method}{Method for automatically choosing tuning parameter in the estimation of pi_0. Either 'smoother' or 'bootstrap'} \item{fdr.level}{Level at which to control the FDR} \item{robust}{Logical, whether to make estimate more robust for small p-values.} \item{smooth.df}{Number of degrees of freedom to use when estimating pi_0 with the smoother.} \item{smooth.log.pi0}{Logical, if TRUE and pi0.method = 'smoother', pi0 will be estimated by applying a smoother to a scatterplot of log(pi_0) estimates against the tuning parameter lambda.} \item{silent}{logical scalar. If \code{TRUE} no output is generated.}} \examples{pval <- c(runif(50), runif(50, 0, 0.01)) result <- Qvalue(pval) result <- Qvalue(pval, lambda=0.5)} mutoss/man/adjPValuesPlot.Rd0000644000176200001440000000056514404061507015552 0ustar liggesusers\name{adjPValuesPlot} \alias{adjPValuesPlot} \title{A function plotting adjusted p-values...} \usage{adjPValuesPlot(adjPValues, alpha)} \description{A function plotting adjusted p-values} \author{MuToss-Coding Team} \arguments{ \item{adjPValues}{A numeric containing the adjusted pValues to plot.} \item{alpha}{A numeric containing the overall type I error rate alpha..} } mutoss/man/aorc.Rd0000644000176200001440000000474514404061507013605 0ustar liggesusers\name{aorc} \alias{aorc} \title{Step-up-down test based on the asymptotically optimal rejection curve.} \usage{aorc(pValues, alpha, startIDX_SUD=length(pValues), betaAdjustment, silent=FALSE)} \description{Performs a step-up-down test on pValues. The critical values are based on the asymptotically optimal rejection curve. To have finite FDR control, an automatic adjustment of the critical values is done (see details for more).} \details{The graph of the function f(t) = t / (t * (1 - alpha) + alpha) is called the asymptotically optimal rejection curve. Denote by finv(t) the inverse of f(t). Using the critical values finv(i/n) for i = 1, ..., n yields asymptotic FDR control. To ensure finite control it is possible to adjust f(t) by a factor. The function calculateBetaAdjustment() calculates a beta such that (1 + beta / n) * f(t) can be used to control the FDR for a given finite sample size. If the parameter betaAdjustment is not provided, calculateBetaAdjustment() will be called automatically.} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{criticalValues}{A numeric vector containing critical values used in the step-up-down test} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error (FDR) controlled by the function and the level \code{alpha}.}} \references{Finner, H., Dickhaus, T. & Roters, M. (2009). On the false discovery rate and an asymptotically optimal rejection curve. The Annals of Statistics 37, 596-618.} \author{MarselScheer} \arguments{\item{pValues}{pValues to be used. They are assumed to be stochastically independent.} \item{alpha}{The level at which the FDR shall be controlled.} \item{startIDX_SUD}{The index at which critical value the step-up-down test starts. Default is length(pValues) and thus the function aorc() by default behaves like an step-up test.} \item{betaAdjustment}{A numeric value to adjust the asymptotically optimal rejection curve for the finite sample case. If betaAdjustment is not set an algorithm will calculate it, but this can be time-consuming.} \item{silent}{If true any output on the console will be suppressed.}} \examples{ \dontrun{ # Takes more than 6 seconds therefor CRAN should not check it: r <- c(runif(10), runif(10, 0, 0.01)) result <- aorc(r, 0.05) result <- aorc(r, 0.05, startIDX_SUD = 1) ## step-down result <- aorc(r, 0.05, startIDX_SUD = length(r)) ## step-up} } mutoss/man/jointCDF.orderedUnif.Rd0000644000176200001440000000225514404061507016560 0ustar liggesusers\name{jointCDF.orderedUnif} \alias{jointCDF.orderedUnif} \title{Joint cumulative distribution function of order statistics of n iid. U(0,1)-distributed random variables} \usage{jointCDF.orderedUnif(vec)} \description{Calculates the joint cumulative distribution function of order statistics of n iid. U(0,1)-distributed random variables at argument vec. Because of numerical issues n should not be greater than 100.} \details{Following Shorack, Wellner (1986) or Finner, Roters (2002) by applying Bolshev's recursion the joint distribution is calculated.} \value{The return value is the following probability P(U_(1:n) <= vec[1], ..., U_(n:n) <= vec[n]), where U_1, ..., U_n are assumed to be iid. uniformly distributed on [0,1]. The i-th ordered value is denoted by U_(i:n) and n equals length(vec)} \references{Shorack, G. R. and Wellner, J. A. (1986). Empirical Processes with Applications to Statistics. Wiley, New York. Finner, H. and Roters, M. (2002). Multiple hypotheses testing and expected type I errors. Ann. Statist. 30, 220-238.} \author{MarselScheer} \arguments{\item{vec}{a numeric vector. The length of the vector also determines the number of random variables considered.}} mutoss/man/gatherParameters.Rd0000644000176200001440000000246114404061507016150 0ustar liggesusers\name{gatherParameters} \alias{gatherParameters} \title{Extracts the parameters from the simulation()-Object} \usage{gatherParameters(simObject)} \description{Basically, it is a helper function for gatherStatistics(). It extracts the parameters from the simObject$results and creates a data.frame from this. Every used parameter gets its own column. Every row corresponds to one object in simObject$results. If a object A from simObject$results does not contain a parameter P that another object B does, then the row for object A will have "" in the column for the parameter P.} \value{A data.frame with rows for every object in simObject$results and columns for the used parameter.} \author{MarselScheer} \arguments{\item{simObject}{An object returned by simulation()}} \examples{#' # this function generates pValues myGen <- function(n, n0) { list(procInput=list(pValues = c(runif(n-n0, 0, 0.01), runif(n0))), groundTruth = c(rep(FALSE, times=n-n0), rep(TRUE, times=n0))) } # need some simulation()-Object I can work with sim <- simulation(replications = 3, list(funName="myGen", fun=myGen, n=200, n0=c(50,100)), list(list(funName="BH", fun=function(pValues, alpha) BH(pValues, alpha, silent=TRUE), alpha=c(0.25, 0.5)), list(funName="holm", fun=holm, alpha=c(0.25, 0.5),silent=TRUE))) gatherParameters(sim)}mutoss/man/BlaRoq.Rd0000644000176200001440000000422114404061507014026 0ustar liggesusers\name{BlaRoq} \alias{BlaRoq} \title{Blanchard-Roquain (2008) step-up Procedure for arbitrary dependent p-Values...} \usage{BlaRoq(pValues, alpha, pii, silent=FALSE)} \description{Blanchard-Roquain (2008) step-up Procedure for arbitrary dependent p-Values Also proposed independently by Sarkar (2008)} \details{A generalization of the Benjamini-Yekutieli procedure, taking as an additional parameter a distribution pii on [1..k] (k is the number of hypotheses) representing prior belief on the number of hypotheses that will be rejected. It is a step-up Procedure with critical values C_i defined as alpha/k times the sum for j in [1..i] of j*pii[j]. For any fixed prior pii, the FDR is controlled at level alpha for arbitrary dependence structure of the p-Values. The particular case of the Benjamini-Yekutieli step-up is recovered by taking pii[i] proportional to 1/i. If pii is missing, a default prior distribution proportional to exp( -i/(0.15*k) ) is taken. It should perform better than the BY procedure if more than about 0.05 to 0.1 of hypotheses are rejected, and worse otherwise. Note: the procedure automatically normalizes the prior pii to sum to one if this is not the case.} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{criticalValues}{A numeric vector containing critical values used in the step-up test} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.}} \author{GillesBlanchard,HackNiklas} \references{Blanchard, G. and Roquain, E. (2008). Two simple sufficient conditions for FDR control. Electronic Journal of Statistics, 2:963-992. Sarkar, S.K. (2008) On methods controlling the false discovery rate. Sankhya, Series A, 70:135-168.} \arguments{\item{pValues}{pValues to be used. They can have arbitrary dependence.} \item{alpha}{the level at which the FDR should be controlled} \item{pii}{Prior for the proportion of true null hypotheses, same size as pValues} \item{silent}{if true any output on the console will be suppressed.}} mutoss/man/hommel.Rd0000644000176200001440000000247514404061507014140 0ustar liggesusers\name{hommel} \alias{hommel} \title{Hommel's (1988) step-up-procedure} \usage{hommel(pValues, alpha, silent=FALSE)} \description{Hommel's step-up-procedure.} \details{The method is applied to p-values. It controls the FWER in the strong sense when the hypothesis tests are independent or when they are non-negatively associated. The method is based upon the closure principle and the Simes test.} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{criticalValues}{A numeric vector containing critical values used in the step-up-down test.} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.} } \author{HackNiklas} \references{ G. Hommel (1988). A stagewise rejective multiple test procedure based on a modified Bonferroni test. Biometrika 75, pp. 383-386} \arguments{ \item{pValues}{pValues to be used. They need a independent structure.} \item{alpha}{The level at which the FWER should be controlled} \item{silent}{Logical. If true, any output on the console will be suppressed.} } \examples{ pval <- c(runif(50), runif(50, 0, 0.01)) result <- hommel(pval, 0.05) result <- hommel(pval, 0.05, silent = TRUE) } mutoss/man/reject.Rd0000644000176200001440000000061114404061507014121 0ustar liggesusers\name{reject} \alias{reject} \title{reject} \usage{reject(sorted, criticals)} \description{ Returns the highest rejected p-value and its index given some critical values. } \arguments{ \item{sorted}{ Sorted p-values } \item{criticals}{ Critical values } } \value{ A list with elements \item{cutoff}{highest rejected p-value} \item{cut.index }{index of highest rejected p-value} }mutoss/man/compareMutoss.Rd0000644000176200001440000000747214404061507015522 0ustar liggesusers\name{compareMutoss} \title{Functions for comparing outputs of different procedures.} \usage{compareMutoss(...) mu.compare.adjusted(comparison.list, identify.check=F) mu.compare.critical(comparison.list, identify.check=F) mu.compare.summary(comparison.list)} \description{Functions for comparing outputs of different procedures.} \details{These functions are used to compare the results of different multiple comparisons procedures stored as Mutoss class objects. \code{compareMutoss} takes as input an arbitrary number of Mutoss objects and arranges them in a simple list objects (non S4). \code{mu.compare.adjuted}, \code{mu.compare.critical} and \code{mu.compare.summary} take the output of the \code{compareMutoss} and plots or summerize the results textually or graphically.} \value{\item{compareMutoss}{Returns a list with the following components:\cr \bold{types}: Character vector of error types corrsponding to each procedure.\cr \bold{rates}: Numeric vector of error rates used for each procedure.\cr \bold{pi.nulls}: Numeric vector of estimates of the proportion of true null hypothesis if avilable.\cr \bold{raw.pValues}: The raw p-values used for each procedure.\cr \bold{adjusted.pvals}: Data frame with columns holding procedure specific adjusted p values.\cr \bold{criticalValue}: Data frame with columns holding the critical values corresponding to each procedure and error rate.\cr \bold{rejections}: Data frame with columns holding logical vectors of rejected hypotheses (TRUE for rejected).\cr} \item{mu.compare.adjusted}{Creates a plot with the adjusted p-values for each procedure.} \item{mu.compare.critical}{Creates a plot with the critical values for each procedure and error rate.} \item{mu.compare.summary}{Creates a short textual summary for comparing results of different procedures.}} \author{Jonathan Rosenblatt} \alias{compareMutoss} \alias{mu.compare.adjusted} \alias{mu.compare.critical} \alias{mu.compare.summary} \arguments{\item{...}{An arbitrary number of Motoss class objects.} \item{comparison.list}{The output of the \code{compareMutoss} function.} \item{identify.check}{Logical parameter specifying if hypotheses should be identified on the output plots.} } \examples{# TODO: EXAMPLE PROBLEMS \dontrun{ \dontrun{Creating several Mutoss class objects} mu.test.obj.1 <- mutoss.apply(new(Class="Mutoss", pValues=runif(10)), f=bonferroni, label="Bonferroni Correction", alpha=0.05, silent=T) mu.test.obj.2 <- mutoss.apply(new(Class="Mutoss", pValues=runif(10)), f=holm, label="Holm's step-down-procedure", alpha=0.05, silent=T) mu.test.obj.3 <- mutoss.apply(new(Class="Mutoss", pValues=runif(10)), f=aorc, label="Asymtotically optimal rejection curve", alpha=0.05, startIDX_SUD = 1, silent=T) \dontrun{Trying to coercing a non-Mutoss object} compareMutoss(1) \dontrun{ Coercing several objects into a list} compare.1<- compareMutoss(mu.test.obj.1, mu.test.obj.2) compare.2<- compareMutoss(mu.test.obj.1, mu.test.obj.2, mu.test.obj.3) \dontrun{Plotting the adjusted pvalues. Identification available.} mu.compare.adjusted(compare.1, T) mu.compare.adjusted(compare.2, T) \dontrun{Plotting the critical values. Identification available.} mu.compare.critical(compare.1, T) mu.compare.critical(compare.2, T) \dontrun{Showing a textual sumary} mu.compare.summary(compare.1) mu.compare.summary(compare.2) }} mutoss/man/adaptiveBH.Rd0000644000176200001440000000416414404104155014660 0ustar liggesusers\name{adaptiveBH} \alias{adaptiveBH} \title{Benjamini-Hochberg (2000) adaptive linear step-up procedure} \usage{adaptiveBH(pValues, alpha, silent=FALSE)} \description{The adaptive Benjamini-Hochberg step-up procedure is applied to pValues. It controls the FDR at level alpha for independent or positive regression dependent test statistics.} \details{In the adaptive Benjamini-Hochberg step-up procedure the number of true null hypotheses is estimated first as in Hochberg and Benjamini (1990), and this estimate is used in the procedure of Benjamini and Hochberg (1995) with alpha'=alpha*m/m0. Please note that this method is not equivalent to multcomp's ABH. They revised the formular of the original paper. } \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{criticalValues}{A numeric vector containing critical values used in the step-up-down test} \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{pi0}{An estimate of the proportion of true null hypotheses among all hypotheses (pi0=m0/m). } \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.}} \author{WerftWiebke} \references{Benjamini, Y. and Hochberg, Y. (2000). On the Adaptive Control of the False Discovery Rate in Multiple Testing With Independent Statistics. Journal of Educational and Behavioral Statistics, 25(1): 60-83.\eqn{n} Hochberg, Y. and Benjamini, Y. (1990). More powerful procedures for multiple significance testing. Statistics in Medicine 9, 811-818.\eqn{n} Benjamini, Y. and Hochberg, Y. (1995). Controlling the false discovery rate: A practical and powerful approach to mulitple testing. Journal of the Royal Statistical Society, Series B, 57:289-300.} \arguments{\item{pValues}{The used raw pValues.} \item{alpha}{The level at which the FDR shall be controlled.} \item{silent}{If true any output on the console will be suppressed.}} \examples{alpha <- 0.05 p <-c(runif(10, min=0, max=0.01), runif(10, min=0.9, max=1)) result <- adaptiveBH(p, alpha) result <- adaptiveBH(p, alpha, silent=TRUE)} mutoss/man/two.stage.Rd0000644000176200001440000000251314404061507014563 0ustar liggesusers\name{two.stage} \alias{two.stage} \title{A p-value procedure which controls the FDR for independent test statistics.} \usage{two.stage(pValues, alpha)} \description{A p-value procedure which controls the FDR for independent test statistics.} \details{In the Benjamini-Krieger-Yekutieli two-stage procedure the linear step-up procedure is used in stage one to estimate m0 which is re-plugged in a linear step-up. This procedure is more powerful then non-adaptive procedures, while still controlling the FDR. On the other hand, error control is not guaranteed under dependence in which case more conservative procedures should be used (e.g. BH).} \value{A list containing: \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{criticalValues}{A numeric vector containing critical values used in the step-up-down test.} \item{adjPValues}{A numeric vector containing adjusted p-values.} \item{pi0}{An estimate of the proportion of true null hypotheses among all hypotheses (pi0=m0/m). } \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.}} \author{JonathanRosenblatt} \arguments{\item{pValues}{A numeric vecor of p-values.} \item{alpha}{The FDR error rate to control.}} \examples{pvals<- runif(100)^2 two.stage(pvals, 0.1)} mutoss/man/gao.Rd0000644000176200001440000000546214404061507013424 0ustar liggesusers\name{gao} \alias{gao} \alias{gao.wrapper} \title{Xin Gao's non-parametric multiple test procedure is applied to Data.} \usage{gao(formula, data, alpha=0.05, control=NULL, silent=FALSE) gao.wrapper(model, data, alpha, control)} \description{Xin Gao's non-parametric multiple test procedure is applied to Data. The procedure controls the FWER in the strong sense. Here, only the Many-To-One comparisons are computed.} \details{This function computes Xin Gao's nonparametric multiple test procedures in an unbalanced one way layout. It is based upon the following purely nonparametric effects: Let \eqn{F_i} denote the distribution function of sample \eqn{i, i=1,\ldots,a,} and let \eqn{G} denote the mean distribution function of all distribution functions \eqn{(G=1/a\sum_i F_i)}. The effects \eqn{p_i=\int GdF_i} are called unweighted relative effects. If \eqn{p_i>1/2}, the random variables from sample \eqn{i} tend (stochastically) to larger values than any randomly chosen number from the whole experiment. If \eqn{p_i = 1/2}, there is no tendency to smaller nor larger values. However, this approach tests the hypothesis \eqn{H_0^F: F_1=F_j, j=2,\ldots,a} formulated in terms of the distribution functions, simultaneously.} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{confIntervals}{A matrix containing the estimates and the lower and upper confidence bound} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.}} \author{Frank Konietschke} \references{Gao, X. et al. (2008). Nonparametric multiple comparison procedures for unbalanced one-way factorial designs. Journal of Statistical Planning and Inference 77, 2574-2591. \eqn{n} The FWER is controlled by using the Hochberg adjustment (Hochberg, Y. (1988). A sharper Bonferroni procedure for multiple tests of significance. Biometrika 75, 800-802.)} \arguments{\item{formula}{Formula defining the statistical model, containing the response and the factors} \item{model}{Model with formula, containing the response and the factors} \item{data}{Dataset containing the response and the grouping factor} \item{alpha}{The level at which the FWER shall be controlled. By default it is alpha=0.05.} \item{silent}{If true any output on the console will be suppressed.} \item{control}{The control group for the Many-To-One comparisons. By default it is the first group in lexicographical order.}} \examples{x=c(rnorm(40)) f1=c(rep(1,10),rep(2,10),rep(3,10),rep(4,10)) my.data <- data.frame(x,f1) result <- gao(x~f1,data=my.data, alpha=0.05,control=2, silent=FALSE) result <- gao(x~f1,data=my.data, alpha=0.05,control=2, silent=TRUE) result <- gao(x~f1,data=my.data, alpha=0.05)} mutoss/man/ErrorControl.Rd0000644000176200001440000000105414404061507015301 0ustar liggesusers\name{ErrorControl-class} \docType{class} \alias{ErrorControl-class} \title{Class ErrorControl} \description{This class holds the information related to the error rate} \section{Slots}{ \describe{ \item{\code{type}:}{a character specifying the error rate. For example FWER, FDR, ... } \item{\code{alpha}:}{the level at which the error rate shall be controlled} \item{\code{k}:}{an additional parameter for generalised FWER} \item{\code{q}:}{an additional parameter for FDX (false discovery exceedance)} } } \author{MuToss-Coding Team} mutoss/man/regwq.Rd0000644000176200001440000000520414404061507013775 0ustar liggesusers\name{regwq} \alias{regwq} \title{REGWQ - Ryan / Einot and Gabriel / Welsch test procedure...} \usage{regwq(formula, data, alpha, MSE=NULL, df=NULL, silent=FALSE)} \description{REGWQ - Ryan / Einot and Gabriel / Welsch test procedure This function computes REGWQ test for given data including p samples. It is based on a stepwise or layer approach to significance testing. Sample means are ordered from the smallest to the largest. The largest difference, which involves means that are r = p steps apart, is tested first at \eqn{\alpha} level of significance; if significant, means that are \eqn{r criticalValues[startIDX_SUD], then the procedure retains hypotheses associated with pValues[startIDX_SUD], ..., pValues[n] and carries on in a step-up manner with pValues[startIDX_SUD - 1], ..., pValues[1]. If startIDX_SUD equals n the algorithm behaves like a step-up procedure. If startIDX_SUD equals 1 the algorithm behaves like a step-down procedure.} \value{rejected logical vector indicating if hypotheses are rejected or retained.} \author{MuToss-Coding Team} \arguments{\item{pValues}{pValues to be used.} \item{criticalValues}{criticalValues for the step-up-down procedure} \item{startIDX_SUD}{the index (between 1 and length(pValues)) used for the first comparison of pValues[startIDX_SUD] and criticalValues[startIDX_SUD]. Depending on the result of this comparison the algorithm decides to proceed in step-up or step-down manner.}} mutoss/man/pval2qval.Rd0000644000176200001440000000237314404061507014564 0ustar liggesusers\name{pval2qval} \alias{pval2qval} \title{Strimmer et al.'s fdrtool-based q-values} \usage{pval2qval(pValues, cutoff)} \description{The function \code{pval2qval} takes a vector of p-values and estimates for each case the tail area-based FDR, which can be regarded as a p-value corrected for multiplicity. This is done by calling the \code{fdrtool} function. If a cutoff is supplied, a vector of rejected hypotheses will be returned as well.} \value{A list containing: \item{qValues}{A numeric vector with one q-value for each hypothesis.} \item{rejected}{A logical vector indicating rejection/retention for each hypothesis when \code{cutoff} is supplied.}} \author{JonathanRosenblatt} \references{Strimmer, K. (2008). fdrtool: a versatile R package for estimating local and tail area-based false discovery rates. Bioinformatics 24: 1461-1462. \cr Storey, J. D. (2003) The Positive False Discovery Rate: A Bayesian Interpretation and the q-Value. The Annals of Statistics 31(6): 2013-2035} \arguments{\item{pValues}{Numeric vector of p-values to be used.} \item{cutoff}{The positive FDR cutoff for rejection. Hypotheses with \code{qValues} smaller then \code{cutoff} will be rejected.}} \examples{pvals<- runif(1000)^2 pval2qval(pvals) pval2qval(pValues=pvals, cutoff=0.1)} mutoss/man/SidakSD.Rd0000644000176200001440000000260514404061507014134 0ustar liggesusers\name{SidakSD} \alias{SidakSD} \title{Sidak-like (1987) step-down procedure} \usage{SidakSD(pValues, alpha, silent=FALSE)} \description{The Sidak-like (1987) step-down procedure is applied to pValues The Sidak-like step-down procedure is an improvement over the Holm's (1979) step-down procedure. The improvement is analogous to Sidak's correction over the original Bonferroni procedure. This Sidak-like step-down procedure assumes positive orthant dependent test statistics.} \value{A list containing: \item{adjPValues}{a numeric vector containing the adjusted pValues} \item{rejected}{a logical vector indicating which hypotheses are rejected} \item{criticalValues}{a numeric vector containing critical values used in the step-up-down test} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.}} \author{WerftWiebke} \references{Hollander, B.S. and Covenhaver, M.D. (1987). An Improved Sequentially Rejective Bonferroni Test Procedure. Biometrics, 43(2):417-423, 1987.} \arguments{\item{pValues}{The used raw pValues.} \item{alpha}{The level at which the FWER shall be controlled.} \item{silent}{If true any output on the console will be suppressed.}} \examples{alpha <- 0.05 p <-c(runif(10, min=0, max=0.01), runif(10, min=0.9,max=1)) result <- SidakSD(p, alpha) result <- SidakSD(p, alpha, silent=TRUE)} mutoss/man/fisher22_fast.Rd0000644000176200001440000000117614404061507015315 0ustar liggesusers\name{fisher22_fast} \alias{fisher22_fast} \title{Fisher (2x2) table association analysis for calculating one (marginal) p-value...} \usage{fisher22_fast(obs, epsilon)} \description{Fisher (2x2) table association analysis for calculating one (marginal) p-value} \value{A list containing: \item{nonrand_p}{The non-randomized (conservative) p-value} \item{rand_p}{The randomized (non-conservative) p-value} \item{prob_table}{The conditional probability of the observed table (given the merginals)}} \author{ThorstenDickhaus} \arguments{\item{obs}{The observed (2x2) table} \item{epsilon}{A threshold for comparing real numbers to zero}} mutoss/man/SD.Rd0000644000176200001440000000154514404061507013162 0ustar liggesusers\name{SD} \alias{SD} \title{A general step-down procedure.} \usage{SD(pValues, criticalValues)} \description{A general step-down procedure.} \details{Suppose we have n pValues and they are already sorted. The procedure starts with comparing pValues[1] with criticalValues[1]. If pValues[1] <= criticalValues[1], then the hypothsis associated with pValues[1] is rejected and the algorithm carries on with second smallest pValue and criticalValue in the same way. The algorithm stops rejecting at the first index i for which pValues[i] > criticalValues[i]. Thus pValues[j] is rejected if and only if pValues[i] <= criticalValues[i] for all i <= j.} \value{rejected logical vector indicating if hypotheses are rejected or retained.} \author{MarselScheer} \arguments{\item{pValues}{pValues to be used.} \item{criticalValues}{criticalValues for the step-down procedure}} mutoss/man/mu.test.type.Rd0000644000176200001440000000063114404061507015226 0ustar liggesusers\name{mu.test.type} \alias{mu.test.type} \title{Tests that different procedures use the same error types.} \usage{mu.test.type(types)} \description{Tests that different procedures use the same error types.} \details{Internal muToss function.} \value{Returns a notice if error types differ.} \author{MuToss-Coding Team.} \arguments{\item{types}{Character vector of error types extracted from muToss objects.}} mutoss/man/mutoss.models.Rd0000644000176200001440000000061114404061507015461 0ustar liggesusers\name{mutoss.models} \alias{fisher23.model} \alias{fisher22.model} \alias{twosamp.model} \alias{paired.model} \alias{onesamp.model} \alias{ftest.model} \title{Mutoss Models} \description{Fisher-type (2x3) table as model for marginal hypotheses testing problems, Fisher (2x2) table as model for marginal hypotheses testing problems and others...} \value{A list containing the model description}mutoss/man/fisher22.marginal.Rd0000644000176200001440000000103114404061507016057 0ustar liggesusers\name{fisher22.marginal} \alias{fisher22.marginal} \title{Fisher (2x2) table association analysis for calculating all marginal p-values...} \usage{fisher22.marginal(data, model)} \description{Fisher (2x2) table association analysis for calculating all marginal p-values} \value{A list containing the m marginal p-values} \author{ThorstenDickhaus} \arguments{\item{data}{A tensor of dimension (2x2xm) where m is the number of endpoints (genes, etc.)} \item{model}{A model object indicating that this type of analysis shall be performed}} mutoss/man/storey_pi0_est.Rd0000644000176200001440000000252214404061507015620 0ustar liggesusers\name{storey_pi0_est} \alias{storey_pi0_est} \title{Storey-Taylor-Siegmund estimation of pi0 (finite sample version)} \usage{storey_pi0_est(pValues, lambda)} \description{The Storey-Taylor-Siegmund procedure for estimating pi0 is applied to pValues. The formula is equivalent to that in Schweder and Spjotvoll (1982), page 497, except the additional '+1' in the nominator that introduces a conservative bias which is proven to be sufficiently large for FDR control in finite families of hypotheses if the estimation is used for adjusting the nominal level of a linear step-up test.} \value{A list containing: \item{pi0}{A numeric number containing the estimated value of pi0} \item{lambda}{A numeric number containing the tuning parameter for the estimation}} \author{MarselScheer} \references{Schweder, T. and Spjotvoll, E. (1982). Plots of P-values to evaluate many tests simultaneously. Biometrika 69, 3, 493-502. Storey, J. D., Taylor, J. E. and Siegmund, D. (2004). Strong control, conservative point estimation and simultaneous conservative consistency of false discovery rates: a unified approach. JRSS B 66, 1, 187-205.} \arguments{\item{pValues}{The raw p-values for the marginal test problems} \item{lambda}{A tuning parameter in the interval (0, 1)}} \examples{my.pvals <- c(runif(50), runif(50, 0, 0.01)) result <- storey_pi0_est(my.pvals, 0.5)} mutoss/man/nparcomp.wrapper.Rd0000644000176200001440000000413714404061507016152 0ustar liggesusers\name{nparcomp.wrapper} \alias{nparcomp.wrapper} \title{Simultaneous confidence intervals for relative contrast effects...} \usage{nparcomp.wrapper(model, data, hypotheses, alpha, alternative, asy.method)} \description{Simultaneous confidence intervals for relative contrast effects The procedure controls the FWER in the strong sense.} \details{With this function, it is possible to compute nonparametric simultaneous confidence intervals for relative contrast effects in the unbalanced one way layout. Moreover, it computes adjusted p-values. The simultaneous confidence intervals can be computed using multivariate normal distribution, multivariate t-distribution with a Satterthwaite Approximation of the degree of freedom or using multivariate range preserving transformations with Logit or Probit as transformation function. There is no assumption on the underlying distribution function, only that the data have to be at least ordinal numbers} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{confIntervals}{A matrix containing the estimates and the lower and upper confidence bound} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function.}} \author{FrankKonietschke} \arguments{\item{model}{A two-sided formula specifying a numeric response variable and a factor with more than two levels.} \item{data}{A dataframe containing the variables specified the model} \item{hypotheses}{Character string defining the type of contrast. It should be one of "Tukey", "Dunnett", "Sequen", "Williams", "Changepoint", "AVE", "McDermott", "Marcus".} \item{alpha}{the significance level} \item{alternative}{Character string defining the alternative hypothesis, one of "two.sided", "less" or "greater"} \item{asy.method}{A character string defining the asymptotic approximation method, one of "logit", for using the logit transformation function, "probit", for using the probit transformation function, "normal", for using the multivariate normal}} mutoss/man/pval2locfdr.Rd0000644000176200001440000000210514404061507015063 0ustar liggesusers\name{pval2locfdr} \alias{pval2locfdr} \title{Strimmer et al.'s fdrtool-based local fdr} \usage{pval2locfdr(pValues, cutoff)} \description{The function \code{pval2locfdr} takes a vector of p-values and estimates for each case the local fdr.} \value{A list containing: \item{locfdr}{Numeric vector with local FDR values for each case} \item{rejected}{Logical vector indicating rejection/retention for each hypothesis when a \code{cutoff} is supplied.}} \author{JonathanRosenblatt} \references{Strimmer, K. (2008). fdrtool: a versatile R package for estimating local and tail area-based false discovery rates. Bioinformatics 24: 1461-1462. \cr Efron B., Tibshirani R., Storey J. D. and Tusher, V. (2001). Empirical Bayes Analysis of a Microarray Experiment. Journal of the American Statistical Association 96(456):1151-1160.} \arguments{\item{pValues}{pValues to be used.} \item{cutoff}{The local fdr cutoff for rejection. Hypotheses with \code{local fdr} smaller then \code{cutoff} will be rejected.}} \examples{pvals<- runif(1000)^2 pval2locfdr(pvals) pval2locfdr(pValues=pvals, cutoff=0.4)} mutoss/man/notterman.Rd0000644000176200001440000000230014404061507014651 0ustar liggesusers\name{notterman} \docType{data} \alias{notterman} \alias{notterman.grpLabel} \alias{T.Test.tumor.vs.normal} \title{Notterman data set} \description{ The \code{notterman} data set is a data.frame containing 18 paired samples of 7457 gene expression values from Notterman et al. (2001). The vector \code{notterman.grpLabel} contains 36 labels of type \code{Tumor} or \code{Normal} specifying the type of tissue for each column of the \code{notterman} data set. The vector \code{T.Test.tumor.vs.normal} contains the resulting 7457 numeric p-values from the 7457 t-tests applied to each row of the data set. } \usage{notterman notterman.grpLabel T.Test.tumor.vs.normal } \format{ \itemize{ \item{notterman - A data.frame containing 36 columns with 7457 observations} \item{notterman.grpLabel - A vector containing 36 labels of type \code{Tumor} or \code{Normal}} \item{T.Test.tumor.vs.normal - A vector containing 7457 numeric p-values} } } \source{D.A. Notterman, U. Alon, A.J. Sierk, and A.J. Levine: \emph{Transcriptional Gene Expression Profiles of Colorectal Adenoma, Adenocarcinoma, and Normal Tissue Examined by Oligonucleotide Arrays}, Cancer Research, 2001, vol. 61, pp. 3124-3130.} \keyword{datasets} mutoss/man/mutoss.plotCI.Rd0000644000176200001440000000036314404061507015374 0ustar liggesusers\name{mutoss.plotCI} \alias{mutoss.plotCI} \title{mutoss.plotCI} \usage{mutoss.plotCI(mat)} \description{Plots the confidence intervals} \arguments{\item{mat}{Matrix containing the confidence interval limits. TODO specify the matrix layout.}} mutoss/man/snk.Rd0000644000176200001440000000675014404061507013452 0ustar liggesusers\name{snk} \alias{snk} \alias{snk.wrapper} \title{Student - Newman - Keuls rejective test procedure.} \usage{snk(formula, data, alpha, MSE=NULL, df=NULL, silent=FALSE) snk.wrapper(model, data, alpha, silent=FALSE)} \description{Student - Newman - Keuls rejective test procedure. The procedure controls the FWER in the WEAK sense.} \details{This function computes the Student-Newman-Keuls test for given data including p samples. The Newman-Keuls procedure is based on a stepwise or layer approach to significance testing. Sample means are ordered from the smallest to the largest. The largest difference, which involves means that are r = p steps apart, is tested first at \eqn{\alpha} level of significance; if significant, means that are r = p - 1 steps apart are tested at \eqn{\alpha} level of significance and so on. The Newman-Keuls procedure provides an r-mean significance level equal to \eqn{\alpha} for each group of r ordered means, that is, the probability of falsely rejecting the hypothesis that all means in an ordered group are equal to \eqn{\alpha}. It follows that the concept of error rate applies neither on an experimentwise nor on a per comparison basis-the actual error rate falls somewhere between the two. The Newman-Keuls procedure, like Tukey's procedure, requires equal sample n's. However, in this algorithm, the procedure is adapted to unequal sample sized which can lead to still conservative test decisions. It should be noted that the Newman-Keuls and Tukey procedures require the same critical difference for the first comparison that is tested. The Tukey procedure uses this critical difference for all the remaining tests, whereas the Newman-Keuls procedure reduces the size of the critical difference, depending on the number of steps separating the ordered means. As a result, the Newman-Keuls test is more powerful than Tukey's test. Remember, however, that the Newman-Keuls procedure does not control the experimentwise error rate at \eqn{\alpha}.} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{statistics}{A numeric vector containing the test-statistics} \item{confIntervals}{A matrix containing only the estimates} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function.}} \author{Frank Konietschke} \references{Keuls M (1952). "The use of the studentized range in connection with an analysis of variance". Euphytica 1: 112-122} \arguments{\item{formula}{Formula defining the statistical model containing the response and the factor levels.} \item{model}{Model with formula, containing the response and the factor levels} \item{data}{dataset containing the response and the grouping factor.} \item{alpha}{The level at which the error should be controlled. By default it is alpha=0.05.} \item{MSE}{Optional for a given variance of the data.} \item{df}{Optional for a given degree of freedom.} \item{silent}{If true any output on the console will be suppressed.}} \examples{x = rnorm(50) grp = c(rep(1:5,10)) dataframe <- data.frame(x,grp) result <- snk(x~grp, data=dataframe, alpha=0.05,MSE=NULL, df=NULL, silent = TRUE) result <- snk(x~grp, data=dataframe,alpha=0.05,MSE=NULL, df=NULL, silent = FALSE) result <- snk(x~grp, data=dataframe,alpha=0.05,MSE=1, df=Inf, silent = FALSE) # known variance result <- snk(x~grp, data=dataframe,alpha=0.05,MSE=1, df=1000, silent = FALSE) # known variance} mutoss/man/pValuesPlot.Rd0000644000176200001440000000036314404061507015127 0ustar liggesusers\name{pValuesPlot} \alias{pValuesPlot} \title{A function plotting p-values...} \usage{pValuesPlot(pValues)} \description{A function plotting p-values} \author{MarselScheer} \arguments{\item{pValues}{A numeric containing the pValues to plot.}} mutoss/man/nparcomp.Rd0000644000176200001440000000757314404061507014502 0ustar liggesusers\name{nparcomp} \alias{nparcomp} \title{Simultaneous confidence intervals for relative contrast effects...} \usage{nparcomp(formula, data, type=c("UserDefined", "Tukey", "Dunnett", "Sequen", "Williams", "Changepoint", "AVE", "McDermott", "Marcus", "UmbrellaWilliams"), control=NULL, conflevel=0.95, alternative=c("two.sided", "less", "greater"), rounds=3, correlation=FALSE, asy.method=c("logit", "probit", "normal", "mult.t"), plot.simci=FALSE, info=TRUE, contrastMatrix=NULL)} \description{Simultaneous confidence intervals for relative contrast effects The procedure controls the FWER in the strong sense.} \details{With this function, it is possible to compute nonparametric simultaneous confidence intervals for relative contrast effects in the unbalanced one way layout. Moreover, it computes adjusted p-values. The simultaneous confidence intervals can be computed using multivariate normal distribution, multivariate t-distribution with a Satterthwaite Approximation of the degree of freedom or using multivariate range preserving transformations with Logit or Probit as transformation function. There is no assumption on the underlying distribution function, only that the data have to be at least ordinal numbers} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{confIntervals}{A matrix containing the estimates and the lower and upper confidence bound} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function.}} \author{FrankKonietschke} \arguments{\item{formula}{A two-sided 'formula' specifying a numeric response variable and a factor with more than two levels. If the factor contains less than 3 levels, an error message will be returned} \item{data}{data A dataframe containing the variables specified in formula} \item{type}{type Character string defining the type of contrast. It should be one of "Tukey", "Dunnett", "Sequen", "Williams", "Changepoint", "AVE", "McDermott", "Marcus"} \item{control}{control Character string defining the control group in Dunnett comparisons. By default it is the first group by lexicographical ordering} \item{conflevel}{The confidence level for the 1 - conflevel confidence intervals. By default it is 0.05} \item{alternative}{Character string defining the alternative hypothesis, one of "two.sided", "less" or "greater"} \item{rounds}{Number of rounds for the numeric values of the output. By default it is rounds=3} \item{correlation}{Correlation A logical whether the estimated correlation matrix and covariance matrix should be printed} \item{asy.method}{asy.method character string defining the asymptotic approximation method, one of "logit", for using the logit transformation function, "probit", for using the probit transformation function, "normal", for using the multivariate normal distribution or "mult.t" for using a multivariate t-distribution with a Satterthwaite Approximation} \item{plot.simci}{plot.simci A logical indicating whether you want a plot of the confidence intervals} \item{info}{info A logical whether you want a brief overview with informations about the output} \item{contrastMatrix}{arbitrary contrast matrix given by the user}} \examples{ \dontrun{# TODO Check this example and set a seed! grp <- rep(1:5,10) x <- rnorm(50, grp) dataframe <- data.frame(x,grp) # Williams Contrast nparcomp(x ~grp, data=dataframe, asy.method = "probit", type = "Williams", alternative = "two.sided", plot.simci = TRUE, info = TRUE) # Dunnett Contrast nparcomp(x ~grp, data=dataframe, asy.method = "probit",control=1, type = "Dunnett", alternative = "two.sided", plot.simci = TRUE, info = TRUE) # Dunnett dose 3 is baseline nparcomp(x ~grp, data=dataframe, asy.method = "probit", type = "Dunnett", control = "3",alternative = "two.sided", plot.simci = TRUE, info = TRUE) } } mutoss/man/multiple.down.Rd0000644000176200001440000000264514404061507015457 0ustar liggesusers\name{multiple.down} \alias{multiple.down} \title{Benjamini-Krieger-Yekutieli (2006) Multi-Stage Step-Down} \usage{multiple.down(pValues, alpha)} \description{A p-value procedure which controls the FDR for independent test statistics.} \details{A non-linear step-down p-value procedure which control the FDR for independent test statistics and enjoys more power then other non-adaptive procedure such as the linear step-up (BH). For the case of non-independent test statistics, non-adaptive procedures such as the linear step-up (BH) or the all-purpose conservative Benjamini-Yekutieli (2001) are recommended.} \value{A list containing: \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{criticalValues}{A numeric vector containing critical values used in the step-up-down test.} \item{adjPValues}{A numeric vector containing adjusted p-values.} \item{pi0}{An estimate of the proportion of true null hypotheses among all hypotheses (pi0=m0/m). } \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.}} \author{Jonathan Rosenblatt} \arguments{\item{pValues}{A numeric vector of p-values} \item{alpha}{The FDR error rate to control}} \examples{pvals<- runif(100)^2 alpha<- 0.2 result<- multiple.down(pvals, alpha) result plot(result[['criticalValues']]~pvals) plot(result[['adjPValues']]~pvals) abline(v=alpha)} mutoss/man/MutossMethod.Rd0000644000176200001440000000211114404061507015275 0ustar liggesusers\name{MutossMethod-class} \docType{class} \alias{MutossMethod-class} \alias{MutossMethod} \title{Class MutossMethod} \description{A \code{MutossMethod} object describes a method that is applicable to \code{Mutoss} objects.} \section{Slots}{ \describe{ \item{\code{label}:}{A character string that contains the label that will be shown in menus.} \item{\code{errorControl}:}{One of the following character strings: FWER, FWER.weak, FDR, FDX, gFWER, perComparison.} \item{\code{callFunction}:}{A character string that contains the name of the Mutoss-compatible function.} \item{\code{output}:}{A character vector of the \emph{possible} output of the function.} \item{\code{info}:}{A character string with info text. Should contain small description, author, reference etc..} \item{\code{assumptions}:}{A character vector of assumptions for this method.} \item{\code{parameters}:}{A list of optional description of parameters - see MuToss developer handbook.} \item{\code{list}:}{For extensions a list where you can put all your miscellaneous stuff.} } }mutoss/man/bonferroni.Rd0000644000176200001440000000301614404061507015012 0ustar liggesusers\name{bonferroni} \alias{bonferroni} \title{Bonferroni correction...} \usage{bonferroni(pValues, alpha, silent=FALSE)} \description{Bonferroni correction} \details{The classical Bonferroni correction outputs adjusted p-values, ensuring strong FWER control under arbitrary dependence of the input p-values. It simply multiplies each input p-value by the total number of hypotheses (and ceils at value 1). It is recommended to use Holm's step-down instead, which is valid under the exact same assumptions and more powerful.} \arguments{ \item{pValues}{ A numeric vector containing the unadjusted pValues. No assumption is made on the dependence structure. } \item{alpha}{ The overall type I error at which the FWER shall be controlled (optional). } \item{silent}{ logical scalar. If \code{TRUE} no output is generated. } } \value{A list containing: \item{adjPValues}{A numeric vector containing the new adjusted pValues} \item{rejected}{(if alpha is given) A logical vector indicating which hypotheses are rejected} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function.}} \references{Bonferroni, C. E. (1935) Il calcolo delle assicurazioni su gruppi di teste. 'In Studi in Onore del Professore Salvatore Ortu Carboni. Rome: Italy, pp. 13-60. Bonferroni, C. E. (1936) Teoria statistica delle classi e calcolo delle probabilita. Pubblicazioni del R Istituto Superiore di Scienze Economiche e Commerciali di Firenze 8, 3-62, 1936.} \author{MuToss-Coding Team} mutoss/man/twosamp.marginal.Rd0000644000176200001440000000253314404061507016135 0ustar liggesusers\name{twosamp.marginal} \alias{twosamp.marginal} \title{Marginal two sample test} \usage{twosamp.marginal(data, model, robust, alternative, psi0, equalvar)} \description{The robust version uses the Wilcoxon-Mann-Whitney test, otherwise a two-sample t-test will be performed.} \details{A vector of classlabels needs to be provided to distinguish the two groups.} \value{\item{pValues}{A numeric vector containing the unadjusted pValues}} \author{MuToss-Coding Team} \references{ Wilcoxon, F. (1945). Individual Comparisons by Ranking Methods. Biometrics Bulletin 1:80-83. Mann, H. and Whitney, D. (1947). On a test of whether one of two random variables is stochastically larger than the other. Annals of Mathematical Statistics 18:50-60 Student (1908). The probable error of a mean. Biometrika, 6(1):1-25. } \arguments{ \item{data}{the data set} \item{model}{the result of a call to \code{twosamp.model(classlabel)}} \item{robust}{a logical variable indicating whether a two sample t-test or a Wilcoxon-Mann-Whitney test should be used.} \item{alternative}{a character string specifying the alternative hypothesis, must be one of \code{two.sided}, \code{greater} or \code{less}} \item{psi0}{a numeric that defines the hypothesized null value} \item{equalvar}{a logical variable indicating whether to treat the two variances as being equal} } mutoss/man/indepBR.Rd0000644000176200001440000000261114404061507014172 0ustar liggesusers\name{indepBR} \alias{indepBR} \title{Blanchard-Roquain (2009) 1-stage adaptive step-up} \usage{indepBR(pValues, alpha, lambda=1, silent=FALSE)} \description{Blanchard-Roquain (2009) 1-stage adaptive step-up} \details{This is a step-up procedure with critical values C_i = alpha * min( i * ( 1 - lambda * alpha) / (m - i + 1) , lambda ) where alpha is the level at which FDR should be controlled and lambda an arbitrary parameter belonging to (0, 1/alpha) with default value 1. This procedure controls FDR at the desired level when the p-values are independent.} \value{A list containing: \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{criticalValues}{A numeric vector containing critical values used in the step-up-down test} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.}} \author{GillesBlanchard} \references{Blanchard, G. and Roquain, E. (2009) Adaptive False Discovery Rate Control under Independence and Dependence Journal of Machine Learning Research 10:2837-2871.} \arguments{\item{pValues}{the used p-values (assumed to be independent)} \item{alpha}{the level at which the FDR should be controlled.} \item{lambda}{parameter of the procedure, should belong to (0, 1/alpha) (lambda=1 default)} \item{silent}{if true any output on the console will be suppressed.}} mutoss/man/augmentation.Rd0000644000176200001440000000503114404061507015341 0ustar liggesusers\name{augmentation} \alias{augmentation} \title{Wrapper function to the augmentation methods of the multtest package.} \usage{augmentation(adjPValues, newErrorControl, newK, newQ, silent=FALSE)} \description{Wrapper function to the augmentation methods of the multtest package.} \details{The augmentation method turns a vector of p-values which are already adjusted for FWER control into p-values that are adjusted for gFWER, FDX or FDR. The underlying idea (for gFWER and FDX) is that the set of hypotheses rejected at a given level alpha under FWER can be "augmented" by rejecting some additional hypotheses while still ensuring (strong) control of the desired weaker type I criterion. For FDR, it uses the fact that FDX control for q=alpha=1-sqrt(1-beta) entails FDR control at level beta. Use of these augmentation methods is recommended only in the situation where FWER-controlled p-values are directly available from the data (using some specific method). When only marginal p-values are available, it is generally prerefable to use other adjustment methods directly aimed at the intended criterion (as opposed to first adjust for FWER, then augment) Note: in the multtest package, two methods ("restricted" and "conservative") are available for FDR augmentation. Here the 'restricted' method is forced for FDR augmentation since it is in fact always valid and better than "conservative" (M. van der Laan, personal communication) with respect to power.} \value{A list containing: \item{adjPValues}{A numeric vector containing the new adjusted pValues} \item{rejected}{A logical vector indicating which hypotheses are rejected. Currently always NULL.} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function.}} \author{KornRohm, GillesBlanchard} \references{Dudoit, S. and van der Laan, M.J. (2008) Multiple Testing Procedures with Applications to Genomics, Springer. (chapter 6)} \arguments{\item{adjPValues}{a vector of p-values that are *already* adjusted for FWER} \item{newErrorControl}{new error control type to adjust for. One of ("gFWER", "FDX", "FDR")} \item{newK}{k-parameter if newErrorControl is "gFWER"} \item{newQ}{q-parameter if newErrorControl is "FDX"} \item{silent}{if true any output on the console will be suppressed.}} \examples{\dontrun{ TODO NH (MS) EXAMPLE PROBLEM p <- c(runif(50), runif(50, 0, 0.01)) fwer_adj <- bonferroni(p) # adjust for FWER using Bonferroni correction fdx_adj <- augmentation(fwer_adj$adjPValues , "FDX", q=0.1, silent = TRUE) #augment to FDX (q=0.1) }} mutoss/man/onesamp.marginal.Rd0000644000176200001440000000206214404061507016102 0ustar liggesusers\name{onesamp.marginal} \alias{onesamp.marginal} \title{Marginal one sample test} \usage{onesamp.marginal(data, robust, alternative, psi0)} \description{The robust version uses the Wilcoxon-Mann-Whitney test, otherwise a t-test will be performed.} \value{\item{pValues}{A numeric vector containing the unadjusted pValues}} \author{MuToss-Coding Team} \references{ Wilcoxon, F. (1945). Individual Comparisons by Ranking Methods. Biometrics Bulletin 1:80-83. Mann, H. and Whitney, D. (1947). On a test of whether one of two random variables is stochastically larger than the other. Annals of Mathematical Statistics 18:50-60 Student (1908). The probable error of a mean. Biometrika, 6(1):1-25. } \arguments{ \item{data}{the data set} \item{robust}{a logical variable indicating whether a t-test or a Wilcoxon-Mann-Whitney test should be used.} \item{alternative}{a character string specifying the alternative hypothesis, must be one of \code{two.sided}, \code{greater} or \code{less}} \item{psi0}{a numeric that defines the hypothesized null value} } mutoss/man/gatherStatistics.Rd0000644000176200001440000000732414404061507016202 0ustar liggesusers\name{gatherStatistics} \alias{gatherStatistics} \title{Gathering statistics from simulation()-Object} \usage{gatherStatistics(simObject, listOfStatisticFunctions, listOfAvgFunctions)} \description{This function facilitates gathering statistics from the object returned by simulation().} \details{For every simulation()-Object in simObject$results all statistics in listOfStatisticFunctions are calculated. If in addition listOfAvgFunctions is provided then the statistics of the objects that have the same parameter constellation are averaged by the functions in listOfAvgFunctions. The resulting data.frame will then keep only one row for every parameter constellation.} \value{\item{statisticDF}{A data.frame that can be of two different kinds. If listOfAvgFunctions is provided, then the resulting data.frame will have a row for every parameter constellation that occurs in the simObject$results. There will be columns for every parameter used. Also length(listOfAvgFunctions) * length(listOfStatisticFunctions) additional columns will be created. Every statistic is calculated for every applied procedure and then all values that belong to a specific parameter constellation are "averaged" by applying all function from listOfAvgFunctions. For example, suppose FDP is a function from listOfStatisticFunctions that calculates the realized false discovery proportion, that is number of true hypotheses that were rejected divided by the number of all rejected hypotheses. Also suppose mean and sd are functions in listOfAvgFunctions, then the mean and the standard deviation of the statistic FDP are calculated. If listOfAvgFunctions is not provided, then the resulting data.frame will have a row for every simObject$results. Every parameter will have its own column. Additional columns for every function in listOfStatisticFunction will be created.}} \author{MarselScheer} \arguments{\item{simObject}{An object returned by simulation()} \item{listOfStatisticFunctions}{List of statistics that shall be calculated for the elements in simObject} \item{listOfAvgFunctions}{List of functions that will be used to summarize/average the calculated statistics for all elements in simObject$results with the same parameter constellation. If this is argument is missing no averaging will be done. Instead the resulting data.frame will keep one row for every object in simObject$results.}} \examples{#' # this function generates pValues myGen <- function(n, n0) { list(procInput=list(pValues = c(runif(n-n0, 0, 0.01), runif(n0))), groundTruth = c(rep(FALSE, times=n-n0), rep(TRUE, times=n0))) } # need some simulation()-Object I can work with sim <- simulation(replications = 10, list(funName="myGen", fun=myGen, n=200, n0=c(50,100)), list(list(funName="BH", fun=function(pValues, alpha) BH(pValues, alpha, silent=TRUE), alpha=c(0.25, 0.5)), list(funName="holm", fun=holm, alpha=c(0.25, 0.5),silent=TRUE))) # Make my own statistic function NumberOfType1Error <- function(data, result) sum(data$groundTruth * result$rejected) # Get now for every object in sim$results one row with the number of Type 1 Errors result.all <- gatherStatistics(sim, list(NumOfType1Err = NumberOfType1Error)) # Average over all sim$results-Objects with common parameters result1 <- gatherStatistics(sim, list(NumOfType1Err = NumberOfType1Error), list(MEAN = mean)) print(result1) result2 <- gatherStatistics(sim, list(NumOfType1Err = NumberOfType1Error), list(q05 = function(x) quantile(x, probs=0.05), MEAN = mean, q95 = function(x) quantile(x, probs=0.95))) print(result2) # create some plots require(lattice) histogram(~NumOfType1Err | method*alpha, data = result.all$statisticDF) barchart(NumOfType1Err.MEAN ~ method | alpha, data = result2$statisticDF)} mutoss/man/ABH_pi0_est.Rd0000644000176200001440000000171714404061507014672 0ustar liggesusers\name{ABH_pi0_est} \alias{ABH_pi0_est} \title{Lowest Slope Line (LSL) method of Hochberg and Benjamini for estimating pi0} \usage{ABH_pi0_est(pValues)} \description{The Lowest Slope Line (LSL) method of Hochberg and Benjamini for estimating pi0 is applied to pValues. This method for estimating pi0 is motivated by the graphical approach proposed by Schweder and Spjotvoll (1982), as developed and presented in Hochberg and Benjamini (1990).} \value{\item{pi0.ABH}{The estimated proportion of true null hypotheses.}} \author{WerftWiebke} \references{Hochberg, Y. and Benjamini, Y. (1990). More powerful procedures for multiple significance testing. Statistics in Medicine 9, 811-818. Schweder, T. and Spjotvoll, E. (1982). Plots of P-values to evaluate many tests simultaneously. Biometrika 69, 3, 493-502.} \arguments{\item{pValues}{The raw p-values for the marginal test problems}} \examples{my.pvals <- c(runif(50), runif(50, 0, 0.01)) result <- ABH_pi0_est(my.pvals)} mutoss/man/holm.Rd0000644000176200001440000000350414404061507013610 0ustar liggesusers\name{holm} \alias{holm} \title{Holm's (1979) step-down-procedure} \usage{holm(pValues, alpha, silent=FALSE)} \description{Holm's step-down-procedure is applied to pValues. It controls the FWER in the strong sense under arbitrary dependency.} \details{Holm's procedure uses the same critical values as Hochberg's procedure, namely c(i)=alpha/(m-i+1), but is a step-down version while Hochberg's method is a step-up version of the Bonferroni test. Holm's method is based on the Bonferroni inequality and is valid regardless of the joint distribution of the test statistics, whereas Hochberg's method relies on the assumption that Simes' inequality holds for the joint null distribution of the test statistics. If this assumption is met, Hochberg's step-up procedure is more powerful than Holm's step-down procedure.} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{criticalValues}{A numeric vector containing critical values used in the step-down test} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.}} \author{MarselScheer} \references{S. Holm (1979). A simple sequentially rejective multiple test procedure. Scand. J. Statist. Vol. 6, 65-70. \eqn{n} Huang, Y. and Hsu, J. (2007). Hochberg's step-up method: cutting corners off Holm's step-down method. Biometrika, 94(4):965-975.} \arguments{\item{pValues}{pValues to be used. They can have arbitrary dependency structure.} \item{alpha}{The level at which the FWER shall be controlled} \item{silent}{If true any output on the console will be suppressed.}} \examples{r <- c(runif(50), runif(50, 0, 0.01)) result <- holm(r, 0.05) result <- holm(r, 0.05, silent = TRUE)} mutoss/man/fisher23_fast.Rd0000644000176200001440000000121014404061507015303 0ustar liggesusers\name{fisher23_fast} \alias{fisher23_fast} \title{Fisher-type (2x3) table association analysis for calculating one (marginal) p-value...} \usage{fisher23_fast(obs, epsilon)} \description{Fisher-type (2x3) table association analysis for calculating one (marginal) p-value} \value{A list containing: \item{nonrand_p}{The non-randomized (conservative) p-value} \item{rand_p}{The randomized (non-conservative) p-value} \item{prob_table}{The conditional probability of the observed table (given the merginals)}} \author{ThorstenDickhaus} \arguments{\item{obs}{The observed (2x3) table} \item{epsilon}{A threshold for comparing real numbers to zero}} mutoss/man/SU.Rd0000644000176200001440000000163014404061507013176 0ustar liggesusers\name{SU} \alias{SU} \title{A general step-up procedure.} \usage{SU(pValues, criticalValues)} \description{A general step-up procedure.} \details{Suppose we have n pValues and they are already sorted. The procedure starts with comparing pValues[n] with criticalValues[n]. If pValues[n] > criticalValues[n], then the hypothesis associated with pValues[n] is retained and the algorithm carries on with the next pValue and criticalValue, here for example pValues[n-1] and criticalValues[n-1]. The algorithm stops retaining at the first index i for which pValues[i] <= criticalValues[i]. Thus pValues[j] is rejected if and only if their exists an index i with j <= i and pValues[i] <= criticalValues[i].} \value{rejected logical vector indicating if hypotheses are rejected or retained.} \author{MarselScheer} \arguments{\item{pValues}{pValues to be used.} \item{criticalValues}{criticalValues for the step-up procedure}} mutoss/man/adaptiveSTS.Rd0000644000176200001440000000335114404061507015040 0ustar liggesusers\name{adaptiveSTS} \alias{adaptiveSTS} \title{Storey-Taylor-Siegmund (2004) adaptive step-up procedure} \usage{adaptiveSTS(pValues, alpha, lambda=0.5, silent=FALSE)} \description{Storey-Taylor-Siegmund's (2004) adaptive step-up procedure} \details{The adaptive STS procedure uses a conservative estimate of pi0 which is plugged in a linear step-up procedure. The estimation of pi0 requires a parameter (lambda) which is set to 0.5 by default. Note that the estimated pi0 is truncated at 1 as suggested by the author, so the implemetation of the procedure is not entirely supported by the proof in the reference.} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{criticalValues}{A numeric vector containing critical values used in the step-up-down test} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.}} \author{Werft Wiebke} \references{Storey, J.D., Taylor, J.E. and Siegmund, D. (2004). Strong control, conservative point estimation and simultaneous conservative consistency of false discovery rates: a unified approach. Journal of the Royal Statistical Society, B 66(1):187-205.} \arguments{\item{pValues}{The used raw pValues.} \item{alpha}{The level at which the FDR shall be controlled.} \item{lambda}{The tuning parameter for the estimation procedure (defaults to 0.5)} \item{silent}{If true any output on the console will be suppressed.}} \examples{alpha <- 0.05 p <-c(runif(10, min=0, max=0.01), runif(10, min=0.9,max=1)) result <- adaptiveSTS(p, alpha, lambda=0.5) result <- adaptiveSTS(p, alpha, lambda=0.5, silent=TRUE)} mutoss/man/BH.Rd0000644000176200001440000000474714404061507013154 0ustar liggesusers\name{BH} \alias{BH} \title{Benjamini-Hochberg (1995) linear step-up procedure} \usage{BH(pValues, alpha, silent=FALSE)} \description{Benjamini-Hochbergs Linear Step-Up Procedure. The procedure controls the FDR when the test statistics are stochastically independent or satisfy positive regression dependency (PRDS) (see Benjamini and Yekutieli 2001 for details). The Benjamini-Hochberg (BH) step-up procedure considers ordered pValues P_(i). It defines k as the largest i for which P_(i) <= i*alpha/m and then rejects all associated hypotheses H_(i) for i=1,...,k. In their seminal paper, Benjamini and Hochberg (1995) show that for 0 <= m_0 <= m independent pValues corresponding to true null hypotheses and for any joint distribution of the m_1 = m-m_0 p-values corresponding to the non null hypotheses, the FDR is controlled at level (m_0/m)*alpha. Under the assumption of the PRDS property, (for details see Benjamini and Yekutieli 2001). In Benjamini et al. (2006) the BH procedure is improved by adaptive procedures which use an estimate of m_0 and apply the BH method al level alpha'=alpha*m/m_0, to fully exhaust the desired level alpha (see Adaptive Benjamini Hochberg and Two Stage Banjamini Yekutieli).} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{criticalValues}{A numeric vector containing critical values used in the step-up test} \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.}} \author{Werft Wiebke} \references{Benjamini, Y. and Hochberg, Y. (1995). Controlling the false discovery rate: A practical and powerful approach to mulitple testing. Journal of the Royal Statistical Society, Series B, 57:289-300.\eqn{n} Benjamini, Y. and Yekutieli, D. (2001). The control of the false discovery rate in multiple testing under dependency. Annals of Statistics, 29(4):1165-1188.\eqn{n} Benjamini, Y., Krieger, A. and Yekutieli, D. (2006). Adaptive linear step-up procedures that control the false discovery rate. Biometrika, 93(3):491-507.} \arguments{\item{pValues}{The used unadjusted pValues.} \item{alpha}{The level at which the FDR shall be controlled.} \item{silent}{If true any output on the console will be suppressed.}} \examples{alpha <- 0.05 p <-c(runif(10, min=0, max=0.01), runif(10, min=0.9, max=1)) result <- BH(p, alpha) result <- BH(p, alpha, silent=TRUE)} mutoss/man/ranktruncated.Rd0000644000176200001440000000316714404102766015526 0ustar liggesusers\name{ranktruncated} \alias{ranktruncated} \title{Rank truncated p-Value procedure...} \usage{ranktruncated(pValues, K, silent=FALSE)} \description{Rank truncated p-Value procedure The program computes the exact distribution and with it the p-Value} \details{This function computes the exact distribution of the product of at most K significant p-values of \eqn{L>K} observed p-values. Thus, one gets the pvalue from the exact distribution. This has certain advantages for genomewide association scans: K can be chosen on the basis of a hypothesised disease model, and is independent of sample size. Furthermore, the alternative hypothesis corresponds more closely to the experimental situation where all loci have fixed effects. Please note that this method is implemented with factorials and binomial coefficients and the computation becomes numerical instable for large number of p-values.} \value{Used.pValue: List information about the used pValues; RTP: Test statistic and pValue} \author{Frank Konietschke} \references{Dubridge, F., Koeleman, B.P.C. (2003). Rank truncated product of P-values, with application to genomewide association scans. Genet Epidemiol. 2003 Dec;25(4):360-6} \arguments{\item{pValues}{Vector of p-Values (not sorted)} \item{K}{the number of hypotheses / p-Values being in w} \item{silent}{If true any output on the console will be suppressed.}} \examples{pvalues<-runif(10) result <- ranktruncated(pvalues,K=2,silent=FALSE) # take the K=2 smallest pvalues result <- ranktruncated(pvalues,K=2,silent=TRUE) # take the K=2 smallest pvalues result <- ranktruncated(pvalues,K=5,silent=TRUE) # take the K=5 smallest pvalues} mutoss/man/BL.Rd0000644000176200001440000000403714404061507013150 0ustar liggesusers\name{BL} \alias{BL} \title{Benjamini-Liu (1999) step-down procedure} \usage{BL(pValues, alpha, silent=FALSE)} \description{Benjamini-Liu's step-down procedure is applied to pValues. The procedure controls the FDR if the corresponding test statistics are stochastically independent.} \details{The Benjamini-Liu (BL) step-down procedure neither dominates nor is dominated by the Benjamini-Hochberg (BH) step-up procedure. However, in Benjamini and Liu (1999) a large simulation study concerning the power of the two procedures reveals that the BL step-down procedure is more suitable when the number of hypotheses is small. Moreover, if most hypotheses are far from the null then the BL step-down procedure is more powerful than the BH step-up method. The BL step-down method calculates critical values according to Benjamin and Liu (1999), i.e., c_i = 1 - (1 - min(1, (m*alpha)/(m-i+1)))^(1/(m-i+1)) for i = 1,...,m, where m is the number of hypotheses tested. Then, let k be the smallest i for which P_(i) > c_i and reject the associated hypotheses H_(1),...,H_(k-1).} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues.} \item{criticalValues}{A numeric vector containing critical values used in the step-up-down test.} \item{rejected}{A logical vector indicating which hypotheses are rejected.} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.}} \author{Werft Wiebke} \references{Bejamini, Y. and Liu, W. (1999). A step-down multiple hypotheses testing procedure that controls the false discovery rate under independence. Journal of Statistical Planning and Inference Vol. 82(1-2): 163-170.} \arguments{\item{pValues}{Numeric vector of p-values} \item{alpha}{The level at which the FDR is to be controlled.} \item{silent}{If true any output on the console will be suppressed.}} \examples{alpha <- 0.05 p <-c(runif(10, min=0, max=0.01), runif(10, min=0.9, max=1)) result <- BL(p, alpha) result <- BL(p, alpha, silent=TRUE)} mutoss/man/sidak.Rd0000644000176200001440000000306414404061507013745 0ustar liggesusers\name{sidak} \alias{sidak} \title{Sidak correction} \usage{sidak(pValues, alpha, silent=FALSE)} \description{The classical Sidak correction returns adjusted p-values, ensuring strong FWER control under the assumption of independence of the input p-values. It only uses the fact that the probability of no incorrect rejection is the product over true nulls of those marginal probabilities (using the assumed independence of p-values).} \details{The procedure is more generally valid for positive orthant dependent test statistics. It is recommended to use the step-down version of the Sidak correction instead (see SidakSD), which is valid under the exact same assumptions but is more powerful.} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{rejected}{(if alpha is given) A logical vector indicating which hypotheses are rejected} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function.}} \references{Sidak, Z. (1967). Rectangular confidence regions for the means of multivariate normal distributions. Journal of the American Statistical Association, 62:626-633.} \author{MuToss-Coding Team} \arguments{ \item{pValues}{pValues to be used.} \item{alpha}{The level at which the FWER shall be controlled (optional).} \item{silent}{logical scalar. If \code{TRUE} no output is generated.} } \examples{alpha <- 0.05 p <-c(runif(10, min=0, max=0.01), runif(10, min=0.9, max=1)) result <- sidak(p) result <- sidak(p, alpha) result <- sidak(p, alpha, silent=TRUE)} mutoss/man/ftest.marginal.Rd0000644000176200001440000000133114404061507015563 0ustar liggesusers\name{ftest.marginal} \alias{ftest.marginal} \title{Marginal F test} \usage{ftest.marginal(data, model, robust)} \description{The robust version uses the Kruskal-Wallis test, otherwise a F-test will be performed.} \details{A classlabel needs to be provided to distinguish k sample groups.} \value{\item{pValues}{A numeric vector containing the unadjusted pValues}} \author{MuToss-Coding Team} \references{Kruskal, W.H. und Wallis, W.A. (1952). Use of ranks in one-criterion variance analysis. JASA, 47:583-621} \arguments{ \item{data}{the data set} \item{model}{the result of a call to \code{ftest.model(classlabel)}} \item{robust}{a logical variable indicating whether a F-test or a Kruskal-Wallis test should be used.} } mutoss/man/paired.marginal.Rd0000644000176200001440000000302114404061507015700 0ustar liggesusers\name{paired.marginal} \alias{paired.marginal} \title{Marginal paired two sample test} \usage{paired.marginal(data, model, robust, alternative, psi0, equalvar)} \description{The robust version uses the Wilcoxon signed rank test, otherwise a paired t-test will be performed.} \details{A vector of classlabels needs to be provided to distinguish the two paired groups. The arrangement of group indices does not matter, as long as the columns are arranged in the same corresponding order between groups. For example, if group 1 is code as 0 and group 2 is coded as 1, for 3 pairs of data, it does not matter if the classlabel is coded as (0,0,0,1,1,1) or (1,1,1,0,0,0) or (0,1,0,1,0,1) or (1,0,1,0,1,0), the paired differences between groups will be calculated as group2 - group1.} \value{ \item{pValues}{A numeric vector containing the unadjusted pValues} } \author{MuToss-Coding Team} \references{ Wilcoxon, F. (1945). Individual Comparisons by Ranking Methods. Biometrics Bulletin 1:80-83. } \arguments{ \item{data}{the data set} \item{model}{the result of a call to \code{paired.model(classlabel)}} \item{robust}{a logical variable indicating whether a paired t-test or a Wilcoxon signed rank test should be used.} \item{alternative}{a character string specifying the alternative hypothesis, must be one of \code{two.sided}, \code{greater} or \code{less}} \item{psi0}{a numeric that defines the hypothesized null value} \item{equalvar}{a logical variable indicating whether to treat the two variances as being equal} } mutoss/man/BY.Rd0000644000176200001440000000325414404061507013165 0ustar liggesusers\name{BY} \alias{BY} \title{Benjamini-Yekutieli (2001) step-up procedure} \usage{BY(pValues, alpha, silent=FALSE)} \description{The Benjamini-Yekutieli step-up procedure is applied to pValues. The procedure ensures FDR control for any dependency structure.} \details{The critical values of the Benjamini-Yekutieli (BY) procedure are calculated by replacing the alpha of the Benjamini-Hochberg procedure by alpha/sum(1/1:m)), i.e., c(i)=i*alpha/(m*(sum(1/1:m))) for i=1,...,m. For large number m of hypotheses the critical values of the BY procedure and the BH procedure differ by a factor log(m). Benjamini and Yekutieli (2001) showed that this step-up procedure controls the FDR at level alpha*m/m0 for any dependency structure among the test statistics.} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{criticalValues}{A numeric vector containing critical values used in the step-up-down test} \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function and the level \code{alpha}.}} \author{WerftWiebke} \references{Benjamini, Y. and Yekutieli, D. (2001). The control of the false discovery rate in multiple testing under dependency. Annals of Statistics, 29(4):1165-1188.} \arguments{\item{pValues}{The used unadjusted pValues.} \item{alpha}{The level at which the FDR shall be controlled.} \item{silent}{If true any output on the console will be suppressed.}} \examples{alpha <- 0.05 p <-c(runif(10, min=0, max=0.01), runif(10, min=0.9, max=1)) result <- BY(p, alpha) result <- BY(p, alpha, silent=TRUE)} mutoss/man/mu.test.name.Rd0000644000176200001440000000062714404061507015172 0ustar liggesusers\name{mu.test.name} \alias{mu.test.name} \title{Tests if all hypotheses have the same names.} \usage{mu.test.name(hyp.names)} \description{Tests if all hypotheses have the same names.} \details{Internal muToss function.} \value{Gives a notice when hypotheses names in different procedures are found different.} \author{MuToss-Coding Team} \arguments{\item{hyp.names}{Character vector of hypotheses names.}} mutoss/man/multcomp.wrapper.Rd0000644000176200001440000000575014404061507016175 0ustar liggesusers\name{multcomp.wrapper} \alias{multcomp.wrapper} \title{Simultaneous confidence intervals for arbitrary parametric contrasts in unbalanced one-way layouts.} \usage{multcomp.wrapper(model, hypotheses, alternative, rhs=0, alpha, factorC)} \description{Simultaneous confidence intervals for arbitrary parametric contrasts in unbalanced one-way layouts. The procedure controls the FWER in the strong sense.} \details{this function, it is possible to compute simultaneous confidence for arbitrary parametric contrasts in the unbalanced one way layout. Moreover, it computes p-values. The simultaneous confidence intervals are computed using multivariate t-distribution.} \value{A list containing: \item{adjPValues}{A numeric vector containing the adjusted pValues} \item{rejected}{A logical vector indicating which hypotheses are rejected} \item{confIntervals}{A matrix containing the estimates and the lower and upper confidence bound} \item{errorControl}{A Mutoss S4 class of type \code{errorControl}, containing the type of error controlled by the function.}} \author{MuToss-Coding Team} \arguments{\item{model}{a fitted model, for example an object returned by lm, glm, or aov etc. It is assumed that coef and vcov methods are available for model.} \item{hypotheses}{a specification of the linear hypotheses to be tested.} \item{alternative}{a character string specifying the alternative hypothesis, must be one of 'two.sided' (default), 'greater' or 'less'.} \item{rhs}{an optional numeric vector specifying the right hand side of the hypothesis.} \item{alpha}{the significance level} \item{factorC}{character string, specifing the factor variable of interest} } \examples{data(warpbreaks) # Tukey contrast on the levels of the factor 'Tension' multcomp.wrapper(aov(breaks ~ tension, data = warpbreaks), hypotheses = "Tukey", alternative="two.sided", factorC="tension",alpha=0.05) # Williams contrast on 'Tension' multcomp.wrapper(aov(breaks ~ tension, data = warpbreaks), hypotheses= "Williams", alternative="two.sided",alpha=0.05,factorC="tension") # Userdefined contrast matrix K <-matrix(c(-1,0,1,-1,1,0, -1,0.5,0.5),ncol=3,nrow=3,byrow=TRUE) multcomp.wrapper(aov(breaks ~ tension, data = warpbreaks), hypotheses=K, alternative="two.sided",alpha=0.05,factorC="tension") # Two-way anova multcomp.wrapper(aov(breaks ~ tension*wool, data = warpbreaks), hypotheses="Tukey", alternative="two.sided",alpha=0.05,factorC="wool") multcomp.wrapper(aov(breaks ~ tension*wool, data = warpbreaks), hypotheses="Tukey", alternative="two.sided",alpha=0.05,factorC="tension") multcomp.wrapper(aov(breaks ~ tension*wool, data = warpbreaks), hypotheses=K, alternative="two.sided",alpha=0.05, factorC="tension") data(iris) multcomp.wrapper(model=lm(Sepal.Length ~ Species, data=iris), hypotheses="Tukey","two.sided",alpha=0.05, factorC="Species") K <-matrix(c(-1,0,1,-1,1,0, -1,0.5,0.5),ncol=3,nrow=3,byrow=TRUE) multcomp.wrapper(model=lm(Sepal.Length ~ Species, data=iris), hypotheses=K,"two.sided",alpha=0.05, factorC="Species")} mutoss/man/linearStepUp.Rd0000644000176200001440000000170514404061507015265 0ustar liggesusers\name{linearStepUp} \alias{linearStepUp} \title{Linear Step Up Service Function...} \usage{linearStepUp(sorted, q, m, adjust=FALSE, m0=m, pi0, constant=1)} \description{Linear Step Up Service Function} \details{A Mutoss service function called by other procedures.} \value{A list containing the following objects: \item{Cutoff}{The largest p-value of rejected hypotheses.} \item{Pvals}{A data frame containing the original p-values, critical values, adjusted p-values and rejections.}} \author{JonathanRosenblatt} \arguments{\item{sorted}{Numeric vector of sorted pvalues} \item{q}{Error rate to control for.} \item{m}{Number of hypothesis tested.} \item{adjust}{Logical value for p-value adjustmet (unusable).} \item{m0}{Known or estimated number of true null hypotheses.} \item{pi0}{Known or estimated proportion of true null hypothesis. Is redundant when \code{m0} is specified.} \item{constant}{A Scaling constant for the denominator of the critical values.}} mutoss/man/mu.test.class.Rd0000644000176200001440000000065114404061507015354 0ustar liggesusers\name{mu.test.class} \alias{mu.test.class} \title{Test for compatible classes for comparison...} \usage{mu.test.class(classes)} \description{Test for compatible classes for comparison} \details{Internal function of muToss package. Takes list of classes and tests if they are all muToss.} \value{True if all classes are muToss. False otherwise.} \author{MuToss-Coding Team.} \arguments{\item{classes}{A list of class names.}} mutoss/DESCRIPTION0000644000176200001440000000166414404134172013321 0ustar liggesusersPackage: mutoss Type: Package Title: Unified Multiple Testing Procedures Version: 0.1-13 Author: MuToss Coding Team (Berlin 2010), Gilles Blanchard, Thorsten Dickhaus, Niklas Hack, Frank Konietschke, Kornelius Rohmeyer, Jonathan Rosenblatt, Marsel Scheer, Wiebke Werft Maintainer: Kornelius Rohmeyer Description: Designed to ease the application and comparison of multiple hypothesis testing procedures for FWER, gFWER, FDR and FDX. Methods are standardized and usable by the accompanying 'mutossGUI'. Depends: R (>= 2.10.0), mvtnorm Suggests: fdrtool, qvalue, testthat, lattice Imports: plotrix, multtest (>= 2.2.0), multcomp (>= 1.1-0), methods License: GPL LazyLoad: yes LazyData: true URL: https://github.com/kornl/mutoss/ BugReports: https://github.com/kornl/mutoss/issues/ NeedsCompilation: no Packaged: 2023-03-14 14:56:07 UTC; kornel Repository: CRAN Date/Publication: 2023-03-14 18:10:02 UTC mutoss/build/0000755000176200001440000000000014404105407012702 5ustar liggesusersmutoss/build/vignette.rds0000644000176200001440000000035714404105407015246 0ustar liggesusersuP \DC_a`L|XL@o~uѭF00@uK Cd,lU9##Xkb1ژpÅ '}JNN2+ ysr U;ɿtx%P#S[D6Boi¾Aimih,5ELQyY'a) )d/aE [mutoss/tests/0000755000176200001440000000000014404061507012747 5ustar liggesusersmutoss/tests/testthat/0000755000176200001440000000000014404134172014606 5ustar liggesusersmutoss/tests/testthat/test-bonferroni.R0000644000176200001440000000024514404061507020053 0ustar liggesuserscontext("test-bonferroni.R") test_that("bonferroni works", { result <- bonferroni(c(0.1,0.2,0.3,0.4)) expect_equal(result$adjPValues, c(0.4, 0.8, 1.0, 1.0)) }) mutoss/tests/testthat.R0000644000176200001440000000007014404061507014727 0ustar liggesuserslibrary(testthat) library(mutoss) test_check("mutoss") mutoss/vignettes/0000755000176200001440000000000014404105407013613 5ustar liggesusersmutoss/vignettes/simToolManual.actuallyRnw0000644000176200001440000004752514404061507020645 0ustar liggesusers \documentclass[a4paper]{article} \usepackage[OT1]{fontenc} \usepackage{Sweave} \usepackage{amssymb} %\usepackage{hyperref} \newcommand{\sT}{simTool} \newcommand{\pv}{$p$-value } \newcommand{\pvs}{$p$-values } \newcommand{\mts}{MutossSimObject} \newcommand{\tw}[1]{\texttt{#1}} \begin{document} % \VignetteIndexEntry{MuToss Simulation Tool Guide} \title{\sT} \author{MarselScheer} \maketitle \tableofcontents <>= require(mutoss) @ \section{Note} This SweaveFile is part of $\mu$Toss package. But because some parts of this document are computational intensiv the extension of the Sweavefile is ".actuallyRnw". \section{Introduction} \label{introduction} This document will give an introduction to the use of \sT. We will start with a very simple application then raise the degree of complexity in a few steps and in the end reproduce some of the results from Benjamini, Krieger, Yekutieli (2006). Basically for a simulation we need the following things \begin{enumerate} \item a function that generates the data (for example \pvs) \item some procedures that evaluates the generated data (for example the bonferroni correction) \item statistics we want to calculate. For example the the false discovery proportion (FDP). \end{enumerate} If we are speak for example of $1000$ replications, we mean that these 3 steps were repeated $1000$ times. That means, after $1000$ replications there have been $1000$ data sets generated. Every procedure was applied to these $1000$ data sets. If we have specified for example $3$ procedures then every of these procedures will give us an output, this means $3000$ "output objects". And every specified statistic is applied to these $3000$ "output objects". \subsection{Motivation} \subsubsection{Example 1} Suppose we want to compare some characteristics of the two procedures \tw{BH} and \tw{holm}. Denote by $V_n(BH)$ and $V_n(holm)$ the number of true hypotheses rejected. For example we are interested in the distribution of $V_n(BH)$ and $V_n(holm)$ and also in $E[V_n(BH)]$ and $E[V_n(holm)]$. Lets have a look on the arguments of theses procedures: <<>>= args(BH) args(holm) @ Both have the argument \tw{alpha}, which stands for the niveau of the corresponding error measure. \tw{BH} controls the false discovery rate (FDR) and \tw{holm} controls the family-wise error rate (FWER). One question may be how must \tw{alpha} be set in \tw{holm} such that for fixed \tw{alpha} = 0.1 in \tw{BH} we have $E[V_n(BH)] \approx E[V_n(holm)]$? And perhaps we are also interested in how a dependence structure affects the distribution of $V_n(BH)$ and $V_n(holm)$. \subsubsection{Example 2} Suppose you have developed a new procedure controlling some error measure and you want to compare this new procedure with some other already established procedures. Then a simulation study will consist of creating data and gathering statistics for different sample sizes, dependence structures and parameter constellations. $$ $$ Basically it is always the same story. Data is generated by a specific function, perhaps this depends on some parameters, and we want to apply different procedures, again depending on some paramters, to this generated data. Nearly everyone will say, "don't bother me with the details of programming, just do the simulation with the above information and give me a nice \tw{data.frame} which I can analyze." And this is exactly the purpose of the simTool. \subsection{Data generating function} \label{DataGenFun} For now we only want to use the procedures \texttt{BH} and \texttt{holm}. Again, lets have a look on the arguments of these procedures: <<>>= args(BH) args(holm) @ Not much has to be specified. The parameter \texttt{alpha} is the level at which the corresponding error rate should be controlled and \tw{pValues} are the \pvs of the hypotheses that should be tested. In general, if we say that we reject a \pv this means that we reject the corresponding hypotheses. The following function generates data and will be used throughout the whole document. The data generating function \textbf{must have} an entry \$procInput. All in \$procInput will be used as input for the specified procedures. In our situation we will generate a list with 2 entries. \$procInput will only consist of the generated \pvs. And \$groundTruth indicates which \pv corresponds to a true or false hypothesis. <<>>= pValFromEquiCorrData <- function(sampleSize, rho, mu, pi0) { nmbOfFalseHyp <- round(sampleSize * (1-pi0)) nmbOfTrueHyp <- sampleSize - nmbOfFalseHyp muVec <- c(rep(mu, nmbOfFalseHyp), rep(0, nmbOfTrueHyp)) Y <- sqrt(rho) * rnorm(1) + sqrt(1-rho) * rnorm(sampleSize) + muVec return(list( procInput=list(pValues = 1 - pnorm(Y)), groundTruth = muVec == 0 ) ) } @ \subsubsection{Illustration of generated Data} We will now generate 1000 $p$-Values independently (\tw{rho} = 0). \tw{sampleSize * (1-pi0)} = 700 of them correspond to false hypotheses and 300 to true hypotheses. <<>>= set.seed(123) data <- pValFromEquiCorrData( sampleSize = 1000, rho = 0, mu = 2, pi0 = 0.3) @ Lets visualize the different \pvs. <>= local({ pValues = data$procInput$pValues groundTruth = data$groundTruth plot(ecdf(pValues), do.points=FALSE, verticals=TRUE, main="ecdf's of generated p-values") lines(ecdf(pValues[groundTruth]), do.points=FALSE, verticals=TRUE, col=2) lines(ecdf(pValues[!groundTruth]), do.points=FALSE, verticals=TRUE, col=4) abline(0,1,lty=2) legend("right", legend=c("all", "true", "false"), col=c(1,2,4), lty=1, title="p-values") }) @ \subsection{A very simple example} Lets directly start with the function call and then analysing what happend. Just for now we implement a simple version of the data generating function in section \ref{DataGenFun} and a simple version of the \tw{BH}. <<>>= myGen <- function() { pValFromEquiCorrData(sampleSize = 200, rho = 0, mu = 2, pi0=0.5) } BH.05 = function(pValues) { BH(pValues=pValues, alpha = 0.05, silent=TRUE) } @ <<>>= set.seed(123) sim <- simulation(replications = 10, list(funName="myGen", fun=myGen), list(list(funName="BH.simple", fun=BH.05))) @ The following happend: \begin{enumerate} \item Call \tw{myGen} \item Append generated data set to \tw{sim\$data} \item Call \tw{BH.05} with the generated \pvs \item Add to the results of \tw{BH.05} the parameter constellation used by \tw{myGen} and \tw{BH.05} and also the position of the used data in \tw{sim\$data} \item Append this extended results of \tw{BH.05} to \tw{sim\$results} \item repeat this 9 more times \end{enumerate} Since \tw{replications = 10} in \tw{simulation} the object \tw{sim} consists of: <<>>= names(sim) length(sim$data) length(sim$results) @ The structure of one object in \tw{sim\$data} coincides with the structure of the return of \tw{myGen}: <<>>= names(myGen()) names(sim$data[[1]]) @ Lets have a look at the additional information added by \tw{simulation} to the object returned by \tw{BH.05}. First the entries of the pure return value of \tw{BH.05} and then of \tw{sim\$results} <<>>= names(BH.05(runif(100))) names(sim$results[[1]]) @ \tw{data.set.number} is the number of the used data set in \tw{sim\$data}. Since every generated data set is used only once we have <<>>= sapply(sim$results, function(x) x$data.set.number) @ Thus it is possible to reproduce any result directly. Let us reproduce the results of the 6th replication <<>>= idx <- sim$results[[6]]$data.set.number pValues <- sim$data[[idx]]$procInput$pValues all(BH.05(pValues)$adjPValues == sim$results[[6]]$adjPValues) @ Since our data generating function and procedure did not really have any parameter, there is not much information in: <<>>= sim$results[[1]]$parameters @ Note, \tw{BH.05} technically has the parameter \tw{pValues} but since this parameter is the "input channel" for the output data of the data generating function it is not really regarded as parameter that affect the behaviour of the procedure like for example the level $\alpha$ for the error measure. \subsection{A simple example} \label{a.simple.example} Indeed, for the simple example above the simTool is not very helpful. Let us increase the complexity of our simulation. As a first step, we want to increase the parameter \tw{rho} of the data generating function gradually and investigate $E V_n(BH)$ and $E V^2_n(BH)$. <<>>= set.seed(123) sim <- simulation(replications = 10, list(funName="pVGen", fun=pValFromEquiCorrData, sampleSize = 100, rho = seq(0,1,by=0.2), mu = 2, pi0 = 0.5), list(list(funName="BH", fun=BH, alpha = c(0.5, 0.25), silent=TRUE))) @ The following happend: \begin{enumerate} \item Call \tw{myGen} with \tw{rho = 0} \item Append generated data set to \tw{sim\$data} \item Call \tw{BH} with \tw{alpha = 0.5} and the generated \pvs \item Add to the results the parameter constellation used by \tw{myGen} and \tw{BH} and also the position of the used data in \tw{sim\$data} \item Append this extended results to \tw{sim\$results} \item Call \tw{BH} with \tw{alpha = 0.25} and the \textbf{same} \pvs as in 3. \item Add to the results the parameter constellation used by \tw{myGen} and \tw{BH} and also the position of the used data in \tw{sim\$data} \item Append this extended results of to \tw{sim\$results} \item repeat this 9 more times \item Call \tw{myGen} with \tw{rho = 0.2} \item and so on \end{enumerate} So we have now a bunch of data sets and results. <<>>= length(sim$data) length(sim$results) @ 60 data sets have been generated because we have \tw{rho = 0, 0.2, 0.4, 0.6, 0.8, 1} and for each \tw{rho} we generated 10 data sets. We have applied \tw{BH} with \tw{alpha = 0.5} to all 60 data sets and \tw{BH} with \tw{alpha = 0.25}, yielding 120 objects in \tw{results}. We see from the \tw{data.set.number} that after generating a data set it is used two times in series <<>>= sapply(sim$results, function(x) x$data.set.number) @ In order to gather how many true hypotheses have been rejected corresponding to the different parameter constellations we need a function that is able to calculate it. <<>>= NumberOfType1Error <- function(data, result) sum(data$groundTruth * result$rejected) V2 <- function(data, result) NumberOfType1Error(data,result)^2 #result.all <- gatherStatistics(sim, list(NumOfType1Err = NumberOfType1Error)) @ Lets us calculate for the first result object the number of rejected true hypotheses explicitly. <<>>= idx = sim$results[[1]]$data.set.number data = sim$data[[idx]] NumberOfType1Error(data, sim$results[[1]]) @ This means for the following parameter constellation <<>>= sim$results[[1]]$parameters @ we one time observed <>= NumberOfType1Error(data, sim$results[[1]]) @ rejected true null hypotheses. In order to estimate $E V_n(BH)$ and $E V^2_n(BH)$ we have to search in \tw{sim\$results} for the other 9 results using the same parameter constellation. In order to facilitate this task we provide a function. <<>>= result <- gatherStatistics(sim, list(V = NumberOfType1Error, V2 = V2), mean) result @ As you can see every, parameter constellation has its own row in \tw{\$statisticDF}. By the way, again, we see that \pvs is a parameter of \tw{BH} but since it is contained in \tw{\$procInput} it is not considered as "real parameter".\\ If we are interested in more than one statistics, then we simply provide a list with "average functions" <<>>= result <- gatherStatistics(sim, list(V = NumberOfType1Error, V2 = V2), list(mean = mean, sd = function(vec) round(sd(vec), 1))) result$statisticDF @ Another possibility is to call \tw{gatherStatistics} without and "average function". Then every result get his own row in \tw{\$statisticDF} <<>>= result <- gatherStatistics(sim, list(V = NumberOfType1Error, V2 = V2)) head(result$statisticDF) tail(result$statisticDF) @ \subsection{Plotting a bit} <<>>= if(!is.element("sim.plot", ls())) { sim.plot <- simulation(replications = 1000, list(funName = "pVGen", fun = pValFromEquiCorrData, sampleSize = 100, rho = seq(0, 1, by = 0.2), mu = 0, pi0 = 1 ), list( list(funName = "BH", fun = function(pValues, alpha) BH( pValues, alpha, silent=TRUE), alpha = c(0.5, 0.75) ) ) ) } length(sim.plot$data) length(sim.plot$results) @ The are already different kind of R functions that take data.frames and generate histograms, boxplots and so on from them. For some plot example we will need the lattice package. <<>>= require(lattice) @ First we calculate V for every MutossSim object and then plot a histogram and a boxplot of V, see Figure~\ref{fig:HistV1} (p.~\pageref{fig:HistV1}), Figure~\ref{fig:BWV1} (p.~\pageref{fig:BWV1}). <<>>= result.all <- gatherStatistics( sim.plot, list(V = NumberOfType1Error) ) @ <>= print( histogram(~V | rho, data = subset( result.all$statisticDF, alpha=="0.5"))) @ \begin{figure} \begin{center} <>= <> @ \end{center} \caption{Histogram of the number of rejected true hypotheses for alpha equals 0.5} \label{fig:HistV1} \end{figure} <>= print( bwplot(V ~ rho | alpha, data = subset(result.all$statisticDF))) @ \begin{figure} \begin{center} <>= <> @ \end{center} \caption{Boxplot of the number of rejected true hypotheses} \label{fig:BWV1} \end{figure} Also after the "average process" we again get an data.frame which can be used to generate plots. <<>>= result <- gatherStatistics( sim.plot, list(V = NumberOfType1Error), list(Ml = function(x) mean(x) - 2 * sd(x)/sqrt(length(x)), Mu = function(x) mean(x) + 2 * sd(x)/sqrt(length(x)), M = mean, SD = sd) ) subset(result$statisticDF, alpha=="0.5")[1:3,-1] <>= print( xyplot( V.Ml + V.M + V.Mu ~ rho | alpha, data = result$statisticDF, type = "a", auto.key=list( space="right", points=FALSE, lines=TRUE) ) ) @ \begin{figure} \begin{center} <>= <> @ \end{center} \caption{XYPlot of the mean number of rejected true hypotheses with asymptotic 95\% confidence intervalls (pointwise)} \label{fig:XYPlotV1} \end{figure} \subsection{Memory considerations} Up to now we have kept any information in memory. Somtimes, it is useful not to discard any generated Information. For example, if some objects in results appear odd, they can directly be reproduced and of course with all information availible we can investigate anything like distribution or any statistic we did not consider before the simulation. The price for this liberty is in general an extensive memory usage which of course restrict the size of our simulation. On the other hand if we exactly know that we are only interested in $E V_n$ the mean number of true rejected hypotheses, why should we keep the generated \pvs or the index of the rejected \pvs ? Thus it would be enough that an obejct in \tw{\$results} contains $V_n$ the number of rejected true hypotheses. We will know show an example were only the information needed is kept in memory. The following is basically the "simple example" from section \ref{a.simple.example} The main issue is to save memory thus we will calculate the $V_n$ right after applying the procedure to the generated data set. If done so, we can also discard the generated data! <<>>= V.BH <- function(pValues, groundTruth, alpha) { out <- BH(pValues, alpha, silent=TRUE) V <- sum(out$rejected * groundTruth) return(list(V = V)) } @ As already mentioned anything in \tw{\$procInput} will be used as an input for the procedures. Since our procedure now has a parameter \tw{groundTruth} our data generated function has to be adepted. We just move \tw{groundTruth} in \tw{\$procInput}. <<>>= pValFromEquiCorrData2 <- function(sampleSize, rho, mu, pi0) { nmbOfFalseHyp <- round(sampleSize * (1-pi0)) nmbOfTrueHyp <- sampleSize - nmbOfFalseHyp muVec <- c(rep(mu, nmbOfFalseHyp), rep(0, nmbOfTrueHyp)) Y <- sqrt(rho) * rnorm(1) + sqrt(1-rho) * rnorm(sampleSize) + muVec return(list( procInput=list(pValues = 1 - pnorm(Y), groundTruth = muVec == 0) ) ) } @ Obviously, it is unnecessary to store this generated data, because the number of Type 1 Errors we are interested in will be directly calculated. Setting \tw{discardProcInput = TRUE} in \tw{simulation} removes \tw{\$procInput} from the object generated by the data generating function after \tw{\$procInput} has been used by all specified procedures. In our case theses will be the 2 procedures \tw{V.BH} with \tw{alpha = 0.5} and \tw{alpha = 0.25}. <<>>= set.seed(123) sim <- simulation(replications = 10, list(funName="pVGen2", fun=pValFromEquiCorrData2, sampleSize = 100, rho = seq(0,1,by=0.2), mu = 2, pi0 = 0.5), list(list(funName="V.BH", fun=V.BH, alpha = c(0.5, 0.25))), discardProcInput=TRUE) result <- gatherStatistics(sim, list(V = function(data, results) results$V), mean) result @ Here the corresponding table from section \ref{a.simple.example}. <<>>= set.seed(123) sim.simple <- simulation(replications = 10, list(funName="pVGen", fun=pValFromEquiCorrData, sampleSize = 100, rho = seq(0,1,by=0.2), mu = 2, pi0 = 0.5), list(list(funName="BH", fun=BH, alpha = c(0.5, 0.25), silent=TRUE))) result.simple <- gatherStatistics(sim.simple, list(V = NumberOfType1Error), mean) print(result.simple) @ The same results but the memory usage differ much: <<>>= print(s1 <- object.size(sim)) print(s2 <- object.size(sim.simple)) unclass(s2/s1) @ \section{Reproducing some results from BKY (2006)} Now, we will reproduce figure $1$ from the publication. For this we need to estimate the FDR. This will be done be calculating the FDP for every object in \tw{\$results} and then calculating the empirical mean. In this simulation where we exactly know what we want and thus retain only the necessary information. To be able to calculate the FDP right after applying the procedure we need to know which pValue belongs to a true or false hypothesis. Thus, like in the foregoing section, \tw{\$groundTruth} will be an element of \tw{\$procInput}. <<>>= pValFromEquiCorrData2 <- function(sampleSize, rho, mu, pi0) { nmbOfFalseHyp <- round(sampleSize * (1-pi0)) nmbOfTrueHyp <- sampleSize - nmbOfFalseHyp muVec <- c(rep(mu, nmbOfFalseHyp), rep(0, nmbOfTrueHyp)) Y <- sqrt(rho) * rnorm(1) + sqrt(1-rho) * rnorm(sampleSize) + muVec return(list( procInput=list(pValues = 1 - pnorm(Y), groundTruth = muVec == 0) ) ) } @ We also need a function that calculates the FDP. <<>>= FDP <- function(pValues, groundTruth, proc=c("BH", "M-S-HLF")) { if( proc == "BH" ) out <- BH(pValues, alpha = 0.05, silent = TRUE) else out <- adaptiveSTS(pValues, alpha = 0.05, silent = TRUE) R <- sum(out$rejected) if ( R == 0 ) return(list(FDP = 0)) V <- sum(out$rejected * groundTruth) return(list(FDP = V/R)) } @ Now, the (partial) reproduction of the results can start! <<>>= set.seed(123) date() sim <- simulation(replications = 10000, list(funName="pVGen2", fun=pValFromEquiCorrData2, sampleSize = c(16, 32, 64, 128, 256, 512), rho = c(0,0.1,0.5), mu = 5, pi0 = c(0.25, 0.75)), list(list(funName="FDP", fun=FDP, proc=c("BH", "M-S-HLF"))), discardProcInput=TRUE) date() result <- gatherStatistics(sim, list(FDP = function(data, results) results$FDP), mean) result @ <>= print(xyplot(FDP.mean ~ sampleSize | pi0 * rho, data = result$statisticDF, group=proc, type = "a", auto.key=list(space="right", points=FALSE, lines=TRUE) ) ) @ \end{document} mutoss/vignettes/simToolVignette.pdf0000644000176200001440000064030114404061507017450 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 3466 /Filter /FlateDecode /N 99 /First 790 >> stream x[[sG~_o!BV*U@@lLA aOP-u7#Fq7 ! 0NQpQ16|L@!5EĆ#"bdn! +eA ꉄR 1¾DqZ0++R MD]Ѐ5RRϩ}(=!M O]̴u}݅+B݅;QTEw@'էx[,!DU<:{O %סVu;p)ǘA Gdx5Vɟ>T3!{b|G@8'ӇVW7DŽ({V4(O?IQ3abB̶/>>yKmlG{o^?%rExQg6nۅ?~ُYIxX.7nڅlD jELn#>|rV\ppx{^O{gPFEeU3tZg׉rMfŬ24|+ Ѭhܡd]KR7׌?)xrEӒỡe{z~C(,Fj$BNHŸ>:;=g+Unv.$͢plV%zBSv·]fb!=&}aG7@Sc/+ANma9XDg2B mIel\B=Fgɉ݉݉ PvK~Yuy#׺o\p_N+qoZbHMRؓ~] px]u+dGa7W4]%/-+zXM{ݲAzlͦl $Iz`w~^}B-=ՄyI?Wnu!;G_57k=RށagKW'ttkZ9Mײfڥumd.l71UvXYY'歔%Cf.F+ b}7(*{k^;-ݚ-j˝תK(7\3],~}7kn>6[zo=k"M}o?}`3~78>Nܦ8q/.$-c}e0Tj0d»(5/;[]"ϵGف-S-mGN*ChlW-׮RwPybVY{Wz5>Fl ;ȀXdB?:&_ wfoE?a"McLH' kr&O- ] ?h:VݡvthT'JPRi:Hz4u(o&jg1_I:h:\oל{HX\AYuQzHGZ (1 l"$)h>EF6'ʼ.߉^b'b|Zd66ڏƒV "I2RH;I6sv~qpa$͸w['\sb@7OURQ]\TMXZk HIl'+r xGWv"5Db2UX3 l$9 z:S@[-y7cüv5 /̼sk>떮"D1˴՜&k t #z3|H?$ap\e=A "^˽e(54RI\-c3*L+Gœi8*e-Ί8/>EŠAU=Qic1ƽY1.&ŤӋqU?UT4L/I4:&.XiUZ99Z^H~&^:dZ{7'~SxPn.NkLV7`{CG| ƀv@s HǗMj1,øtpFnF{OE]6 863:Z-fe3N6ͼOA ENs9jt<~Śl5DubQq=)~@<,xyp\iej_sw?,8g~#XpQ~US_^RJQV-$Eq ~-~lCݔjd,~/~&+ :iu*w9-Ֆ"AElIW槿9=>z\W좪NR !67 > stream xXK6W=I@EInE 1PM,晴Ϳ(ӯ` 4Ŧ5|kSTk|9ӶMϬ5.l m<`F· /WqeGNERPçuipE&Qp6_nV.Ot5RXjXˌ/RevLR)mccYdt\%70UjVʸdTTp<5S{=$XjP-rYrIw?hReIH%: ^#tf6P$ 0ǔş'<2SVl8|GxV[Z05 Mx0$_E@.z TBQD[|wK 5EJ ᑞ44bY>Y𾏫QeH~b}_Xn 4'blL bN0Pxj[ =<5JB^D$DvTCCnId{{ytTrujEMt@8̣Ta2gu^~CrCC?:R@jqQT`A(q`eȘ7X$KaeEhL L!!j;Ji䮵HD;hv eyXpJ@#0UPDxZ jc\6NԑC@d3xT5J9̲EЬ vtvCC]QA,u3G# ܻu$ V{r &-2N1U{4M%d7uht#1j2pbcz$R)zP5߳.:3:*xFOpQ-.zC,%0;nxRG[f8pNYNoo65]bw&"(qC"O_7_Fn:c w{BJ1e ;cVu, j4${Ȓ˵)n~|UxhkT1оHU硟Npڐǩ҂_yDz!Gf1sHTk*R@Z>BERnYhFP X:+~k~dkO ]nʛߙaK[X3:I,UNЮ*rO/(?~&ANGsk΂jCqyŸ {lRcU`wQŮJjȸɑxqWQfq՟B6iZ=[YEM'˔r5U- \ n>[ vrQghs3oD`6!tT_ה:*p ~gkx-carG֛ulOU]:T4[׌NIRb|71+%'uCnQS=ۭ+Wqǥd'{ה{>s:`q a|'%q ',%O1R2[?d15ok8oEҮW/^_ jendstream endobj 102 0 obj << /Filter /FlateDecode /Length 2610 >> stream x]~їII @I}ډm:ͯ|&špf83y[?+UYbvi)K M9Y;K\.s㒚iø=HG|ΓusA3U#ui%+@moY˨9 w? >׭@[ɱmZ2ϙQfmc»+^cIu2zV T4F4:2(ǀs in|yϔ.)~eOOD,ggO>XS!j`,9 $JW} +}n!/)s]٘N`<^"Iߧ:pm͔3R&fQSh.2wlaL#oDgHn&ѓvYQS*ځOx,C.\ҜD܋3:d|F0\|YR3cHP^{}X1P"8Ou; aD 1ɶ78@kZ+owsGJ? ɤ@q;۠jP2pyƂ0B8rz-A'-5`R?xtdnMFR"ObH;9pujΆ֪e[1fR+e7u"@{_W81z)mUD*@pC}ܐ,XM77zXiQd;t_rR D:+T'TV UKJrfփ>Ӊ,lIl2s T/*\d B  pi;t||qGPB<̙r x 6ÁfؚG??{r|-tU^C]{;Y)%%VoJ !QxKa7_󓻟^7UXr߇kC\&N*-? Ea=@3/U)>a7*TmQmg>AРM\_T 7%3 ƒ^ 79[A[r?M9|NޅucCLoLcDgsvvz^ \?>vp`hxFh9p(RƆ~G"R:19P̑wh'VB(.}?oa5? {O l ?9@ZQ -0AdTu E_yt+Bta17{۫êK(>MR{| I!GӸ/[v(:JTՄBeExou㲉nvۡB ”'\%EB ?2a\ޑ'ڗʖ}.ܐMiTiG9̚`. GuV8}-x:iAWЃ!Az x;e%ye17q{ۖD,(iN>.m%F/U,,T~5%^+qضQN_.p q> /01!1!ӹÉ/+A*KtgCs|'Yrk@GV u{K*K_G =58S \x&3FxaF1z]&L`):Bso['48٭$ͮW?1@;h3ۘ3\Mq:*Yj)E[݄OuL>ٕU TKW^_&CJA) v[ [It K57.kEU r5']VԱ҃6,c+W\Q~9 X9ڧWϽjpAOtn i% DH`p8A8h@A"* /$DT{w RTi ZCZLLatmOִhRQS*C&ZÎ[$sf[H\WXP3grqbw4fZO5r<;߮];X?$p5%cԃŰStZ9!UPYMUQ~_aWWw^-xmX`E&ipw4TM7JX~9aGp_VxuJkkRQW5 x0Ś\R{d:' i&y%ܱ]|F;lD +8!Qe TqᢼcG(4ab9u߫L Oq+c%L3@ޚ{6j7Hgꩄ=ϩ>vm R E}+)3\ %I'HԗLr[̤ت@sI@>]PA>4vj:* uWŦFJbS~|V;v(!-g !W7~%3Bendstream endobj 103 0 obj << /Filter /FlateDecode /Length 2171 >> stream xYY6~_a9"u/L6H,q&vA$uQ"-Y} /mbWŪ"$h$1rML0Uy5W`:Pf:0|]BXNgQЮw~hx v8Khv :HM[Ukzks౟,xkld }rG8w<0%0XЬN8RGZ*YC+ cKT3]#[ֶӄ*ύ%VYRے7QHғ+ (w%L8`ދA]٠%9!ʣ(J#ذxx-$@(n(cT!@CeY+gY*ɳnDgv?MҠ$Ij1lB"UqǦqP> i?-Qhkj*lѦ$u \91ov<{K$syϒ)$ n% 8(KH:K4ZO=xŒc5o :@$0q@Z![vB@^zdXdW٢j V'k/kΆqsvX, 7rs.XH ژMa.⎭CʎL6:oL(%+{8O|9#WX+:F` \ $66|O`QKjmJjmٶF+V(Nr0~?"pDy;8'au[d;dI? iT zXݝD#{N3(s-~p%]q3 ZĢ8Xm7(AW\F]V4, m]s`@~/ Q(7MwoEy^jxUyr:X& #9Y 3n&[ LZ^!C[M. m1O /0A.??`0,0 EULY [U|~D._UԚ[{Tg-+֪eѢ'VFwЙW<_f_ S0>sy;nuڣbt!_S+հęNdĩ m?h#"4wN\Z,mRrF _3ş|u[GX7(YiOF0>$*rS9ql,Z͑筈^sz呼$w ]ձ|G|>D[rRpp0FeɕG,xJ-֐E] ;GB%iKx\C1z)TOU81j&ؓ:*HqQRW٫5Fe\][\#]vqӈp])q_],әܰLƉ}_ x-Jϭ3_RXѕ,ww%+LwH|:JC~1-OM2ާjWb֫c 2a GBSt$k> /Font << /F2 23 0 R /F3 24 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 31217 /Filter /FlateDecode >> stream xĽK4˒:߿"g3#3= p$M} u5<>nfMA=^Lϲ/v:_/?<~e/~W~||T^כ TB&|L:ᤗG|t_yIKwO:u"ݏ~W'/_~篔?=ʯԖ~/?]?+~5Z|76 =-H&|耏nK3<ᣧpLeʗyu++]jו~~|*j|_gO%Y5XU|,_~1_iXy+|WʿG?鯏? Wߏo?{fuy}?(._żWӿ_O|&}_ﯹǰ7az"?'&:ǣ:Zf5UyVk^qMj Ѣ6wQ&&:ptjE~Ѥ_V#IuY1uh:ڬ~߅#bp}{BFQ?\M|}ҍ~pU?\ק J1Ң_᪷JnDV -(D'A ~Ÿx,pֿ8e:'mt~I/NU/\_ޯEl:J>Wr}*(ĸ}܋>|ps_77A_>قf=%"i}tz_lEg}R'~0J1|o q%᪗%m灳ؘzCC(DW]P W=s}-H'eAF'B _(}KtOҍlWgoA$X:6]t#l7VAϷ#El^gꉯOnATOII~Jn`;U|}Jq}JnϨۨJQڢSOAN\Q?oB 6~A.v^|/A4OҍHQ?&"EOy+_k碏ssԏAd>F6vP W]c"t{A=/z#XMHDv P:@ FYQEX(Dc u(ҍonJe@ *_m(=[_X@k@[K(?(:aF!|d^S: o'q-~; (D|o @[vP:oqݎR'ڢm+B nG\t R'$(݈ tcA4!(c_Rw-vA(n7|}rnDe[!N"q}r(A _J77B 2ק A T?v9Dg[r(D&(D=t#b/Rr:@ pVJPmto?m uo|QV(DI:vSP:T=M\8bp}P7vImzX;(݈ctOAoz뢏N"v P:k@ %@_Q?\>\TN"%IT>ut-BNQ?v (DcWAmvtDbvP:OI@ 6R't#2[cJI @;Y/|>B$ʵt?.Q68"EOe+_{R'1$H݉v>v(DNANt3\c4tk|})H݉v>JQbD;6: P:ՏݎJuoG@ zH: Oto?P:%@ P?%@F$^A\{R'Q>vP? "q}r HDX(c;Qv0R'Q>vBc ;Qvq!"q}r}Bc u'\kh\:P:ooW@Ft'R'Q>v9Bct#:[])tˀԍ'oW@$;JvxRwbN([o, @;Ns}q~;(sA4\v Rw"`tJѹ>VҍȨK^8`3Lwop_du| Ø:r| w+:0iɊ7Gwb5lrZ17<\p84r$8`V̲xr8Q]p8rv,p8-}gp p{ ,qawr3Nj\jZAOZO,vфa̅'%M /|P/%A" 0Lp#1(  Ps1Vnb' j,e~sS`9ȠO/1fnb'ID G0_A jsn>db9Ƞ/S5Ab9Ƞ 21O(8`(yrXg8ΰIG71I71濷>pUc q8O% qb9ȠO#Xgj ]|XW71[' /F`9ɪ1߻E0qN쎇A7=E,3Od&,tSpnfa93pA7};dn, nnA5f;F0 dt_lW3>_ >yX2 pA72O"#t5A|.cvdXc`g|b Ġb#g| ,X{ `8A7Fxp2٬rA7o]X20K,3|0q8Q r;[i1&ob|Lf7_<C G01 nx&Xg8/vj^|,q8Ɗ" g-ùy3༉A7_b8Aܟ q(dܟAOiB G0汻2g'A7_|q8ƪ]6 nnL/a94=D8A7o  k69Sqt=M yq`Xc<ֳ]=M +dĨ#pA7_}41d8cϰK71濸 j&5&|%,tcĠ>]`PcwN3lO{ܛt{ ݛt/͋)ot_lW&|2rp=%dq= n 5ֱ12g;쎥 A7o8  lpưϏX2Ǡ< vc}ztbk1ݼ&0!F qvA|M+pn.]X2ǏpbA72Nz1}n"b9Ƞo>2j pn/pn y1|rAu`I쎇A7q6blĠs!Ù'F[pb8A70 }ner8Scq8ưwX2G|dzc!#XorA7ߑ1obw]N n#,Xb9Ƞ@I2<AOJ n~L*bw< yۢ 3͏ 8#A C,tdy'#t?A5fpd͏b_0g&a9Ƞ8`Pc'Y yL"17QLb9 g 'q dc21ƺ] na 'r1x789&e:Ϊ`87ipݼ.0ͯxsxpohpݼo}Xbd[~r;茱p.7G>b8i~ Ɔ. G0)'bŚ]ft[Xg8%wb8ɅǠi0:UcU&1x7o1oN쎇nްV`9# {% Ùp8x7q. G0wdPc g:nݼr Au:Z,35vu])jar#=܄0oe7Lf7m9japD G0ߘL 'F7g'𚋑ݼх ݼ`& ; Aƻy~%b8nI`F4a9iOK0{wp8-Fya8Aa/dd.pݼ~ #/a8ɉr Aƻy E`Vby1ߒG%A&wp8tr%1d.t rAu0BGr: <dXcޤLt|o p& ݝ0rnp+rnނtvc a0qݼa_n~bPcCrnB=w`8pjrR# ۽dPcp8x7o^r8C=Y`J{G,؂gޘH G0q ?1Xux /_r8Y븅ƻyC8`Pc@ 'z!0x7oR 5=`Ѕ5~pdC|LƊN7b8S j& awC6ňÉnt-b8'FZ`8pΡ}ew )Nwp8x7_fxX)pC*#tw)FN y-TpYxtÉA7?  q}ܣ3Xcÿ'#tç[Apdэ30&s =8ϵc'؈<&k諀dc~dAF[ݼ?~rn, n&Y/ G0^c0wx%0x7oغ`9xbOL߁;C'ƻyp aG0d jZ30x7omO K歡񿫪1o~0x7pd{CLC7o7 G0ۇ AƻyޘABۮn~by5t=1R谧9F(Nwv#fY! t~5p쎇n E%o5X2-% T}z818  j,^8b9x7p 1dntv'{p3߼hb?wV!&" G0{b9x7oo+0d8il$ĤʼnnJ]`Pcb8n(r8IVV%&-Nw 85V|pҢ-KKLZy ?1Jx w(1i1NZ4lJLZp+X2cLIpҢa"81+Ɉ5)pT=E쎇nް}wPbx7o j^x12 X2W`9T}g91d8i1U?+`O'OL:1x7xcyBpfƓڪ6:a“&j즙涪ͪ|pfƓUM׬갇 Ozpc_Mw Uֱuh:ڣOjI᨟P-'xRS]TgUiVǵz3Ij#Cuw0IMjb^VGMqÄ'5_YjCxRG]Q5 rjg=C~ZSRYTfu IϫЈ6?jiBj:Նp-j02Zڪ6Sme?G T>#~ *| `ʵէ6K)gdⅰ X;>%~ř t\6=Eoi[{*yY耥nzޟ"w̔=̆ilz^ۦ׶S ЇOϼEDN3@@l{cSK$/"'\R?SE@7=0=O>OpMyT?1ylzޞ"L<𩟇ϸD@}{62| IV=Eo oGsqG=Czɛ^x}fmΝ$|!f>OpMica+$>U?31:s0 _>_IgVnNu?E%ŝ"צk{4 )Ǧ_#cg]!qo'}D9MF|oOI@L yYu{+Zљcg ~$x} Eٓ,iKZ~S4АLuS]s7ӀƢgvsqs3DH@L  /S?v]~hWgbsy u:6ENkԏm2I@,>v'~Nzu&f=cgXc}Lϛ;;ԏkr#ؙ :`n LT?1w>vf耥mzic}\ĝT?o\SoGQ'v&fcgb}Ľi;(”7=EXC uqn8'=Oc oQ?9^;tc 'עs15| >{'=` XMu&k>ְ8ʦ2mk8R!,Xuz 9gp'xS?vÜzanA@TatC06[  o} ٨H@󑙘n8ANև~ )N}@>t@~ SrE羋X!u6IOz>tc7$-Xc}쬻ؙ 'zs 9n82Y<=8@06P ?t~#zY9W>v&# S]3wVI@L>vz.z~}t+^vp0/syDx}zx}u’7E.qxEI@L>u3O~~(s]G_0 Jox$Ĭ$~ :-[oHNۦ-}}kJ!L!:`^N>ˈ!XC:`lG5L9Cz>A@>5v3 S~?bc_X8b}xtzGx} t@ >`l`/t@Տ!PFuB~:7 է7 耪pAuB52@3a9pk˵o}(6 cfʦ5^{ÀppSc7,;iogbXk+.<kk!SG319= !pof3dI@Ϛ$ַyW'PHNmH@Txp1Fz)Et@ՏI@>I w@NXb}߸+=~!A@O>I? 0q?k5<8 ,z%ԏ=0l%a֧b}XCҸOXCjԏF:`-Ǿowް  X68xS?0pD;2Tq^U?a#:[F:߹@0 I@T% 0KX+Νwo@@Tb5ً!:;Sc>Ӝ ?X#O&9&gE'Χ|2pk$Ag' _q82taA_H`?q0: O00cb<:5Pe0pk$Ua8=5p|RH~L.%CF çcj$g8j<HGπ?+fC|%}8q:&laJ` n+gC<`0\d>DŽ5aF~: xQcCSnw8XS7OܟnA5誱22p8O7cs| ؇ӿ$Cpt\ Cpt8Z mi qԘI}-8? /OiV]8 /GVuvXAN{dpNS?XO.H qnd,8ӳbvbO3| |#8È瘰Y˟Xua y` V7d1:`YCc7b=1J| aG7y /C⨱,uXCA5{Pa8_8\ /NsLX'ג8j(#| ="C]}+o?X 毌ovC)˳d V7y* Y1zc`bv8/(ϊg:b'qyj?| l92p *-_~&8_> /h snOd V7$8_  IX> 毆_>5 Qc?An±` V7^2CaXCX{I0cma1obuOB"g2pn?5瘰yub V74%2p8N֕ ĪwW`V7o7C st'| JV7K2p[2p8.c.::UcyCbubAnQ|ۿ j!`>DŽ7*n~ 85`>DŽ߸{t&ݸX{0n18q0:|8ߞ$rF7n32tg=1X@sLX2t xn;| B!GWd(>\'3` V7 8| =!F)$S0d>DŽl2p}G:8oA`uwUV%t`pC㌱} MX|d>DŽͧ S?X5d>G";,o1c瘰* @9g:ͧX O!9&KXc1`Θ  MX|Dd>DŽUcɿ&99c쎵p܄'Cbu%a9aOAn7d>DŽ2tQ080:c^r݄'<I7au69O7dV7<Jbu6d V7ph28(1aui`9neY7au'uq~jnX'u7augqn> ĪAnޘ!`u|#esLX<!\sa8|(1au5ěy~|`` ~7sLX|Ʒd<߳YAn萁X5V|_1auſ%|0:Ĩ_0p~qLބ|4 /!9&+~R<8Oq˳W0c拧+ۊ  7 sOyV7_2cª;40p8y7JsLX|8Ĩ&d>DŽcw'8Ik7au'x8jv!⧼qL3ƞ7ӛyc:uC5c3]  &:MX| | G c:57auW0pQwG`V7_}48fcwC&nUc5ao֘pL=8WT簽 >_瘰jfuXc1q{9ro+wݛZgv%jla/cד{V7_} 8Ĩ968SX8cw!1ᨱU1g;장s߄n.2p8QcGsLX|1auKGsLX|Bݼk| ؃nbd>8vՑV7| 1auvb V7<~DWXNd V7|n:7\Dbug 2cBsLX|t){A瘰;}V7=B9uo| ~[spx߄۾S KtعEsLX5[d>DŽwڑV7kp_|=d>DŽUcX|GZpp߄w]Nsnw$A~{Cbu({tCsLXOJAn~L*2cmN9DžϜn{An~ ?tƌ?DŽۆS c7V7d>DŽ2pǎ`2tt?O<6z!JsLX8'^ccoҸ| Gc:u,x10p8y!H&9&COAQaGD 8!i@sLX8> c:olb>DŽuYB8axd>DŽu㉃8ޘNsL8p{'R8`n0pΧL2c-m| 7~/8v)8f:Sn]0ycbd>GLC0yc'z8j)jA`>DŽ{tf7&sLݼ1Qc]f=ݼlK9&nf2#pߴnH q2:8[9ר$1yѻG Nݼ[1Q8K| -bvd1td?/ݼ(70cª1L%1y@"sLݼ1v28=19&S8)bv cb/ЊU@7/-yXd2pwo0|y1p9&\K8H7o |7>A5M::[ Ixsanނtw9&'FKb f7oL+b f7oA:ZH8g瘰j,{Nbv,bv؁7.-gGVe%f7[.2#p')sL8i1pQ9&n;F1yd>DŽkOX5V<$Ibv깃cjrR9&nq` Vnޘzpb>DŽK ~jla&G01pC0Yz 0c^8fz9&nޙ!`՘}7P|1Ѓ| 7Nݼ 1a&c]>| gu#9&\G8^ Īgړc¡}h8poL"9&'FZ0#p9^!q;Sn޿:| ƺ 9ǼC*9&n>0qh"=jlsLXB|8au㞘1au;Qcÿ'9&n~| 2p."18Վ sLAɖ9q懟FsLXG[5n1c[1y{0f'u0ɺ0c¬1T| +| 70p8zbON;p/9$qq)sLݼ? |E5f-0yk[}8,q歡qyk~/'構f7p8=|Mݼݘg1aCAn7d>Gnnr; y=t<1p)祙#'nnĬ;x[,sLX5psLݼ3C a EqŒ7Pd>DŽUc KAno .1#pT}~U0y'1cªAn>L2#n.plp'Fn;: *sNVeؓݼ`>Gho6{U8iq| Ʋ%d>DŽcGNZ 0r '-N|62cªc8&-rp?9&'F=8ǤEc_ VGbvZGS8i1pLZ4ƮI'\b>瘰j Sɘ8&-.2_ǃcNZ0ycZ0pw`טhwAn1{ɘ8&-e1G`vw.Z1Q'c1揕oqw,/ߊg{FO[h->2 9+<_۞@\⸹]&/~>c;_pS1ĝK[ G#dNb* L8b|9?xP $Pl _rXGx^r<'k/&gP'B43R=lAtͬɉi"brOWh'ϸc$̥Z8<9\=[|$ -wrq &k`1pwQ.]bx7Lu>|t iZG: Ӫ9c:Zuj >1,d.mǑl')L>4vRA&k;__Oh;G0<1b`.1d6}۫>|`ns3mpڢ!x6),9=6)C o%IXg630`[H:քp'rtdk0[mIa}pQ M ,ccƤS)qD: dx'7M G ̈́2<C2) Nc+1dr)d4%Lg 3 ǩd`y:%O^ X&$JPpˑy)O2HDi:Q 1]ڂ#A%3x%D@`B~s( ptpFG1<]b8pCН'a3K  /%sA2b򌎟4;] %Oó%ÙppFg(v`,1dŝXb9Z~i3; s[c!%Ù{`x+Z% G.3; eF_#J,3+eB48+1]{k<[047+riF2T46vA)H%#1HóH%LS$lZ$aNNቆ& zH,GxOFEg2܄ (p%H`µ.%mYhA# DNPx# t3>&p("D1<í;W 2^9  &)b8h3 r8yWN!]WLJb94Ji\0$Lц)ϖAiZ0<ȉIb8h “p1'dh#'!J$<FtnIb92FR%0m`yb"VC 08 0H M|$G 4&#1dx=cpq0g`p%D2X4 %X#;(X#1d8idH0<|Fb8SH5A#2khnEbwaEb8phCX`8Eb9aEbw<̘BӠ`8Eb8fpZFI$_I$ng$qڌ z3pH B8$k+9NӃFzM 8!9vl g`@mE -pgKsm ٲ8ᳩ7V(R 84nbUX y*, nTX)Y2̅ AHp‚W] 8*,x5,l ݼ‚WtT\  7),l 7b4g0La >Ȃ(JV SX)-U3 2, n!RXd *,x@` 1b|~ 1OL:װ`:8(,lD ݼ‚)`s ÑJ|f!o 711, nEPX٬ Ǟ),b0Z0c|b|d.\ qu@RX0`2k+,,GNSa)-a\8a4 8&EB3CX0G7aA`9<>‚O X  EX0Fsvo=FW`؉` yDx0FAPv 2, F",8' ƠA[a3"K|sdRp 9=zk|o-^55zk|oW>oy[~{|ޖy[~x{;~==wX7tm۪?.:.<ߏ$B$ty}?X_B遫듥uG]'K=ɒ+ret}"QV`[P:it}"V:eO$Pvޤ_/{gdy"= JOOlS_iV-z=0t>ao u}_x|UүyGק:OzN`{.= JϾ JQWzi]z|#- JxF.f,psZ6z_unuഋ!*-(*NIP:yZ W,(=?3Yza0|U/t R'1gA7~$EPzy6 O;GD$^fEbEu3O!NEoe OPzz< Ja%zm۪7^(tڿ[ u_iW]' (V]Jz/MPz6iW]'ߙrN'' gz_;OJ=n^}vP:yu}j!9O\u]]}NxQԪt>Y(D_H(?[oc&hq}z}JO6]lrL(D]#O.JϦ/gWCd .Js>9qng5]Hxtr얺|&J/v+}ޏE3tu Rw" iQ@'PzZ"(D$^^ۼLDiJKH ~UxR@ .(uەHDӜ4Ay}ƋP:" JGH -0x J8e.o߼vI/˳mQLJO-I/A4UPzq' JA :.7ԝ:uwUz|&=),}JYף~ JQAg;"S{@$UtU>|+'?Dg+151x}Tq :6x J WK߾I4J/&i;9 u>B ,(=ȋdNPv1'A>Uoҳ+/CP:\| !uCzoqJC4CPx6n.pq}nRwh7yIA HĠR7b>UHDJOؙK}܂IֿJ1wA،oCvH>aO>t蜙dK#<4#&pի$(=[\|7ty{|ܠ;<8}uO$"Ss@`noYP:* Jo`ȫwKһo uUzbG^}1OS\hҗCEDd^](҇t}DgmJѤAŷ;cRN(?ۡ yC c'fIOұ]ݴr%WWP=5l4kz`tQ"w;P\uu%խ:'ٶ8bu/zM~<b~+Ƹ~ۋuO=ƸnAPJ{ZKO75{G]?~kĜfo O?f>u O֍M7{FSs?s/ ɞUs6_q=CgC5 IƦ9Q ۢƥ9\ٸ5g6!>|V##lxhhN}Ά'YHb1g69cU&Iv1gÓƽjVÒCbH!MhcV92dcӜ OlIl?gFri:[s6gÓC}jDҲqjΆ0 S #ggFrOĬF$ >[Y3 ՈTÀل.y9ٸ5gÓ[ ~gF!MhtğF7>IlB{E6lxrQa,A!ə9vlHlLv}F$Y K6mB}lx_Yl'lxX72Ѹ8 =Il&̤؝rۭՈRXل\ڄjD~eI!i5gc7gơ9&lYy?0Mh ĬF$qLMjDԸWjDH# oJ؄84g߄W1gyMjD(O>aɦ>MCr1Ո7b\jX&\|YH. aDSߑp}F&kjDpD}Ά'5Zհ$/dFӜ O_/x%.ֱZsD&HZll9jMjM=ut?j,zw{f׬F$ {!M7"Yc'rV#SΧaPYisȭ9jkM$.SjXr&\L֍YH|.RbFӜXFOg5"98F1Rb\ s bV#߄{7"c rV#c8%f5"ijtg5,i/Ĝ,?#i}b.Sb܄OpgbV#FhVÒ<ƞ+\hьE[jloZmH+jXi&4ɥ9JGSf+ĬF$ cKn'ijH"f&oՈ7awsF$[lmsxqM$q4݇ibV#߄;Ќ ?M$/jDL1{#ѵُG1gÓK/1aps8g5"6h "VY K؄坛I`4|F$:*ϗlxgm?[$w6nٸ?N߄ͬ], wbV#߄1{#8lѯE&} OXY KϵHfɮƙ&ɮLYHjJ؄&}6SБTJ؄91{#߄7"U&[jۋ1{#;6ag&/xC cH߄M /5fodrѿh%goƬF$vďbӬ%FtH|NވdMxسe1{#8~`đvьp]$[l̮YHlܚq?`js}Crd֜ O|xK0C S1{#8Zoqu8|/3;jDrdipz:43f5"MxKRvh^IgbV#{80foDӎYHN5!C%{igpOqH|ejD'jc5 ƬF$q=U7" 4{#?'vHn5פ=yLHO}'8$ /;N-7_4{#^ŬF$~$`7" u$4[I?^(!#V{!f5, {{#!#C7QfoDGbͫf5"c%\;OtxHBa7 \ٸ5g6|F&7Lydp᝙oP 2554~) 1[I㟷 3*y@rl'CEG1{#7?-An }~3&󛄞7 MMB7\I}~oMB&&󛄞7 B$t>Iho>I}~oMB&&󛄞7 }HB&&󛄞7 F$>IhoՑ7 }HB&&o\I}~D$ }~Х 3L| =0L| }˄.gГ 3L| }˄.gГ ˄.gL| =0L| }˄.gГ m>Äg0aB3L| }˄.g0aB3L| &ta>Ä 0aBO3Lh0 &4gЅ z2aB| ]0a>Ä.gГ m>ÄgГ 3L| &ta>Äg0aB3Lh0 &d>Ä 0aB_2 &d>Ä 0aB| ]0'&4gЅ фgГ  ]0a>Ä.gГ 3L| }˄.gГ 3L| &ta>Äg7L| &ta>Äg0aB3L 2aBO3Lh0 &d>Ä 0aB| ]0'&4gЅ 3L| =0a>Ä.gL| =0a>Ä.g0aB3L| 6aBW3Lh0 &d>ÄyeB3Lh0 &d>Ä 0aB| ]0'&/0aB| ]0'&4gЅ  ]0'&| ]0a>Ä.gГ 3L| =0a>Ä.g0aB3L| &ta>Ä 0aBO3Lh0 &4gЅ z2aB| ]03L| =0a>Ä.g0aB3L| &ta>Ä 0aBO3Lh0 &4gЅ z2aB߼2 &4gЅ z2aB| ]03L| =0a>Ä.g0aB3L| &ta>Äg0aB3Lh0 &d>Ä 0aB| ]0'&4gЅ 3L| =03L| &ta>Äg0aB3Lh0 &d>Ä 0aB| ]0'&4gЅ 3L| =0a>Ä.g'L| =0_3L| &ta>Äg0aB3L| &ta>Ä 0aBO3Lh0 &4gЅ z2aB| ]0a>Ä.gГ 3L| 6aBW3L| &ta>Ä 0aBO3Lh0 &4gЅ z2aB| ]0a>Ä.gГ 3L| &ta>Äg0aB3L 2aBO3Lh0 &4gLz&B|& ]Dg(4gL3Q|& =DI>g$BW3Q|& M(tE>&L"B3QhDK(4gLz&B|& ]DI>g3L3Q|& M(tE>g$BW3QhD+(L>&L"B|& ]Dg(4g%L3Q|& =DI>g$BW3Q|& M(tE>g$BW3QhD+(L>&L"B|& ]Dg(4gL3Q|& =DI>g$BW3Q|& M(tE>&L"B3QhD+(4gLz&B|& ]DI>g3L3Q|& (tI>g$BW3QhD+(L>&L"B|& ]Dg(4gLz&B|& ]DI>g3L3Q|& M(tE>g B3QhD+(L>&L"B|& ]Dg(4gL3Q|& =DI>g$BW3Q|& M(tE>&L"B3QhDK(4gLz&B|& ]DI>g3L3Q|& M(tE>g$BW3Q|& M(tE>&L"B3QhD+(4g%Lz&B|& ]DI>g3L3Q|& M(tE>g$BW3QhD+(L>&L"B|& ]Dg(4gLM>g3L3Q|& M(tE>g$BW3QhD+(L>&L"B|& ]Dg(4gLz&B|& ]DI>g3L3Q|& M(tE>g$BW3QhD+(L>&L"B|& ]Dg(4gL3Q|& =DI>g$BW3Q|& (tI>&L"B3QhD+(4gLz&B|& ]DI>g3L3Q|& M(tE>g$BW3Q|& M(tE>L$B3QhD+(4gLz&B|& ]DI>g3L3Q|& M(tE>g$BW3QhD+(L>&L"B|& ]Dg(4gL3Q|& =DI>g$BW3Q|& M(tE>&L"B3QhD+(4gLz&B|& ]Dg(4g%L3Q|& =DI>g$BW3Q|& M(tE>&L"B3QhD+(4gLz&B|& ]DI>g3L3Q|& M(tE>gб Fw_[?3_ᰟJC^rq|z_aQ_{P}P˟}߂}]1o}?ߑ}~%^Ӈ- ?8>R[??_/Zɿܿ3i~[__O_?.ߟ߿𧟾~V뷟~_!`~  [endstream endobj 105 0 obj << /Filter /FlateDecode /Length 1037 >> stream xVo6_FkF$9lVx}irbImw<Ɔ A4y/棳8RF*+O@$b?R|}E}6'/LA+~GEH$9"I,;X9pbs:XI{THoO4,m:I4R^YEtIw0U=,n^}TXe1! H߻mR;pFnP>q!'ڸ㻈\crxhG.!+64GgS=H74wӟMP#λkO6,Z;6-R ;rmMKѯ&n:RZx7׏= '^}50FsT@KMT@Z]FY p'T7 NXendstream endobj 106 0 obj << /Filter /FlateDecode /Length 1502 >> stream xXKo6W=@I @w Kc;S`ߙPA% qw gR[ ;S+rlpH1e%&ˡLsi-r RO1H:agSOpl2_l*y~&{g68yӣ̬H "T--dv줷a3~Gc )'2ç=g0x (e$0BJⶻa~<46!{V`Bk[6dRo:@ *=/TR 3S ŷd哄֞r-6kON(lP=[-ϩS':еhRU-7%r۔!"? ,bDUDžXْ;Q}i%L/T# !}>P' ʧ"LR6 cDn.@^18J.Zr9m,ˮڡVN&>oy6:!3V:ʅt2G$0L=F* Fl Fi@iHuDz ӡڇ[8#lj<87Nn4y a625u?<,q3g3]BGITlvf# C I:L+zl]Z@UmEڪp¾8a  y E6/?zSۺ*Mmt'sQbzI˴>QDT/7ex!Ƃ%X!#9xqPIPYx> stream xYK4Hm)zX)j]EmQlp$@&y_Owe˱.Tqp"KVwuݬUvI]YY!U9[f\tFd=ɱkrn*4tgOǎl'{:Tygɤz_pbf&u5N;໹3ֹHu+E&wwTQRyr$/)NW-v jϋ"~|J9ֿ~ 7'\Rg6 ϯ꼭8Qb<Åjh#IK4tkgqʺ:dqn酄w!=n~Km:$׃Wy홡ȗpp:83)?pxwICȬvb@]: oH]& ΉdJ-g5 x <nEq+ m6,v R0VJt;TN6YopB(iQ|0B6 7!a- @x 2!RV+/{Rڌ4|;G3A.'4]X7qp'1<=I_͠(F!0y&.0Hm;Ϭ_l*FKvF…-Dfco0eB@V2<_4FM|\{ .uDCDDO8#"۞_muNRW.:^Tzy [3DĔ?iݴs`6B2tӯ4w}EN&rc{ޣ&P,t&9󼉓}&vjU3tzc)Ka!6$ r߬:yTU|n7X!upґ"ֱ&5ySgQ]fp5tl[+_{9.鿹ޭ rf|.0$m5ޤ (Ūmb'b2َ9A(!TX!y&ʇ+3񴕆qfFR DT ,ȵG6))ccćK@~oʝ:SP,}]84>db;et:NF?TJN_vcğ$4 09BReuD-fS'FMNˀCl/:(E(W@wiQI`lA9p+]t-;:3endstream endobj 108 0 obj << /Filter /FlateDecode /Length 1716 >> stream xڽYK6WƌH"E{)klpf'uE2?Rpf8/o/^+&N8d~3 WIZ!̗Y\~?)TT&Lks}T9yP/sOv7-rB9IO/%$E[Vp\Ц! mv ^S<"Iqq2 'k/J/䱢 KĜH СFCxMXh. {NWʱ~5Ą2j0F8vis8E&mWa[1 Lei712kZdDEv˽c .ESDLHpKBLLhwdٳhH5㕍aaJ~3&FP}{qm̰"5S P"EQ4fq*.t5~5ǡ͒7%bEO\P`'1Z[nf2PY5 LÇ>Vi_[tnKTi,nh*CpL}c^ Ҫ}7Sk})̏4X;hA6i(TQPJÎ#Y(QGanU+(TQ0BӅ^qXg_éṾB7xe(QEBytL VQPGa& mQXDA dBO:9~L+(QEByQFжJT^ /p ԅoӪyS$p0PC:}l?*]؅b>۪AUH*B7 dtQnj =*nKI\!}1J]-pK bf/6^E~]}Zm8'Lu8\J_a5,H %anjߤ& %n)׼XՕ.DX/MY7Uogjߧ$Ü˟=9o>7\0 | ,Y կbۥtg "W^(ĆylC&.@j)7#On2џj 9͏q<\=p=ڗqZ͓׬G-^|Fjh3n6-R *fӽTh3:?vEn V mdf-+1^NBendstream endobj 109 0 obj << /Filter /FlateDecode /Length 1148 >> stream xڵWKs6Wp29P&&O693K#ӱZYPR2ɯb AritX cŷd:%\(fs\3.dz|L_NxzY@@ɧ$O2YYGX &Y!dk E8+$+9m"i sPgYЕ59SR<EjzۑWtt+5NxC/"^lG(O@Y&€LJ4p1LWڑDشz{ P8NbM|Yqf(F!2SKe5|t8-6xgW Ɵ"%pM06 \O]pLa~ ~ZHd1O4+X9$3 d$7(K=E>`U2 ́ڸa\ٰ TqZ w`A_LJSBs)<,7ǚi+g&%P<>]aWJQ 0DTQO1uq(TԚzGip/}Y5{1K6}CH_H=%z>֕SR=z 0\ZElTn#&\)WcXڊkw4l;Ϳ^S\ 'ni"[pB#`FWk׾ _).^}p.3ƴ=>5/N~yGܹϑ?uqwzj״wAOO3gqx+zpu@|z7eǢ+ 5c8!qXo9 pz(tb(X.p٧@4\9b[/yPqse+nwTak4=E[V%*7}ji_>==^7{Q!? OB@$}> stream x]o6=( c#)J lC^_>(H,NRd~$Hd96 {`,r<=zwQFlR\d9G_Ɛ,츲#cEuo~|3:}$F2$._ǓL<أf<<ކ/  ;iҎ ;k(ïHɯ.\pΜ6PzX]N b-8Ky*-dž6U`0={=>@3- tqN<|vD?x;)O;&,(kk@P]7pfKlZ#| 1:෹xnִ{cI )NX[dmH,d㐯uU v lCx 1~[iBz3ٺ:q,\ rN;tOy+rK 9@&{ E&)_vg\>sn);*7^5, 'Dڟ9r;nEe;) tVakp"e -/{BoVd36XrT ߁GF#8+*>;ee#E*]vi{#J&5oziX_kRl_SC 10*Jfi=2 K@o=dYOb?-TPя}RC?MrW!_KѭP^KrlίKӰ\RB[aK\ng[> stream xYs5_a:}8SbJfRž8& 0N|%9}VvWgÓ,a78 DGۙ~"^ աW%l%:DkQ0Eɞ)^?6\M' G6`lg*qػ +ND,~ D!JbrȲD*ܨC4W|~9T'T`7Ak3ٳ v2x݅&ǭXcMsk0~$Qw^thOF''>B}Y7UP;t~;;s@Eh_Hy>'AT{Mzd51yWP"sX给q3QRNN߭>7-Ǒ}.4/ޓ#ϑD-BJԠ).97A _A?w(*?<\ܑ!<)-/m޽ 33 YIÔuoFȱyA,ilYXšBK\w2aŽa@0pp<> O6endstream endobj 112 0 obj << /BBox [ 0 0 432 432 ] /FormType 1 /PTEX.FileName (D:/tmp/s-fig1.pdf) /PTEX.InfoDict 42 0 R /PTEX.PageNumber 1 /Resources << /ExtGState << >> /Font << /F2 43 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 1798 /Filter /FlateDecode >> stream xZK7 W=Tkh (vPI $п_jHّwg%!_N/d1F_9}SV)4}oh;[j?ߩ}iM5pFGHAT_dԋ_zN >wo?spI{zFɪWz~>Mb6*mY=%-A:&cСf]͊?~VfuVO:O*:=MQ>*BvEI0ݱemG W\yΦ΃a,-}u{%kA`M!ML}m) N̜3N`;wfNJ&tO攨]hb$ACŐ=c!s $8 `ki1Y(|>Y9m0ު?ԧCyi\N6dmN\Ҧ-xyY҂ HB,M:!"] del{kqڂ:,#S66ym6vu})圁.e_h9KYzp.c:ؾ;N=^#̊`LVCz5b:=|]~8pwy8v7˞'``iZn8N t9endstream endobj 113 0 obj << /Filter /FlateDecode /Length 393 >> stream xmRMO0 WDC+HM"apCuh]n; !~;NՑ?`4MS(ÊL*3#RbΞÛk %nKJ/o7~y-9ukol#⍺UD& /`31usL2 rm^." =.O gx4Fm6 \@3blV@e .Ցct_+6iG8tlA+P:im/2*I;<'҉^cd,|ށVSy&RӧTZê]a:'%etpkf{sE^;ѕtqU0FdibרD(r?Eendstream endobj 114 0 obj << /BBox [ 0 0 432 432 ] /FormType 1 /PTEX.FileName (D:/tmp/s-fig2.pdf) /PTEX.InfoDict 47 0 R /PTEX.PageNumber 1 /Resources << /ExtGState << >> /Font << /F1 48 0 R /F2 49 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 4362 /Filter /FlateDecode >> stream x]=6W0 IIRgس83 ,f &WH==qe0[#U%'iá]ש*>w26*kv>缙?A}7թF ?fniשś^%Y=7DnAwB~ޮyQ;^Ou2^:0wqp3剕]au^Aμv`tgff[m<:}-VI]fMם"(;ߺ׃߲j~fcmw 4v̫q6'K9A^УW.\>~Q 5tr;abS0(oL=PA.R ^.Rn"Y{P>I2B_&B=fAfrz|FIwxܶ{#) p|Fve ]$עxk9QsH>lʽNd65Q!Wm7O+(ADn?UEmhMoVI|9_#-9_r}K GEyQ;2^_@Z}mz{1J{)gӳSr]ujsU)2ST{MQҮv~/O~;t"?^^lMԇ*hg0E9gxtF[s۠Q [V 䎁[{g,5q5GTkD.wm=0yxeQw43hߢܳ{ Zn>bk5= 驒>jQ6V\JYO8֚2< ]ϣ#n깃I kL 8c'b삆o}[GCy9Wɭ&)"|Y[1_4|lܳe8ϻ/(e손:Q@KJE4‘Pj i•GP[ppj>M-'_եNj`7'#'G: `-1s}C5l1(p 2N+К"8GF1R,NqƑm]*(#Ev(p:29 Z-( d[E軌e&sWdxx1>sA~]/Ba'wH }̗p"K &v42;# X.I=u-l]yԧ S6^F ?Nxhzpfx?dQ˭.utlo?_;FC:w6͠˯UetɧuzXdn~;S~÷Ø2d=صs;k37p#ɼӤFzQ}7[…|5O׍WDo #@zG7wnHmXtyr :}d{yU^$Nf!Fgeiq$M^}x\~\'LZYaѝs:~"_ھLGIyU43lOy>cED[Lھ|:Dtny"b[ kIyD&Bf-;G Uzm2mFRzţV8EE)G_k "rs=lEZ4Xerh͚Ŗ9_poDG9_hå !yFp1$YyFvRu;'Yc;cY7vjlAEQ:nujCLԉGfv51H>#JL&[H]-Cqu,$*ijb2}<ŏ!׸8_=_nuQb׸aesiz"Fos2bI2H;Z6毝P$Ywuݱbgv.em}Ѽ?̳*yx'!ZZBB̶Bk ; ;;urp %׽.Ғ%Bpn;ϲsY]š1z镰&5)67 I9v,Uh;=B‚ i/Ѹݸwn܍q7ݸwn܍q7ݸwn܍q7ݸwn܍q7ݸwn܍q7ݸwn܍q7ݸwn܍q7Eqg^>^snpv]7K{{Lendstream endobj 115 0 obj << /Filter /FlateDecode /Length 344 >> stream x]RKK1Ct3ym=ZЛxQe+m-*IfL2o|`/`UUp`A^#CҕhDL =dtx?МmuI=GϋӾvui+&085Z|fWZA|7* Dendstream endobj 116 0 obj << /BBox [ 0 0 432 432 ] /FormType 1 /PTEX.FileName (D:/tmp/s-fig3.pdf) /PTEX.InfoDict 54 0 R /PTEX.PageNumber 1 /Resources << /ExtGState << >> /Font << /F2 55 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 1035 /Filter /FlateDecode >> stream xXM7 ϯqEYQߺh ȡ]=%iA~%qٍ6zIGy^ Zߏ.?vAy{59A%`n>/?N[Vpy$Zyw7ߒ[47`&ڀM'.~>{oyC]RƗ ̓X#bR De8h+$б<+P`T<O d 6 ⅛gY;P Tv>2 NO. @?g퓜]>C&)k{z u*]zv;rj%.j]`3 A^UG Vnp[% iou0U 3S'H\k|;S ĤCAFCΛ#:(#FO2ϴ*o7LIO(??㢢%=IyT\Й{tqK.*zs ߒǑ[̄)TҌ ggCEq\䬐 $ik#T&'55gPbU@-3+(3zYE|n Џ6* ѫG cK'Wh/+UdTc968Xyphʃ:f!XyǢ4=Oo{GfB6"v2N4t=&|GGw6;ZOwto-O!*iSBf8[;.p[io8];vLD55}fxɹ{ѹ{Y<,jzKd=˭f&%Ln=~I,9z'ȿʩ;ꭞ5OM˞AY&meUIzRtX+ڐk=+ÃvE[뤭ؔӺДRSQȗq|[)A_f:[4a+j~r|9е9gBJO{pM{ΜT> stream x}Sm0 _@5I$8MKA eڎ58 ۱:cU> stream xڭے۶_f %+3;MMܙ֝zL]ͤ(H{$\}we,ӣۑiTzTyt515Tz a2Mt<[iỆM7՟^_*r#x4Ue1,u1=>7 qDfgz!M7dnud5wȬ$CI4M |u}Cnh I,͑:9&40CjI$%bkQt GVK #DͿfZ[!` Ɵl/:=B & o$aiGGe .vL0Ḧ́ʊo- aD͌Tggۃ Z^ b"6[m4 n k¡:e"J-މ\M@B7w68g QCidٙ 2y+i rAZ-ٗ1me7d(?Ok 2!p7(m7c!++7!?f,mdK0Ԭl]}' V9]&-8QC MwgW"hZ̅4iD]Hƭ1~]q˿6kŮh@"WM9vRŜEZk6֔r.U &aA,*l)h&J+GY2]MJq&qeg*;F k1D0ߊlo ā;k$6-LW[c$s`w85E]aOn'qŹXYĬO9$5hOQ\$(KBl,CrDžNhyu:Ͻ>=xClTvXN)wa3=-1jy2.(o|bqHiJV__+P&2+|%PjS$4FMyE20J,9`zSpf3Ѳ <ıupk_uQٽM`&x?! ] Bp 4(A^X~°vFpʈ\3&^o6(̋\7,C|UehꪤL:WtUXF&JgdKd'*%3z)5vn͊ R0 ]">*ݡpoCZ>IW[M7ONଫI/\QqGcb2Frs0ԁ1݂s51Yߚjfwôznf@/V U$ .4Q3Yþ/K5'jz/ 9gڗnSlw >9ǘbЮQ&,[(kt[w~ S~Dg!eN^`Lw1"W&̾bdfWξ*Ke$ClR'0!cӓ|?(#|^n>buїmc4#sw1V ս6a-ӭkC,9o1c*]gNme'3.P}RQ/n{QΪ8ș=p qMaxZeQ+fg^B?Jr}WB0HZPPWWӖh9ֽ΋(-lKt>2չ $37-`Nr|kW<Vt0_So> 5#|:p; S#U$T_B[TZOyd,J^ ^dHlS a|tXKL,Q?Z+?Sp/M X&e|_e,Sk!tK/g bo>QN'< Hؐ ⽯ӳq)YAS*l'i|ng jc?ş%xsj/P~ |-R\xWt3_ftխyEYAh1k2,炯E3Y}0WoN̝5!3\Æyg *I(/5;ó=`{7"; &bq`|㒟/Mג\^[9 qih힃'!<㚉Gb}M}L=V)}lZߵs[?v'OK@xgǾ֪H5;-4^fd%Ms$OL?A ]녠)7]+&yIy DGp9*4++}5.L#lIAV vNW귕8*lo9yVw.,$˝d~X-ܜlrC+x5{vqF{N+6=Pi bZ8*@8Ө58dvS)4uN9m%JHΔou}<OEaa',Sg6r{R8SB$\_R؇ tfXaKss*N_:Բ}rFǠrFP֭d}tw0d90A{bA> stream xXo0@PlеٴC'm6II:i`C,~~x'< VdG+VȊשׂ oiѲRcﷴ2\,ۄ krO[_iYriI&Sܙě|%߉ vL Z)MusBZ/'SE0<eO X;с}hNhu) .G."pq1Siv"?p_n;\*vDxux޻c/4~DA#=eDG{\{kҞ^^؏B큗6<:%D"jދ&lxxl*YvP 10@]Zj3QfWp\ #Z .xQOsHשx yk"t}#`qj\$] (tʥ3[jGP "p5IEx{.vWwAqn2:&t,|n[J`~9^B 8%P_JB*@~jWRO C']a&@:O%a_Y 75+wƛD0-/Гa m)SE>I%JPz^r=sGʝ2y)8TzVg[7f˥f,qmu~oˉV_'E's$̻V"Gj0S2b΢&Y\9I17 ZO> stream xXKs6Wh<=P|&dhH$#YqN{r)QH,}/|Y27x0?tS$^?wWCrhKh4Z-so7o02͢ ڇ(W6rΛ-z'Ñe[oxB mv%0U<RĹ0Zx4z܅ٶLvl2Z Z=0aа5WBnfa}eS.s5~.gvƃfsVqc/f"k2 d)3c|rCc / weoʾ0osUj ^yYPqka9B8UYs.W֌Cٵ_/1J Pzb4@D0)0}΅G(J um{KA}AXɜs?K J-P7ap<@ǝtV\"I?#Yϓ-ߝiug,m`̲꺤Rra>ky@+i:w߅F9ߤʺ+ ռsAۚgdyo2tc@?+lHmf={c^O8p5 w4>z9~/1Pjendstream endobj 121 0 obj << /Filter /FlateDecode /Length 1238 >> stream xYMo6WFvk+"%RRaM?. 'ٸNP@{IQZ,k#= $K ~=?J se0 O,Aɐ<__MfIx;aeOʞD.VvW.ǯ%2|D0\Kߛߨ3su|hs<^:@}Iޫ'~maJwWO=0v3dǼF-4Ž]ձ=fʕ2A/E3652[6"~G@3{{ob )[-A]Zw yEF_qw[%!d(ӊnP# ŷte,+_ZIVYvς l!MFu#*jCVUCSA-ժ[yB V&:~^~) Q"kB-[wZ6=F0G9(qQR;Q͒ZDbÌ-6iS]z NB-ã2Tf099aFD(%s!(#G4:ʢ$/kr֩32r_lH]SG60ߪMa6͌VxH2fI *< Si.5 rF~gwϑ&ܜ"X5/ɠ0{C1"IܜTp^ S H-Zrr3rRő lp={ѣTW_C|5VkjM2u|HRF YT2,."D@ڸ:ԡ#IN'W-}E ܇='E+ oV'B݃П}Cs^/N$粨&]opT&eI0ye)@?gog>Iendstream endobj 122 0 obj << /Filter /FlateDecode /Length 976 >> stream xڽZKo0 W!Ŗ6 XKðX=nO)IL-˲-}BVVV1U `25+t*`7%[C.]N:鄭7B,yזkVN$~&YV[~zAʵ_ou`;׷7E]l*+Yq;8k'olOP=oJ%ADNڡe#PĪCۏ@C@&"2CI-ˀC&NYVD{Qh8Il l1M$\m 5'*;D p+|Fwupn""h6>ӹ`y'la`;BJ@Zf7uo(pn###d Z (Jd ehK N]*PBW.w48yJ_dd4u1H=Etzb~-'Z5KNm9镋|~Vav6ԉ>!jUd]"~,-x0ݘ|faP;qrD9qb⑴3Rs *g?I^k}@mB@ ¥Cf&8E9bgA@$7*qg3g2YP'C=ި0^Yxx?;q6o;\+׼w?oڮϚ;NC709upgk |@JVCK|C l?>Ǿ*cVƘn:hkjvlendstream endobj 123 0 obj << /BBox [ 0 0 432 432 ] /FormType 1 /PTEX.FileName (D:/tmp/s-043.pdf) /PTEX.InfoDict 70 0 R /PTEX.PageNumber 1 /Resources << /ExtGState << >> /Font << /F2 71 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 1789 /Filter /FlateDecode >> stream xZK7 W19DcAA99hPe=yLI~};Yc}:90||052C?=eB4Cj<5Xܼxp ~ۯ?w?umws]Lݡ CgiLRiA*J RX K&'Ƚ5HО8M->+yuU~u&Gsu6ϳ]o !\W3Ώ}2Rgb*0٩`zr* V-{0Jt0csoljgWnl!0 3΍zc`M؟켮dR;}(ٙx'µ"h Dʁ`7IU]dVwe;B.C)#4[]·u֞N`U5}]~SN83a69i/UqJtjʏzw<|" .v线Hzs)lPq0rC'P0*gOVT9C$A U3IAH̱\˕α\˕б2:Vh(h %u!N4ɁpoyISM^MaY4YNY rNg)3su0ZuHiqHCjX'c{Yy}=m%Eb|>iyqoۧ'{>//!.Ov8Jrmr6r.a#v 9ΐU^0OݶD*$Xfឣ8*$Q{fN̅A6 QPtې 1>z ֲ^,tOY/`C|{ъE:2;E2qEl7$G '$)%EC$k<M ɔR4$W&Kѐl). G)_ZPs3Šcz[jwb tA mZbUM7pvʲGfli|3T[®W>nI% 0X؈_UX%lZTö$O1{*6iEqtkVa*nr:T9C3Ǭ :UqQxj0n4 3U ƪ(MwP n6rZ^6rHmwðnf0\}9ă!/+#i5yP7o6!{3A}I9qDz*}C!f88H=fQ>ԩwkC Aua̞4b|ݦټhmqh6/LHnl^pSj0zgH3OǸ)9c`.]57]Fm`hUca"bחW]/]fGs:Ck~u`1s~LӍkUc=OQk4J4AR(%JDCXh( QDٴdK Er\/Er" x.n=Vдؾ&9uK򡹰a-E-ōZ6ޠpO{ZbU-['K=޼xOOz/wu9 yN% ~|ӧa߿ڿzӛvʗr`,l¹n`7Vs6}vɈendstream endobj 124 0 obj << /Filter /FlateDecode /Length 435 >> stream xڍTKO@WlPt/H4|rh5vJ@i7̴FV{LrE/ ;`8&lب7@Ĉ9"ApDȮ7æc}E7a6 QCw'ܵG\Ο)oiB&.F dNrG{M/ ώF(bY>^&˗Ԩ SGoJ8,_WMcqn(톒*@JlyH=5)L +v\jΌ&i11gģ:N}Wg;ИRlp^\7iZ5 qKE͌d/0B≂YPՏ,@uPx=*о)6H1)!_pϥ d!g endstream endobj 125 0 obj << /Filter /FlateDecode /Length 99 >> stream x5;@@E@yW!^jBBJu&WJ0ȨcFg k7BzUmx1mA )9hu_T #endstream endobj 126 0 obj << /Filter /FlateDecode /Length1 1919 /Length2 14029 /Length3 0 /Length 15217 >> stream xڍP %@qwwnw݊;)Vhqww/R\{={v7sd&y~gBE$f` vwebcfH(백XY9YYّ4ґ@.`{IH8o4I뛠=@`ggeW t $* G/g뛟>hl||<@`3=@ j{h;A^cVՑÃhl)LZ@. gw9@;_1#Q4.a;XzA7- dfory)>8#F_1m/? T99 -AZӕ7ChtmoHo3ՅlG,y+$ {\{{" i9hڃ@rɼY\\<ܼif /GПL?o98:8,-@o?H>.@w o"$669` #c ~36~l?>?M?EVVSQUᯔf;x|L\66nNۃO Wt(goOoo"M_kC_o 3\fo_lOIɧhKm\vCmC6? -`kyr `i'\jf!oތۂA*.?vOmץw3 o ?glxK`GG,x, >߈"(FЛݿzȟ_ |3k/ '_->[o~oKb/o&v~mYCeVmǷwWlo; 7zc݇oO,VΠ{W)_@7s1A13ss~KC6{d4`&by_'F7.4CN >sXP2ًI[|x{jǓq^$RD& }'_ 6ny<'7^4{~ƁѰ=ZnihY|9 8W&Rz Oٛ܉d H~1>zskU.= HoF}S|J7rx"C)UCʙze9jM(i|Bd,j(ʌI/: _{iv&۽~~cN(¦X@S.+SRri*\rd m[jgߏɋ2dtt;jH$q_Τ++GR e;8lA 9;M(IGsSr쮟"+gX?AjQ1Ȇ33'HD>;jI&e gV9m9\ɴ3C<|X*NV[yx=5St.Nj/?B)Ag=)/z * YwR OěS'Z3uN S3MH Kd_AnNZrbD|NxuciV>JQwOC_H|+ Y9(Xx ).0eŖyE)*s ]OS<"lQŵwBߑ@7͎Gķլ$"Wp-Q E=jHw`RJ8U۵^b. .IB:=a7+,]֏&Ol`x@78Lg=B6aIoI9BnAa?7OE$IJRߏ2)-U+*ǖMW6=u9AU" ܧ}Pq>7g?UwK: i L UB>mqڳv^\2,&gҔDKRSZԉf- -{o UOT )י6& , P)6XCq6h&FG duoG^qͨziqȗ\9{OnqaՌ'a*d S2}s >DӄنꪷcL˕T1tX.z L>/Q;Nڮbeυn-<|eq}4mGJ(]g.+ mSOsQiUÇs_1kqr)~7#} L.eP]Gǡ^M%.վ't2XS|dXRAU<,zY*T ="&Qhq=>3q茋 >bt`1Mۦ;C0\nG8C /TN*ɃW\nͲ%=ga|yKb-Ia@"|&5qQXԊsCUyM4MQEqq3W"?D=@Y5c?u0}W&T1*m9g qdzy/˒8c!0t~*/!%1_%h+qE!BKEH*G?AsVΚϕ1Ƅ=цJ#>NT2;jaDQd? JN;bce3X Ec K/qʯU|aNEދOsr)Yɦ]fTF4 ǻ`{H]:n^AVED(BiKD\4]q/n-)TAnfȸ0S/ -C>hR\.B; pg*@̣$yehҾ(xeƒsc!ǜL_ޒ4eMQcz @uk>*d?d411CR&.& bDU`!+iyڎ5N`T>j׼,ōB>Ǟ5M;3%"34?M~BA2<92^<Vη_{"% t @;T(¿K6Z[^C 3~f&~ZM.̥LߎcH qI=^U~A]^=feS /s8PiHoN?Xѡss|ۓw2]uE(Ś ϧ1@NRmPj }$3fYT&S8Ynv_V@)YRLz4pahaTEAO\GyD[eshLmkǕ#1V[le!pq$Y~(YF^/1Fy|i7?* =˄lDǡW^ET|Iln8 _O\u^-*Xf\9g sZgS@(_7%lMQy+򤱗0\ |d̮Te8ikEE|nM7F紵xľEAQ?:PĔHE9GHOۋW5urGJ\okNAxhڬvO@G<s!٤Q*,^r>hʑwqj _4*I54 isZWz(~G1+ TR8{ɼ.f=ԊRZ|vb7 Ln_>-r#!C*4n+4yK l< `8PRŏNSZ({ ɶ>,f4X?4`? \i)Nt8%cְ**ww6U`KdI>/[:Vq_ W=utSB9D!ܮbm!ɛm1G H;tnPRծl~٧ޤxunj}?"x56Zًe ߻EPȈå.JOPEm6GK@0˼ [w%#^Q//Ua %υHyL[dyT㒐3DȕmǔQms.yƩC֓{d+5/+"Smn\׽@4P_fQ jt-K&c p=6ȖRGb "}0 Nai0 tqcf=Xkejm c'6W8~K+͂iuM#8k\bQN8ǐ$]Z)U.3_X#6籆~9f֙nu:sύծw <%&:=ӣ͟'VE0x^j6LSdEprؒ_qtIȹ%!.Tx9b\^EHk>ۥ<$#rMt "ʎnrki=BEtL}ŔtbLE}ϡr:ς=QEE,]B7PRލu eHY_;uX%^AB)&"ȁM[2*'wu?P(ty.J_;V!fםDg27i)kƏ.Z9 vWzz96p~Ol.M[;yY4K;.T[DkÕςt>&:GШ=@bj,}Rl8bGZwuw&h:Cm)X[>ՇrˡXe2ٟ{"?+#1k,MȱScL˛o饥87 f퓥ljV𥩬~5dK,d ZNK4t\=aUPCw99/P8|4糫 ?b2WAA h8>ҐFZ`UF}!oLGY.0n:@lS9L &-y'GµdQ׃ dm/Qo)b0]qg/Pm,MahErʛ雙&{gty+Z<®h>='}, qq'bj4tu1T$(p=缄E4o!d__7zhaO8Of8d0,$΁!S[/ɞЋn$,ɡzD`gDLz9]>y饭wH$CgKĥ1&2j/:Z2)Cq ]:a=SugeK,XlLkSڋh@\ˬRf_S,w+P;6eX f{$.Wm{~s[ ޗ@ZDo.,Pwc)2c# h1&"YjCU}G%$8(;D \sXw6b$m/a5ҨN nzg-GWh2U2p%P[Vo3hxM+,Z.*\2\xG٦97RQ?1M~~jh$j'?8Eﲹ^* =o]yw*,×wRhGطFR~{k@VlxDvun{cVϨ~x-PۇD}>O, {ǿ,o 5  ?!K9+3c2Ѡ8'7Q^XOL‰Xc`XoN;t?K'H{m.&d Շ1cf DR"8lu{d>$j@}Y[x5d1t& izxK`Z{3VNu4!S/OlO)ڍEs9:p+9 {AF瓻αAzh0xv|ߗI]*NP{iF|q>g^> 3+xQ“lkNjsS|bV{#HJ](,5㕨2 IRl_li3"i2n#Qvb>l>oa&M/{ ,$%XTn$0S`=na9<`L/>-0}މnVNקfZ I쑙uSLi'gGd˜a&uJ/Pc{#]KH;nY_Q;JӐ Stb˛֜z1,~,$eT҇)ݕ,q=vŷ5c0avg.ڛ":bvK?}{2X05W@.O y,J& f}|ytn2n1a(|DrRihRc%ԟg'4+ G$w9׬4xz.R%j^;5s qi%DXΫJt_y]nޗՖ?Լ|^篠&geƑlMH`_cH;PD?Hn?o4LJ"YIl-##B.lkSM<S_u~t|֤S2;|kjV$@k"bm1@%$f;Usk/B}"wXcGڱrf&y3@ɊO$QR[YDZHzjI~7i ';51ka,m#(ArGվ6ȤGCs^Ik7mű²8O3O>ro:ȶ dKOoj_"Q#Kύ%>QpFJD[AwPTҽBv),I.Fre3ŕP 힋!9{'WYjp^$KFlj,7#mF~0g<~̱qk-E|۫rYy-#mҞxb1ei ;)L͎M`Voy G RӒȐhU@{;p >LoAskeK9OI2GY*|'wOC̀ΧRד3MAi{6mI_{P (3h2eގlEf!|ev)WzӖ| HĐk-_Eϯ˜d̿@j-:|4 tɾw o?Y\ d#Bۏ0FPGTFpxM> naU q-ɐCPde}Gvx_bؾ͌Uz %ĵԘV`MxTx}#W JA:jV_aL.O۹F \L?4mֳnSrZ/kq6*uBLup Vu׼~ qy+hΝ)"n'9@mQ`yF5(*HLg9*t.]q[K\EPYl!nԅ=Af q4Y1| 41FZRdBZ;nV ẖGu6_[y2YYvLg"ٍo60U.dhd6zi=$r>Q^̅0}p$VnݓS_N"fM n2!6$oج3b QCvp)B1=%P]ݬic/aIZ=*;Z\siV5Z`QUޢDuBQ`8ܒ/c_&u2Y~zKE]pfr]dɢaY;cqtdf8( 1:}靫2EŒB/iW_s$cy+3rGX}#T=Qiepix|Vͦ^Y.;&ԓ:wz2dzx.R;VD$8$ܜR:]4"XꜦ72P'v/JaG 6@e8˵0 1I)JĖ S{aA! LQ`3!Te^՚P`ʮ.H[#kd>kZ֘:Xrjuy$VirQLp4q4 ߞqeRtv6E:l;AG\ƎZUG26f KB*F-NluR /W sF hoE $(ЈEVFP\#?kME yMkKր.B HGϺ(N eV&V twB Ћgo2h׫ˬa~G0"e47a5,j3"vv#Ws!kp5 1yrfSLŗwB~Txۘpk*ݎ`*nJ )'DknZwismZˣ1ቁH*gY$p"W-ҿDU'o Q kRT/yL2!%VM*+4.|Ŝ#YK* _cfk* ZY˗k!ybP718y-oӄ)frec׳@6Է̎ װy 4 :z<`v1U;˭j4 cyz 8?((gxy>AT}ARQ@3Fpr~n?]R$|d^BOKl j<$?_k(=yMwۑ3^j.xXJ J@P2nWWc4>z…7_͊%>E+F#Zo@[Nu2 9vE2; 0]뤚5)&}S|9\P rЍ[t)W~MAp|zg`==uLl|j]9 ^lT5Pΐ@L O!?kjXU RuKQb>nΜA@myUr\xv:e.E>[ȅ/O?k4{mK a4| a~hFTyjZRc)/pʬg@^lŜdqH< 37f U0gd]VJ7JO)px#҃ eQ (v㱲EҫJf|!pkWٿQE)s=9e~O);0]!@)nr~r\'{JOŇw.$b,|mnSgTTtdDZq!TBFckˉ>[ݜ-l!k,s+&vf;v;K!w4ZvijgEeOU«NdШ@ З̆WAhj{HYB-]հTm)zp%4-jWӢ\8p)n!Y`g{YTO t`OьTy {݌L UlGNeJg=咊Imzmz{:O+UGACKX^ lu"#>W#== bq5(?N`iMTm\9LG~?%Ǻi9 "&HöشВ^/݌VH3{Y껕FGYDId p*iS:W[D;K(5pcJбc=҉U60ko33{j5BNݽ̙:G䫨͋6'{fcwMƲ> uV6ZDz$r+]oiB7ޏgͼ5KJ'L1LO pSC^.s9e}Ճ+=Ͻ`$6.$9cB-endstream endobj 127 0 obj << /Filter /FlateDecode /Length1 2009 /Length2 13195 /Length3 0 /Length 14421 >> stream xڍP- Π  0 BpwBp Nx'+`V޽zw)ȔEM@Rv.L,|q1mV6 ; ":;"&lo/j6Vv++7 ?D{'> lP`ہ<.#Ɣg8@6. M65{S0RX8133m,h`K*2!- n vˡfot^ 6`Sk z:@MF,wsL;D`?@;Ol(I3x0vf6@7 hJt @JT|U>gS'33ym-$N ׾{2}vvA`;3?d:0k؁]A2s^Mm ' 7/yZ2qO'W W _93 pqrz`6u,vAw{X^Ǐ? ^'7+fVSђ[?N11{7#'; dw:Z࿫cQGߓAEyh~> '/%3oHO?_h :Ϯ.`!vKb6fqn?m;K=@f`S˿?lRwYYXs֯])igjoqrNN@ODcx.03ٻ^Q.NY70F<f7;Y7z")Fq o`Vx: ,5o47fAV3_v0~9pۻ:+b/*/ZͿk)!k)v9^rLـ]~[YI_u%/;t~}j~_3.N5wވk#~CW]+ W`SWWm.>17 2E\7 i%tgJe^rp}@K ZsME_ْY&}>l oMTi{y2JPiC\|(ZQ]dG3K*ѕU9νOڣ[Ѱ*.9iETy&Ysx.tgh739/ G1޺ls^?ٜ)u񈡮1FeqɆE1'6o@:rԐu- Ll4 /Eۚ 3U٤iӉ[]4jTҹ]1,or I50l~~"~~7^w_EL\z(ǝo}'&u'!(ìd9Z/B%1SoFkdP_*f / ދ Y_pTq Y4+MŦ[A=FQW}:%f!#?#g8A/C'*/;ͨF ~Kc^\h,:_A9xϕop #RثGx!YڴaǯwnPf(r&iV lƣNq|xu+:b,(#Gb )TK}.YMLjLہHl'р;Ƿ~, ޯҰlRC-ƪ-4/nt#Ql8l ]{m:x~<©&ꛐnDϦ.~<,-HBj*80=7AKn#m~0ŻT8^=\3yUmR6NL3dm jIٛز&tY<,dʌ%QB>F!"!fEq(64c|́ 2Ďߘ/Ufm@#݆D[RŻ==nj"xyqW"[ҝ SuB-S)*A"rtZo%#\e;> \ŝX'F y(:l9C}jXR*̙9-"X?׷E'%nj %UDKLu-ܽELW+|3Fє! |ER*X+b?7zKf@ݠ>#þg;tj7`iM.w`$mm c w:!WyqA1'A20H^EǾ r3HP'{ma?x<}r݌iIz$ˆv(  ?fIතϨD&4%S>yJ+ԿU}x>d~%]dD䆭3QO#VhHTgגV@C] D7# ЅY #ps˿YEΛvIp "TKL͞tᰔDa(1)p!ꒋA'UY2Af:}xLK+(gĆ2ps@8[_XzppኬZAGzUީ O]5ݮX6f ?JLqea` Bw?kE*E+`ӵT+€OO/ͥf F?٣rWP6\ ;p3`W?29q|>?Qx(NƙXr<q5V#q]XhT%< BO|E qmi-o:$޻8nAC7qӹr3VV:$eSGT[z;W;*5*צc/;Ă-?\|$Z`ظ ')L>k u-\6.^1Nx c”UYG-M,ՐUNr="I PeV\SHK9 3_A_M2w>3wO=*U@]2X#. (^n,U)ydx|3ʵx+.ۗ8=E#x7!/қnMAj|| !;Mތ2#?tnS+VcͬwnP>tQ'1欉WC> Ub#+J6]OP*, ?D[iôi;C=+8,HVe?љgAjF&L AffN> z]F FlQ b>># % F73'IwխP+llQ8 vҎ 3!Ȱ@?8\d,kR40=޲Z;Z' &}`貶TxwZ-jUs.ltߛx6Ky;rN<旡1=]F۹~\YْΙφϳ) _n֌2o}۞yX8*)`r(|rmxy+FIAݰG^hv}wꞁ\!u𵞍%WnWL|BS8]h#o3Dr/W qZބ!<\^$Hz2j!m8Zn{ "|ZïUFlӢ A҈i0vMӨЭ3=xCQsFvZ-n>1Х Ys>5B0p5:_w{ {q~9-EШ$^h*Z1c68m{-={mJc)_Oe{RnGZH]6'T0zǡV\~H+?ZۈמzP"kԚTbR@Ošu8.Y&R~QϠ.fXL{E ΁tHք5݉ ԜHXVzL njAb|#џg^=Djpk}ʣ1q@˷5Za:C*Ec.IEۖmۗ}9HeaWhS"*ef 7~[Nu?ɪ8ڞs>+7t)cHE=2bm86t:9~0jW;X6 i9,jq;jc x+CQTBuڒ6KQMV'avߧ D$~rP,0qA8~4B~_ Wz6 _a:i;µ9-苵%T10n+n{\u܁op~]6(^=Xo*qw`-ux'uy[s}N}}鮢G%1߱eCt֎aJN\XUJ^7N1%K=РY7\EYӽw L7ʃ);&[Tavdt[yXX!/,% H|Hfjpge\J ēgRq_IsѦC=X n=#]z{|Z%e C>xרP3f0Ck7ڗӚ-; ɏV ˿aLN{ol*6L ºamrBows:a21Lۜ&1F~d0 ԧRBM#q<))QOt, ,ѷo+D7y76&'!q8Crb$u i ()AE@`;j5m/M:]E;XƍfReMb)Mn!/";`C]GGjcH<,T.e Z=ѝ]+:j릹N], Ϥ#cbqI[^n~v=7{ɝk3eྣ-3u|F632εpO&B2j<ݭ"ʄW/ݣ4(pc]'T)u݉H)q(x6nj*fAĪJg=[ "4&!-gT˕= q'^= :?ckDB-5ˑOE;Lz p-iG_}2cڬ[ G -: y.jKf7 ׿ⲏI=]o!偐CD5/ EFiMVQZO8~7e+ZAII&%!kRJ%o/ZNb[sF oә`WPtUFS>&C;xǰuO򄊼u~`BXM= b̋oe.f]4ʈGꦫ'P\g2YKPoE/H Cδ_p |?~PR+g5q%\?m*N{>J\qRȭ:'0o9iI8iIsUz™aisIRpO1:ᠣ'pۡ&^.a&mb3AIA~/p7l? &{ bM'L\ogu9u3@dV;7]IV/.73t:͉c3f+.vfC-z!{# 1RՇ+ HghThH4ZytC=怱_8Ф}̻ߵqm"+}ah>5&]|3-PUT02(b͟6ƣh:X|5ϥ~.?( 80.0x%.w{oz01sFJ3Ez^J[A)X4$Hu`%0(R;*Y!JB:KjYu =7B6lP}l*{15͹Sp YV7oRQw1;~ 5iw-RSg*=x7TcS5;|h&L1ս}FCM.ޛ+]߿y\~E+"ͅZo^@BOQBu*JLҞ%a8+'JG%rWn~qBhZ ػQ<@UPNzE(CkS5`ɺ6+|7N [}z|jԂ fΗy=|&FJ+Ncղ " B$cQ$>[ػnfm,$.vDrӔ״YQll~ q#Mؽ.u#uݥ%"HYl/:Ea8K>t5:x|%6!=0 ֵHYLfZr݁l,QNx7K$e )*YA|^?;ĭT>ې.aT 3S>MU,r&HMFK xh7fW|!UΙ`>9R\ OįMN z;mƏ7Nپx78#Hvf?UC#c 5O1*kQ_ Tn\&~}x o5dK!\AV R/_wyes$c7eQn iwb:}cG8S2X*V e'v()Z]{jDml3}ݶ[XB|Sf@vk^&-b;m oKۍFՎdHL86R)k)-tm[ؒ x g҇e"xck.XFvŧ޷Էo&#{IbR%6Ł@Z9''EMjZ[\޸$WҤoW8 hW|<0煑.kZ@a9mza$^V9x;hA-ہTհ9%iiCܨft_aO_]H3_>cF}+fV)Ŷn˰ϭ;]ެa"zi:r,#؞eG@܍ץ }mCy4"-pbbZ$^WlcԽ)v7VVZW"QCr[GyazDEx(9DbBHEž\di>$k-oQqQ#,'Ͷt30*~%S@vTf#5E%l 4LKFEף{Ĺ$feQw%M})ذg62nJC(X4t>&. 4G6~HlCeOZ}Og3`zǝ"SYqw7ѵ/2 HUcH%*aPیC)ΚL bXmB_PR/U{rٔ$4r{?hF6q5q>Sѳߔ V}A R&ۭJv5|}fP<tIҼ!QH1޳e5kٙU{dϻ#{nn2v%d)FWB^V׷d݆JG6@ {c[Rhx|H$B\ -=M`b;GC \>N(q]Yпmw"6ߊC\0:0+ ~ /HwBPu0bQmO=U7߻qzgQwJGb~Ib!>70 Z.j{%4.|"퓏z.$Ѝe f׶ qt@)Δ~je~k0(]}Jµ >N[ 15`O@^l9 '(,N署[- +hۖY!tL=Et. s#V^jf[[kқF}Bj@4X Vxo 1/Q_΍3Fed"yS7/n:*zV-%+KkHЛ<3'"bd1>iildȶYE9F+eKd1\FbU^lc$- *7RHѱlz9E5PnQjpF654s|[[ 燏4r, H ٘TsS'$,W Gy5 lD ލVb6䛷x Yiгלt>b8_Dc|zf n YҵY%6EY.(ڢUV(Aޘ:Z(FXw㱑6A?M;5x݂H6*mX8( <'wN^eOs5cJ͓gDi48žfF!SL7SI2B_`͞|hb Vpsk6e=z+̱/Ӻ++Nb4~'?Q۱LXs(fL <{,HeHڅ2ao/[”xp)Gԙh6m ɥui&7 'tqH'nJVC.㲰dG O7&tϣ/rU/iMlu>/¦ѫkCvhu=U;6Kbm>,qp7ƚR6"vCFFrMkrD<.(cgP5(L}k j| lt3u `w7h]҄kެL&bBiA8#ڢ5^kggUVB%=k7msg54%:{2lu͜jp$Fu;jʷ̠gkf_9B{z27"'S0hkt? _`Ac"U]YPY=[j=hZ~3:VQۈ>l*o(/ $u\B1HY=zx"$|v:7ml0a 3YJ<> ͩ#HFttWaaO#k:lh [߄I~BP&Hu.QY';BY[34CVsHAόjFkt 'JePSpyfgI59sPj̱揹T7f cbi??FMCkZgUY/,! L3^d T+Ǣc җ,T#L0:t;j:;T>BPtg'' T,߅NpᅪL/:į=;>NJ~+!||l1)Ks\F\[Nnu+%=z|UlK,r`?gZc h/;)aT }H 5 ]͝@%.t}p0`2#S&jRq .NGȦx_QrvsWI9UҼ)ŷwzyɬj!>X~/r%쁣c7P0SX$4/ MUuY49><OV^/ü }w~,y_ u-o -R92/;Ք7tAKQI5e6fʟc%k7hD4+e<ܧ3+empl3M0&}3y!7:Ö˟ @Rpr_0 N>ǣc[{E n8u"Ow3xϵ|͚9WÌnGuBˡ@zҋ12[W_fV̏}/r^=v/$Ë"o.!+zex'}6%J:HB_e#IVRN;t7Jm*zLXVp +^:OmQ@ n,I8םJ@f{=er;s*w̰Uޖ΃)vky+4w;=0)9s/_| X"p, 4lx Grr5|gV1P[i#H t0 *(tϯQJ\W^W Mq"qc>ՏuP0Ԏ>GRiCݧw9~t落]5T 61ݰq|(O,`ZS[ʕ}@ǔ0؈CcZiWE1-s~,\f _wq Ti#UNR^g*!TachZ}Y6@dE dmQ_/!zsnW6EDXu޳͉j5 C%!۔Ml8eƳiW r$9(Zy> -@&D.Vxm9. )139L}x1(69ӽpTHB!"Ƅ=?R ]qnqV'h9C56a9dܩ[ȴcۈ]v~dmҜ5s }l_y> stream xڍT6JJH k;0`6ؤAFIiQ.)Ax篞9{u`a5@0/H@ ? !Nb qGB0E(C(MBjag.>88P;/@ Xow# G-OLLt+j (G+-`BPU]B`W$/A E9!H2@ / aGy!j !)`vw;@M 3p||+w!(d-yCa{ ɋBq0߁`$C]6?(hCںC($/#w`v pWW $}>E;=wo_ {|FPov@#DM?6 @/[GNf4_GӀC!/_$@?߈`El P?1ݡ^3Z~|?Oha. ㊁FOS^ | AQ3aC:ݿ*-~@o&Iw m8Zo٢?o)]=3?`W_hA?CC ^@h-zP`B i"^;](O1}.PD~@wrAO^DCЫP~$0&@K|嵃xyGSh{;FO$*D@(:<pǂ_PtDvK>W5t9 ڍYgiR$ /- V"ĩ.FƓgcT ܔgէ4i`5Q<˧lԥ-vw[Ayˁ&nt- [&)}tQ2v},D~lu=_=YKEC۵;kJ4)hŌVQ-6BTlע_jg0iHv^$xV/ Γҽ Rx9 E$1H(xx>b R_2]%:C] FnG$h= :<|{^fלp3qO:Tb*zxtgjfc!Z R7{,1al5)$J\Y;.&fioBZMI{@Ӫ -zr#x):V!Y(|}y`^rWb9 /iw$6.`) m}Tu7ℾ3D;8c?C$(rz3Mh)}(a< ɕOѺN*F }1#KC= rWr-QS4ﵗH~=pyt%ӊnΖ,2ucLswOlXANI?L1D CYq"nx&wg,+>A-rU D/%>,6;)f{92&!p p8TJwm tkbdўIcxUKzj; : #xEtt>Qwh|6d(a'_`XD4+$νvAVûդ>zSK}`~ ˖Q bPx&Nbߺ.X2[mP:5?H3"{D{)Gyưc7l{^K]ֈn!l7˗gK2Ads y_S+!-:wTW> GmΙ2B/I7'8jD L)I% N:+,^e.JO*K\KQ ׈v|)#I#Zz*! ;{Ћ=\jC܃ HAOaM0UjnoZK>!UIKwac.s(-M`]`SqfA'*|緶j5XVZL/Qv eڻaPʩѭG6ՎT5fk̏S!JN8|/F k5'M4|'R5:mKU uΨou6|ȻA܃ie~#{ƒJOۮ3>#@@һ`fۊK1Agő4h BuVhŠl x񀗦.Ȧ}oQ߳6S^fBc&J{fcW/yj菔Jy*Nltlr!Yd./#F}+OqYB39Ld"H8NhMd]*f!_wC֒ӟ\r|զA_ hU(ǶiT7)7>uZ 2;0KB\DkQW9ٓoYvLT %ԇoT<Lϭ]h&[:^tbRb<x{cRQJ\Άn43˩2۳-YVM4t @n=iv '0RUع{0tA$P\ B!kұ*$_Wt]M w9DS=WKHv3'1Y,AY5crPtax93^+miwМa^r/;ՙ-P|QsY%幗-o|.YXӨ}5erG_k.I _]m\G6)Dq+T]dOawmz>n푰nGβ0t6}䌛<:(@>kNt>2rNrظqRt͋aagHīHЎk7Q-#*JӬ[2CdU4kbQipsYDa>pȧ3#0G6CՅ._I{^n=EPtq~&Y"@#RJխIEt9ݑi/_dmlZAZ#mrg{oeɭ@Ԝ5刮".Q*6wN싇Fdn 'kG 8L]QoOnH0bdr/覚7xK4Uu2.] u7Egnj;<(/Gxɰk+DmʼnW_mg [b ڑG V(EA:&咋t{ e C~eaB*~UegIADjԼY;`ztǾ()QT;|4q$oZkpSIm0i?;)oš'XKr C,Jv~tmMVnOxr2&Ck[)[M Lzf^3N'F+܂q91grF}8N}SbYш~|4,'%XX5El?}ۖ c墏VsJ❞C9J==Rj'/|H2:XL؎s,yתJ; Ĵm xB^to-AP6EBÍ_=~K$ddž@7 r6; W.,.>Ǡ p[yᦌɳd y~Ǫ4IF2)ׅm?*VUH%`4g2oixGadRjJY ?ĉG'uoJ\$g!X˥ࢗsQbwkXKkxoҢZS(AҎmW 4E'jAC~cS;:Kn(\)>_XmI&_sVOmP6'\$~Wn{鵰^ܚLLȷ ExZcoŤٮ&o'DoS<9HԬ*{`ëm`eN:ٝBM<""L>:i:P:ד<@ީI(y[llp֟_":2F_e6}zxfB3#e!΍O_gbZV1O m.޾—|Q@p/P^s1q9zdaQMw%M:SaO&1vq!6IO f-0JùѵK];Ro8YG EE=N\rI~/𰉡㭣UwyN16R~hnDiȥ#RҸbo25'+eT$}BEvXJX{_|/.<+jX6g`pㅈ0XҦ@5/N֠ Mth'x1{%x}#{n:bATCjT4?yccd*>kuQk[)-ܰΡf"ɓxCYatpLe>h.`s~g$ȱ>o2q5nLے;@P^:`)4^fR-w]N8yC :?vDLnnc.ğ,pl:hSzZOlT=m_w-C^k-U#T8e>+k_ 4趟[„a`t U%5$~ #F1$hL0w_@Jsxͨwl~e1ǂʅk:̏#K0H0BY8024S/ehۑr^π-DZU휴Bt9aɓz M0y\Ͳ^9xԫ*j".C\=z)EsaKx7A;y[`{a[#U>yUfAoXûo7VE u-S${ f;eѴykc3 d zj}z\y.㮶.YZOWn )/\vvQtyD"lU|1WͽƜe7_'GbP.g5. 3j-Sub.p nh)7pҲ`fӚ W|[[`-AQVaPm< :믷N$2,Jqc_ϛ#,<ǿ Tx>{f1=VAs LNn}HCˍ8NwaVṕ>\FLD®=n_1yV:Qu\)#9`}b42w`L1?dP/`Gk-{0v*Jjn?z[Xan^ F?-eCJK)Bܧ5X{6)C\#Lzi)z@xi /Vmk  UeqTLއAxEN>`(G[#Ltu`rI>Q\8;(K71aW#[)=|+t /T2K=fE~ʬ% t|uAǾmuHS̐Re.^KM*B  j[Y'h" f//6ax&3 Ӵx-~d}o!Ik$g*:>/) Kij4BLK9!ߎ=%+xU|?x7Tep.c|*R|瀡/9r>!_DrLSHVB=*p!\E?3&׵ކ*e@^L㙑dZYEN6 79~b4ZdžjܑǛR%y i |.@sv~XSO-7ĤWv)?i{'jI)€_V=A Fg{W$[2?$Jt0 EZ**-ŽBa`R0^5{S:%6vN@NvTho67Akӎ>̕x6ϟUcdo錋ǭX>>,Pcqܢ;XQшphMHe@6YaJhtWԨA*[JɊ͵z=k`W)bc`l}#=zfm]MW/w/ˇaxa3+I7՟1./4r.uQ&\R(kqe>1ĖpxzzDms&ƙ(~̤#nOn;W}a) >*; YQY޾JѭZhxQyy#Oj!gkp6F<,V9"r}MZH-}02T8"w$^Q{[nn?@V5d?0#3 _JI|K!!OoŔSoNu؂C2jJ|#ЬR՗ܹ:x׋:W| ? Uԓia $~k[L%O%5)}䪸jՖBS=œQ'/ Wv xƞЅHX8"Gaeai~+7H/>4EkN)FPK2x*]f>PQ4Ù]6K UH!WgQ0u&.WP vD}p,뻐6{eVdB0Q$hΎ<`/-܃@k+`ؽzu\=+~XtiW񲁤:F@pYX/> stream xڍtTk.)H 1t ݩ CCH ݍ4" " ){9kfw޻빯2 a*H(ji@ A>H4` 07w8!`ڧA,HE%@ $w"MH̝tq٣c~p@9`qqQyg A ({3z"0@B0ϿZpH٣P.^^^|gw> ' an0/m32> oEyA` !=` q!$kIu70?] B.a;:*|(oqrG!?] х.3.닃+VUqGoO⎖ r0}eiK"ćM% ekw?BИH7_kwΏ#W_zo:m< M#!!mt^kcRc>I/ Y*s` NmWgV}yU1ZOcN%3O4c$+ܗ(reu[ƮH^3F^"ڦU]II/nj0\>f^q{ydv:TAWE^Ak{a(Rez%!*\"ϭ{~T9Mr&ǯelW 9Ǭ{Iv?u*̔R Bi7nG]aТ5vЭJ=WT@UNezisX( @,SPH C?f6.ێ)GO{?UODm=6ࢎTtP<y:8 ፐҚmeC/.xi6q0 e>^ 'N+^|b]~zj㷒.l')z/4DW[v}eHq{J `h5^|ĉb]]T%rJ$~U+8<ܿ[SQF]| dRKݑ ɝ*_ʅ3.0GC? ̞W-Fsא-8 zl@Rg K~J̼\ۄ?m۵s8ױ/9M|/W Ƴ5Rвa]{ҟ^[& `] ?-Fc %zyc)^ЊEukn;{s3+(\\fGW]b,7cBĩ1?Ԓ1D0釹h/Jͮ;{zPßA'>nlk|4xYt]o6:IAfj z<"Jܶ6䲇2|h2ט6ӂqj/[Նui: N 3bVȥ 84͞켤`ea Bˈ^MXVǍk&tw)o~+ܾtUbNqU [ J SQw`+RRRX|k\mɻb7_p{~Vdc3/[XE1#"m۴?!TPu]l=!mX/(!^:|)4>PU8N^9݈)0aE:)A3"iGB 2X}œ#'_**G=c9NUIڷfh5^qS&96Κt#.1A2?V|YVr/3`go]S/K#j*HKZ0Xc Js\VOJ90Ug%cdsn'Wɯu- -j\jq!^R=[Y1TSCςaCWEV1b+S&JP|Kgwl^K JAI 0',#9wy%>,H&-v z3ܻ[ %z$^-@*/ؓ(ZI=`]#SBϤjӌȰ?n?XĞ袷r Z{^oC%~ `^׽:u}]t= ndDJג oъ FԽuQ,'mJkOmi` Ȇ-KcWۨwz *$Mpz$H$ [bQZ/ ?EPor?X-7]:rZXK7c%P|#+xs){C$Fb.vٓH ]nZ&a~폞wfZ|[וɅ),ȋ/GZNߘ R/?JIz (`8j_|}!#Q>ΛouбYER :U]FgB+pR=O]Tf’hrfձķOѫ[۳,oӢ]jhCkg"L6̚_M{w´u8<c@p#wܼw/~nnk.bk)$C43>7/\ W#[f/,&e $R;F6$)kEbx%Q>w] Cl0NƉx ;`ʿvE%έ % Cۘ#%/]f\bdʲmDuR:'}yF7V\"ߨRl*ζs>Y]:[3꤯'?(}pUAݺQ2vG1}+QO [dm!S!ɷ6ZqG UEʝdO'cv;ubDKy303yյ~{eN1]-֬k1Hןe`[ ^w:]svq'Yb~NzF@'Ew oV}H;*}e#x=8,T4󝾗c%Yw$ȊH+xѠ):IϭA^60U #[3ʫW/͛t M[} W͊Ir|¥wwǫg 9%HYQnxpQ'fJ«fueH#CJAkJFmS`-Nw{@^~'Rns5*0!}ג} ~AJxg Aņ'2jMmH&ۭ4@: בW ̚]n>s)Sa%c煛:X跹en&d4vi5b ӶsEuUiz1@ 9>W &8!8ppͫr@,Pă}03 jyNWeוӟ-su}Fזp\oMiqOj͝4c*Q,WrKyk'+:H Ħ {cD -kJ\ػ9|0bdo^_R;&d1SA~NEl;\]P" P>!V_mΠTDkh觀7zlF [>J']Nh}U4S}/6kUjg)@RSkP|(;; ~`QÉb@zOlm!KI=gw)Jihui!2!;s='xn^77Ҳߢ9ߨlB [N+歵ţs⪽Fgh6=;4k]žpLg-5I$ IQ:@QÔ'5ݻFvfm!k;qoLFɥl?nuFvd L5b5wdīX#$>UH~ w$P&R~IOA4s.UQߡ1OK,})&'HuboK U&KE߄'+hNXɌZ\> 5I:7=Y{>!=]\~O1"wŁb}YeŮvl̩6soljMT!F=S8I,R ά>síh]D:4+MkHr@ܱ ӊHџ:ydHRxGgR:1!9xꏻ ~ad.&%RMn9ԓ|@N 4I3xeEC[h6{]paf^Ls8Vwc9]?+znxJYVA/.ShO)QmV!yuZp0ϒzAIι~}aLSA[9=1qkU-Lc9f,,-QVM:E2G0 Qy!!Q=VGs`1"6N r 察8sH?rm t}xch kbhKv#e'=_Ry=jzvTr$vM1 - (\F÷]CPu41ja{W:牜'(ߦk0cN +^SR=hݘœTxMl%J9~pz4uyzbs7{Gs'@ʦb|ەٞQ_ljh?9es,,/[>:Oɰ';s؏.q SNʓU Aj&Ʉ>|e qz&Gf9Gax> stream xڌT Rt%ҝCH tww H%HwHqۺ߷9kbyJReU3 Pd Sx `ffcdffETr#F::Yx0s;e`;@`eef23 7v2(0dAv@'DJ13SZ ۿ"@G+Sc;%hjlPZ=͍ٞ։h!Hfl xt:(Όfi\df6V@;'&vmOm,,W +MMAvVvs+ @IR-엡ojlecl6I18s2uwvbt"ӯ0*KؙlmvN'n4݃ZہVvf濒0sgRrpʈc!Y\^*YXfV`1o n;@<{,_emW4dEUe_( ```2.[%TQ;p?cAˠ2@{9MX?/_.WtKMGmlkex]k/5 @3+q6Ϳerr)[9Z=C8Pd0t3_(N^鿔v _ 0vt4@8^, 55&F;3N`rDQN/߈$q~#no`q1$#Vo`L]7F`v̮ٕE`v7F`v̮5~#0of"o4X~;+{?UC8LA67ᯡa20;a>wP?.7 |ࡱ1# !Kit&@pbwhXf\9? 4~Gځ=89ÀAQYav/~a d: & Kr4= N ]8 j>pໜGpvn|L?&+8\s%G:M\tX_%@;qqd64f*-עcʫ$u7+4K$O^-B[T~z?ƽmC\/<#B dP` U2E9έWʽ|y$dnW{5cCz^@ eI,.3<;4z l=Q[k'5VN< <\"kI*/dYyҢ"oSV0fT[kqY²&I)k4t$Sªn3pa1]m2B3Uymyauh6$nixGDONR7|e7(yS(k#~s|Bffn\hʆ3/3h6nA/A/&_S ,$2Ch2$bUj 3ALg،e$[ E2R=UCzy O4*b9 THw"FE>ܘoTT`4*>Eoq}y餔&%U|=ۃ`B~&Jj&=Y\FhQO?{QAﳿ0vu?km rhCMjw=Sۤ&)l*J{|i6qT4kn"K53QWl̘cGҀ25"z̗[Y$1UNzk*:!)Ņ>@ș3.b7PAcUM9M:?( Sv]GKiA+t-bs6&2Di0o 5,j5#bos9U\,g "yDD,AeS0伅$Gb۹G X Ҥo#1 s7| ہi}BڐZnz?|CBCxFB\ɇH#I_.ݕYf.!P_q48ʹLWJǮv%{5%[w8kmήJax+Ӛi>:QŅB6W/u9cP:-tbڔ!ڮ8Rr^tD;()XͲ։DC޺k' O nիCcye"' R@2ĘND[&x_[cqkM/rǔ!yNALm0?!է ms>zTZ5,}'j@N{avo-BI5eWm ~?~[#Y3J<9$,ߙSj^/Cq)lGe\&<^êpL~cxud 㶳",k!X5l 1|QFğ'KDC8]+$q͈6_UB+i;C.^Q#\8ּ^Q$A,57֊]6hFr/?ցna%F^%A170U 1"JIXK ReEbMVXN9n'n2+rqAj>ýi{֌å+7tZ]}\a&I%k''-7-n>"! 8"O r nEDU ,f Uu|0((kKNDÔMhC`G|_]GˌD j~f +}%;c\uu޸uJՒM/Ur59R `,䎤gQ@P)4U2 l{ # K2Po[ҸRã}|3۔ 69d\y.l܇m=9[6TY2Z-M'Ǜfކ($y_N#_FI #Ck.d]PjW)_.SY p>u.Pnޟ3M4< Y@sTBl4?a~وʕʨZ&ot1zZ{+1N:T`x)`P($cc"y2ԡ×iU6Em%\V_>.T$5<;La ~rey!CZG2Fu7(JEF6* v[L;li["yi'wOԣm#6$\ sbu} R.RY:3E =oDl!nհT}4).cGݼ܂ǒ衴R_Th`EJm fGT\$p]NE"ޘ%3WW "hȇ o1iZ Z-ytgJ\^Upyzʌ(v,t# <`dh_߿/)4m$Pukӎx;v;^ؗoI0ir' kn~}z' SO#}dO(bOLCJ~-' 2H>O:ğ<˜n9 ‚i5-v? n75egSZ[P}&KqEqR }`ɦnrP$on f:v|Q{HRa4s'o&a$Q-ovL,Ip8O$Qc-]s \ iNWM=4ݽ I7oJ1jUd.gF&H:x$Oq_^ju2mМ `7ooYf\S5Pd `风bքU-6R;X`g[b&Q a{WTzwV|@h0N$=ཕG! ßPC zd^ XlKC.;#Ki%b?r>e>VY`r0{O^RRQf5Cp<W6YD(]΅@^zU"^YnӘ3U$^9:GL:lJ lӣ%\{Too_޳Lg9>cUuNV=Ⱥv#D0\ƯޥK,dJCQpض"rUUM3כYgvоc`RLSKGttOSԱG۳( 1OLFc"{$7 ԑL9v|9U"]*r)^ޕSօ ie.jc!Z!t yAѰ tsVJ~[ߡ- 6F> / xۻMAX=X 8&{y~TտP6>kP٫)- U>i*q3oV ͧW!U5Q:}hcJ߬Z#zLZdWI/x0 F1eJj two')$ͦb8vR[5Bc_U%IC __ Kv>6:S4iӠebT):+J?TfG'΃0GU*gm$) ^+GI%iB{eUm㐀,'r| `>ƴ>rgjËZM x/HɫzxaN2BՕgt`bjҜt=p''^sW W{}^{"J;oV&wzbďUБC|KmՓƝ0?,%3/Y%K4Hcڍ(ΌG"=>f`oڊ Voxva]EC9󡉮7l50}խ,B`} 2w%{V~v5'p{E,r oP8I{Z: " NC䢼o0zf+ >.Yd7vb3~% 'vF#NI}܆9;\nގLq'X9YOu*-dV.*V-Qh*5?ȋQ"lF|^F\\VyNgLxyjYjwzS:$ ܾG;53v\q~:K'՝8)ߢ 퇜6qJFeuh2&AMԝ<06E\ )/'cy(cNA|DGA"Zz}l4Ut:jvRGN3,G$ظNuDq{̣I~ GT6ۚ>O׷y`N_He"1ԇmNR*ieW3닷B`K&,*A*w: =2`<:Vkr] oN|@Fϊ{=ƲYhL C, ].s̬uTI[BRlی58lSQ8$Mi§ )'L:&EZ 囥jH=^iHltiFuS/LC= !>nn;9e A[!U|AWDNSjh*N@FrelГ0{dTrvT.bZODGn7jDTkRgOT*ᵇkY/wn{\u%fq<$^"dD̈́FU|fy녂xJxi`7-b.ᲸejB0&>P"F{nr7G[Ww .(Uz;R1vgZ~GxG C"J ! mLJ$yDA9?J>h=sWK:88>ȼ]3 쵪quy~6ߞQ3UpKA|*xǻ()\FX8ؘ͋'N&~>#VbXOرߏP;!|py'kf , c*8yuf}+MEx}J,dF>3'dLB gRf+o59#Õ-r?! MI dĈ"F{.(v%MDXY~ZzMf6Q?2O]\WɰkpF񜜱d;FFٗ}:kWH(Whܦm¬Z,O5˄{56Z9{kB@=1*#ZNߡr΍{k9YjhU񼁚k/VF3]Xp7MfYkj!j"j={мP 38 'T}G~v7Toy/]Ϛ9u^ RHRO7#wh@~KOnps0ģÌI4>%Ty̱pWp#bϮ*CM!No(H:8{O_6-/J%j5ȋ 1&e&l-J}y'kԄzQwy趵!| 7A<[wis`!cJ27%)1pBkj'w#AN!}v1> X'%<=Wur qjv3 (6` ,&*<#gg/^\K)5[EY[ݩ,nUtF0R#Y}Sޓ%Am8 :12/^YDqAR)ǀ/dؼCa:vڂ4vjhP9^#i0HK~i_'ys°d=Yg^a^-S(y1UmiR- ޝARْ̛ИcZS3! V>WDzplP96+/! "JloGyƷBLh[af~٪ω-elc{}W=4>q\qbSee…3B u5aξ.ٚPYDB<:d}MȣKDأ~h5}lax$"^$ksqL #ЯHu?"-&|x? A՛9l_O;zI+* =QbPÔנܠnLL\n`Z7= Ƌ'#w?$80+gR)\0T@\:~RaPP:Tpy+ȢLgog Chj-$7<À = 7 jOGX V2)=̎٣]EUtrìxWfz)dj%?/(ֻN\UĸzD8nTܚkBR5Dlx1`/{6f4L83%$%DuH()RN2 _/]M٥n9-źBMVDZNu0NYS[U04üe}:!mj*_D(~p@xq}Ԗ4Fa埿(Ք3z\asIVCv>s9Sixt IBCP~/~Y1U (_"ϻ6ƂP01 P'#nrV?oKq-/ :ژOҍ ,%1F[ʮ+ubٿDsC,~f_zid*}[gs&DMd{L=?C͌ːJx t;h.JUĺ}7T14ͱxX_]5rXV*lȥ+G?x/lV8@>(i,5gc9QO塲aӤ{!&7KQx(eI\F߯;}~hr?ٙGN] -%d}|]˹T[axvʩfV,5YisuOAhϼsŔ9įZ =cMx\eͅ\^K6cQv\2c7;Gx+nGP;& ֦;[8*Ռtآ?l=Ƣ)ŽeA1tYcloS}Syzr5*}uSG:2&p 'tqpZCuX󡄌X:?+#C~0 گOWDzfgt 64C%frLP_5M5O&&[bA<2d&ـFCj,5E!"L&7S)ITb"ÅF3SP?3ve+^7 9$1g+Ч 2Y;rr `nw*\ԄVx3JJ9M*Fo&Mn9T&G9Znr76j(qt}LN9+ٽHjRooR&f?7aA'Gȏ_Ph@}Z&Wkge^PqT=m6mіR n 0//n+٤+/a "ItFdk#NlsVKQF:S1e|qH?LnΖJ EI!Q>s<&6]d38@dF pѭ$(R%ݨϴu#O^Q0YwR \aYRBFT#o>dI h?ᆱ[w=?T '1 қaY>!Ɨ^ }x“"Ƚp* Ki };w4NVtB 0:$P^3)9T\+:>\+p>gTgš(zף&|U=9W޸Q_3|= RŁ8>6U cVAnXrVЇ%%nw?7wR =QPuhA5σOz$h~v:J1_N_:["JΗm(־Au+!8cU.T%J"px2Lּ&C߽> "@hZh5OzxZ^%uf>|g MrMb zCXݝ[@Zݨq̘|u".^||O|JL$o']vKS=^6!RIPR%Z)𠡞f&~6SXNEKk? J?Cj$b-"Nr@9X sX(KAT)=,}uh.-`p9b!a* Nmuȣ*m*q/M0؈PqN1e9\Z;1s"G:ULn ئ[vOb9y :u@gecGX[7jpl9fp0(/Ж2.M>,\2:Y!isA@C&9C~4n u$/׮[sr`K cͽ9O'#-8U9%Yґ/Z#􃦘&p~Lp:ih1<`~۬eqPkTކ-,]X'NJz?XS KT)fҘXBbkqb@oc5ꜪdE/NNGSO4j?.~!;v -Q%u-#*\ iYvBPLhvǽH*@zt 4MGՃ%oE깨zcKMY̗0cwthyiӜp0s"cCDGv.IMSsL9/ 7@r)bS.tpnZGBn蚓4vSXیZԾi0[4n!W-<'?`4t 7b։r :_kd,܌nVZ=?֓7h?9A =b!.W']jL|N(#TA7rL%3j'K j앇h⽇;SnV<%n'FWX$SO.f/=x)2vbuǗ6e6δ"F$8cS'$$.ްm_ɓ$Sֽm# E_pV<aw lD3뫡!i&<+:"U Q?G۾iNJV~tk<·Gp4yq_|`'"<$dl?xmֹW}X^2Gɧ{OE2J!EzKcHc`$0w~#A,;o؈=Guo  p"PXnhImwJʪo~5e! <XAC .K:W,?q]xWTfxI$tDe3k ~D2#3JX2BJySebb8LяMGBtnbL{4I+S}`'ձ%A Lyl#rؽ/Tb#OCCfk>ޅ(0RK.?#GDE?ys爭$yB(uD.CV1QWK4'.k#5~rj\|²#iI28;977!g閶f&H>e,-p%,>=:_i7N*]$j5<3¹}7 iÃQ\l)8KC<ӊUqL!F5;BYJ~( I-0ZE+]|orRڟI3CR}7Deqo y\q{ѼU34db+-*zsc!\Q_hS(z2PMCG r |g eEZ ' >_V 0.Aa]6BǞu<12F;/?<5~~oS³*#ݦ3 0U@H"Daӱ Dun'Tds0 :TF"Ep -bNJNY5^Pq;.}J_51GBDFDExu|' jJ KjØyDz0IwQ3Va1^ީ֒U[Bl8q)Q@[m9}MGB/cT9)k#P5l|-w Q7]iG͐}.=7eՔ {=z}K0z᭸$AdFOr.}CEIe:7@`NxFWW$a<*㼮BR-Ė/x4Њ&5jx; x㶨tĐߢ b#ntαϞ \JE>H GV )V >e:AxOFRbiFj}zT<{P=fg8ٙ>10FyQqȌN?YK`Ǖa\gM⾋hUFyTP/xb U Z[O1+mFNGLI4+LR%P7RQ3>yRgͯˤѾֽY},Л{9rC p^=ƣ8H`%ʲ9Pz?]Ub8|EP2Q>Ih?٨P0ٍL\z .DH|ޒ qr t j@=eҵ*Fㇴxq `5٩JT72LOuDY3gG'd8^1:yNA*)._l o3 7-ϟ@QӃuȅ.ss __ 4V(LºC['2$*Q Q(jt%֝V1hNR5W>cqu޽d68'*j:֒:pqg%˴={&0;5/dYt͎!IXU{ؼ Ź-%HWd/ixzp*~ˇ< olF^5e^umc=foa`ɪ0Oӱ5LV}KC0lu =7&FA*Q5 \H(2Ȣ`?I @15$,yȫNO=cbJVzC5&gH8=Y煮gKSЧ[r%n! [ca8$|Q+mR)Z7x_"8T&Owqa2?۬5DXgO*\/59D(4ѳ!v>nDBv-mmsj)ݙGzF+'~Qc:_)O2xcѵH 'SǎXȹ*c8+}C7YYQ]Tkwŀd[0M[- )_mhp)-{l]E3f96<¬s!:U0? zrxגJC*O/ce~l|gpwDboO3m!07bؤ $M4]Z*{ZM=4xZ:%j(B iu=PqSRq9RfsՐ˻uDdF\W&r`aMn+̅.jJ~ψ7 #wv0.j6\‡˨;(iX/)p5$%kqI7n8H) z9Vi춙B;4S78@^z5p2A0>|2qn͌RZk b,2қ)52nGn0֥xc97—fߗKjۛHLG}-a qN@wZ N"3͆yIL\]!o G~]SMc^8lND 2#U;J47xLٜz<xS1t$Sl7r t>M5>cY7"& 뗋|vWZv }$A8tzsc%!SKU4 X@Vվ; w!F]g V NUd}KϑH"'Q&.ke.)!_/hzףPђ8-7qtDŽyV~ωBqr0AfJ6]NPP%(&3':=;yi )kF<%h\_Ab|$.:ئmܞ7}' ӊF$KZ;o;+%>VR Ӂ.HsT↣D IbzyfG!y"`Xôwxe!1e.2#X/G%rISW@RM"7@XnqU|}Cߞr62U16k]:;^tk09+;m`:] (/2EdJaypg;B>`ܘ=qkT)^K!Rr9at7B FɆibHl&pemܕE?G,hfep p!HkA=d "zEd1Gb]G̀͆Ks՗pk?+??ofTMN!r{RZ+Psz*4C5Py55n{я~7'_E;&np@Y{}C܄hM?)_˂)c3PИ?sM.NM_006(ؖ_.qyf/HpڢynY7۔iږf.?p}'A?m?s3B:2^100A<XaI7n|Qʣ*!PSoOE$Mo|,t@J`R6].F7$DR>©~ D5\щ9*]I T$zr2">'LNyf\_t2]A2y<ߍ1u8VN#m|RV34]lbs3v 2,"ʀ=ʽܨ,a 4HfS^fHIJYlN`sW2B|. ŪH uKWI{`)e5jD,y3=.&Пo.C5^F (7`< 9^W,q@Ng|"fWԹ. JJw)Ãdzx+j:G2Ock8@|m^vi@ZH8*(/y&xtO~%"xNRV3IdHv M !ϙ ™^a`85)Z5A6IOk_IYxڎ\-PX\&([Q 4 3{M~dBRl[YYԐqy>!ȕk!{AtI65FG5WEz0 k 0#*fc:hbH2l߹[ {GkF"o]f<[0@ZWNCw]AS k8{eBd[(;Xhpe] R`g؋ƈ e-š6s?o%'N0;=kuO Qfz~[64܅hf7:'Rk/J)# l<[V&Fqsn >*mW8iL .; ?D@jٜ̅5S<6f{:^ 6 OlC7B"n=r&Tiϩn;}=\pOpZ\ :6ƕߑ]I}C쒳? i Sla-dF3}#Aܢp37h5Ǒw֔qk \7T~7a; ($nչ|럽!vYPAm( nGT': ƽRq< QfT=1W')~`m .6hEHS;2?~'bx5Ps0iWhKp/+dfN&g v ؂M+L)eM\wcf|Bgg0qE*]af#4gAp5"qEzrO =1ʫj-B_ qtdݴb$W]af:&"Q)N*X *t}%:@ݥ?S! [ͰnCWe% ; %'x-̈́2H ذ*آ7ʲW?s`"/EAxI9@hCO}q ⣳Il,mX̐'&پƧwkueˁ`/yOPgSm4k"p$[\EF"նSCH܇ XSCUqa [i:mp]/ۅ};4ᜆs|2o\i6$iGԳvHrR1e((9=2"M2m>X3^ Zq˨4Ǥ?_LqPNdF%`Nd ٰ'*~]DRsUOqMrV *:j[5\(00GU\2(`ˉ;RM{ydۥnP|Y;\,9s}D )O*x|Ye\|?9t8zd+t D Ŷ9DD ^6CmӑoX9qXRl?M~p*Cu>:.h{ 7x'e}8uh wK%^;kzMI+zM em4uҸ"OC/9JPm9 \$zǧ%-z<|E!لY E%X3ǷE&\&)gSKavc`#רi5!ve?NbJU&1c%}@%BfJ; \UWXd`VeG`PJX"(N \֑.2Xtm/ۗy{r MDRiMx|VlY F~2q1*8Et~v* )4t*r^[uBz>D"c.N@i߻F{P!icfЀ٪ 8q(,J<=BZOf J>nҵPF%|[hLA@+ljc[F&K8<R`Z=+ dݧWn?k ,СQQSy'E|Yw) ;I.~H­Cvͥ~bHv'&Iǧ20Leg 3VљrnPw{"rx8q~r],DCs&as}d,KЧ/K)]>8}I}AM2VzԮe1<ɵ_jo,Qetk oUH/˰f!u<~t .W O(#[X^]ӚG+;YY7`YLFΛ.v*y k:~m LadG:Wz”H!rP!R/[M2u:K|F#VW'0.lX\^endstream endobj 131 0 obj << /Filter /FlateDecode /Length1 1611 /Length2 8535 /Length3 0 /Length 9584 >> stream xڍT-LHIw JC) 2C 0 "!zoZ3O{9\Fz mNDdUxx@ ȋȨEA4c1APd0&Fǩ:*.v>((E tP *@qbupCb CPs0 FXCO4̡(XĭGQnn777.3JEX +`Ge\XkvmK} V~Pw~Gxx3;ln`y@aVK av`W0lv`H/PG33Wܿh,uX'Cdman0?%fa Gn],gȽ B"nn^|_#r vp׿EX<< 9`°a7C,ÇCF{>{q// ?˭T88<aa_V 0ϻ!TY:D(w*XVOPs2@/gN/B .vv,7jg][p Շɪ zn#YЀ"̭_S _o ޿'ܯ;X;^A{`+ _P oe`}y>K8֯ ~~#!!H^h#{tgpsgnȿ}=ݿ=?lMs p; čps'Ι/om߷/@!X3bA6A?jATn[%X9.W0YkVAC6YΥn6b%j~5Վ57N?VGIͩ#}oڊܥ˜"H[{C_H̖vSIh(ci|O4ϿOѩijcD{~捹\pdKf7El֫x>st>nsKM|ĄqLX92jM)>?hIe]D̙C=zn' -}๋BRoeM@Am`zVe5pMb<`F41jŘqFc:)I2L7s*G8x{BK4ӘH3Qz {YSo)5{D攅 [rY( -c/dR'qJoA'L6McEH3QoUkpD hY lC^xҗ`Kb[Kbw4Z;6.BD_wɞ P.kǴP^LJ 4hrsǤ\݋"`G[)Q\s ̲za ȝma~ɊN \OBL[g)zѪVD껋\:BWo}YZQe f攝UbKb;ŝV~wftmnѝhjRiߵDI A4#Lզ8Z:Ϯgvތz-f+i %:X;g*1=iA/i G!R#3|r4&obrؘZkTڼXkL[c#1[tv&&#> o8D&V!w+u1#T#"$,95bBJ܉Z JogtHf9GٖP*#t[մqƍ虪Ј⨷|?]3Ht֮=܃>VE4|7e9sS䳢(FoYvlI];=wy'&;H\Y,jf)aF6(QT{B:pg*w*fd%BQ N CsZ%LPTY3T|E =WAiMiDAHP2Yc- kO]B2`1ÔW^ 2P|[2eyR]"OP@kӨEB,a/ޖ;7MD7sq-^Jℾ:ɒ ejJp2 K{b+[Zk9|(0Nk('[?`RHwDwkm#/5 veP-K\#JjF Q SA8ql'xc03Z.dlP] P\ϺlE0w#ӏMȪ.C M޺Ƀg-& 5Cﲢͪ)ӿ>]|ϷIp|W_n=Hh4)!q͝``VGLUZ=9L (Lz6E rFN hb;C#Ӯ L0c;)7AX @WJU̟) B2B0urmq4ӫ450X,Q9$=ƯGk8glܳFy*'nZNIhcb;b+{4K_pX~se 6ќa + NXQ|^ A‹'MvVLCS*3 6uyL8:]+e;.vȗ# _hGXZTc0?u,hԋLPw@˚}[fU T>1%d`P%MI äcbN5̬^ӼyHr}!^VG=ۍBeyVe`!o83c9 ε#/f'61HߔkuR4sM,Xyq FzOxfP0rӄ Jӭ.I*[!o>:‚{#K[۽&Q=QJJH (#BYA{qW߻yy"A{-8p>0)pK=z.Z{v> R5;G{KSͱqxr=qf6jJKZ{NL|(HhPmǴq_JyesPZ@h Øy3À\hmB&ξG+p!7~`͜gᚄ[_"P:ɍԵ\ %dג[cŞHW56j8lwH]paDd/QPFC1M]z(^_Y,k!a!1HpH%.U[ 4d;k⛈\vǚ H.$*Z߇FB]W6/{s&_TJh]/]9'&bҏ'SM@+VN Դnb03B0.=#=W `}e12 ,YԒn[U5zbLƥ-m IQ pv4ЛxWֽߡTZM:- qڅeMe Jm{ <_h-=bbX(A~u>vf˹9>9=heGu\njndm<*^(=c~4&p[V&ŶMZRz%TLvS9b\}98[fpiqO(E$5f YV!^!S/ӁJ,];=3uF7U7j,V ߓ`T/fi rUmņ]ƁJmXQdzTzoGeK-L~p(LmR,tlԬ C|S([̬0wCd "j#vJ4y=ڑd}xT>Ev=3Jovf3:{eokZ*+<<@+h(kB8ҏZrl}An3֋;k#`G'@nR 'K]dbI !ܾ>?#۩u(T3."=QAcgZ}gH`#o #{|DQ2Y aL+;y֫B;A*LWuV"Ś- rFz֭ r;-z>LnZ鰗cwheL;hO.?fDd'c݆L/t}phJBvo9DT[P#[eS*#"xtݡn4ԾMXǨp~tYx;Q=ki{ օ8~,C6 gԛ҉pS@nTB^zT}i#" -e#%TO>U3i21m+W'~.Fuv',wVvxn-3A~Qg vır.t9حf(*ܭp6U֢p+h7UMlE*?5} صFb  `g}ڸDS2ememoCt4ntt9Fn3zW!fl|Mldӟ?S %d炣4jY^0jT Ia5)%?BIl:|r|Sw9S'-9?* z*FX"˛󦐵wɓHrS'nQ/+E'/P4E(.^(G?өBvqԎBms @qКC mPoӞf6>˖)DhRK9!aIj&a!^Ql21Eדi~[>M[e=ꈈѢ]-uW$ALC.SjjrT4wI H LFr <]"d do$]J3.ssJNkxNs-=U ME[52*+ #)\ĻD,SA߰0-ksb ~xEv> GHwz"Jky >~<+@g$f댈7x.L5@mq `a k’itؕמlMh?(D%^oB%՝kkDRmdUGg4z?Gܖ'1}#sܺe`L( 7*tu`׿csw+Q,ƬU.vGw5>`ӗ"ZWu'D{fF x3i$PצЎgcr8N@œAtQg`ĵ[yh v6ԙ#rZR2d1f_.5udJlJĬIV0xPmv򄃗e`(O>%NcۻĐ?`M`{[|ƻfi>-Q3I=Ul 7!QD>:Y0HIm kSds'xbcPL*,LeFC2OhhQڊYYB9f"o$eM8bY Ž)V>@uV7|(n9ʜ俧 !Oy*nk?nNg pj^ !!)^U~2+Z!b.pB.n60Ƕkfjr}^6OrFt!嗥0:pu_lm xBk u(:*ɩJt1v|~ҷ=!;:[kT,*#VAV5}Ŝ&:.s^bL&Mho ɷp>Y/vCݜv J.U+k ڋjw@8|R%v/Rҽ]0Ƚ-L #6vUoQ)֓iw휾 )2)r[&Tm,}s { >G2xO}McuR'H[s2<  V~+d$xž|`fYDGXNC)R1F'?r!v|GAh;Fa&&!sd!3׷Za nSv4ao=X4OndOSY49)zab5!dB@ʭn E|Y!=sQqЃ%luԽx!oU sssov̉_TPV &ӁKW V FeWs*"6b iO}خ|Vq~b kBigg[=(;' 7JN}[E[8cqG̈́Y+s~vqip0ԁF]V'i VӕCJ0bd RKa o;g J:{W'R$O`wGz2m9#X#coV&3V~"grzBuۉ4~(G>NFѮoWbee&pHjP]^$xUQ a( S.DCz<!0[+pվL: P[uK%*SfU-ؽMM3k/-Ds>Uf}v`!)8 kZ?͇q& Vv@0c@'H~=Z`Nš;~$)W7"f(+dQۋXEr7HG ?MvEa$i䊒n}J }^J+?qj> >?]*hXP]ӅM^uuWs#D 2 ,D1Zbt:fRqY+ (#iB(Vb7Nv<}۱4j-H$Ǜ,5K_)C:ܔ ɈNp*.'0Z=|o+m?=vǂhnRIFS2  LΏʇ^/|S$`$EB˝ps/dFܜrTSŤq%xάj躽,1fkۻuRJ܃ΗziyQ#gDf6n@cNakk2+m)wxiC%:sU ץ']d֔M:8L7~4G?i.;wa{Uޡau G[ԓ^[c>N Q~ * ڃ7q1^MV BJ|j\)1hJ'JٝK{?#Uc^aaR!إ.n=j/g[QcDQ'fʧqμ戮=!oiq/ࡎܰd?Sfo2]><ڰ'j.72Fw_ޠ'$ʩ0gS^&wa(UG`1dd[)\%FDq..+8wkB;5yJ,hA3lW3~^6%S\JD۪ӐjS8FjN[BI߾ eM"vi7‚H?.$dW-{߇npD >|V1:^9R9f5%M(:p+"Uf|qSUBD([eSxQְ?@YpdTݪw)ݛɵt 8} zj~ge)f_ K/|H*.`e'4E'55TȍGx$L#sޯc@R{&B;OϿ_5 ׉$h[yp \@g,L|L`.Z JR9ai|aǢKL ?铻I?j\p*U_O0]xz9M YxeKKZ wUendstream endobj 132 0 obj << /Filter /FlateDecode /Length1 1459 /Length2 6975 /Length3 0 /Length 7954 >> stream xڍvTTm6CHHP= ݥ RJ7HtHR*ȇ>>}5׽}az)e#<\ 6 xLLPw'ȟj> +~!@e' rDePPd>P;{2}YY<‚ÁR0+ !`' qW Q{wwgnn///.0̍ j'!nWO `: kuCuB '5vuTΪ8p<   Fp(h u5Uܽ9`/G> :~wKif uvwr:+)md0՟,b}>L)B6@x8s.%?]UtvwB\ok{_u}!<@{-s{B4[m@+'b|?|W7t= =lp'ϗ[HX[ۤ@?N>> '(/;[ 蟄Jp[Pg ?Yư]AqOe曂@?:3~+oWz۪)uzCl4P)ܧw!7读~߬Y6A%_{+vu@/ 7\p}^ 5Q!~ /o$(vQ G'77?X:puo/5xCsRT^;bL;鬜~1SYf^J!\ޒc\;hnjj}"I{r l`@SWr_?2+!|k>򏣑s;ZoܔOq>Ӌ7 )aʷʙpb#>&&ΛSNb|yWg۬J.[%#1 c?齗~Fx ns̾9tc~\} ٽ :oNJ50RkiQ#RqY_8T,$Z㍂:W[b?pM#'pxx,uwǸ 5HiNK*,"D!Iս&ngS|Xu R5E IcGՆiWv.9_Ȓ.nů##ye0wi?վ@o8Y4WVhĈO|3spͭ-M J^|o#`Ag|)n, *װ-ՓD,6ߩ$EYn rSwĿ gϳ/iѿ=)QOo<챐B$~+1咳uSpۧ0GKr: )]v-Mk ` QO6/:ݼ{Qi3fn]O_#&CƊU:%HUF )Ox8P3Κ0lLz1l~/<"^E&/zwB8*."gVvpyǤ'K;_JtOƏkdfzW*v%tV}W\{QϢGs_FURIO.sJsПn(V `9%1b.duE&ڐA7x?!M`"5Ovô Rҗz7jCoWm:hdH˅QXbղeSLO,x 1gl[,?G֮A a@98o7Bk|uXGk*}(7iу}.db9CSE1gy'.bvE)M>_ɱp%L:1}x1>+p)7ic*Ic94~?%m6HACG@:FV:q ф 3nϚeA٘?0AIiHSƇРC 7!FNT@h^),2m$9G6E5@!K/B{s+# 󰂝Z/|$rKG;oH)=9*A80QC$$q9U(!( ,h7?# M ;Y"~R}QB7 h1{\G2E??e{a8Xѐz6Fۮnѐšd,b,c^~HSr;7*a&zzO/5`oRz~ZnOtPa@/2I ,eă s^Sm\ 0d{r23ӎcXvnGTLZXF8 h9Ev)j L P4NC z>4<2\J/%]"chuiK]p0~pZ=O3_PR uG`qqMl>o3`IV7u}^]},_>yU$z.sܷEfѓ2N]'vp #o['=K扝TUZ KG&(zTUQ#s2d+k9EN>" Ni!S" gWoV_Ӏܭ s-= {+Ajze֬h~1kf| 񖵬w-u~!_[93IfԀ=bGҴ,oNY ;mB4מ1g1pϹӰF >;qt: M:F"Ѓ"E g,_8Gѱ;܌q f6tzj3-}i6:Q)Fvؾ,é@ꡈe-jd32Q*}'MvHwyj~* w*}FYc#K73VZ͹jե10tGWq2F8v AnZ}ܭN4w%>.']BeVѧ.Ce>CKlo]i=8vw l8ŹP^<2UvtOKƈÅhw}?%`tFDZo(|pԛL+ tRY2[TLdlqpJȕ$dm?12VL,]Jy6HL^+BEsT w{;Z<1bKFs:UI /XւlG%O@LiBId9g7j􇷨:$._a)ْ I?#|5Iʱ"v=P 7|};ڃ#NW rW0ygٱ)HQmGnd.u#܌Dž$:ȟ 6"^)n FHw>zX+@!,~+SUY@Lr!{}Օebq_Z֨m"q%t,_Gb`dbB0+^oi< K 3(DzGa3ɛ"jͰd2t t;mdZqPO?Ƕvn`#UO#sՙ+xgyt\ÿ.qE\6OF +cu^+^,EUS]*=68ߣ)`a=Ccy*3!:}u&/Vk4\ކS,%]s0½Vn~Q99bTj[-c eIc뒅*G'L!vBNp۱)EҬBXpiXmZOQgUW3\hLٓ-zf`Tݍb2o}nԠ0`?yp(%c[l0ŝE]j"tŐE`ޜmdv uU*#62P.?#cK{D{͔?Ӵ`lY*ߍN605m#)UGf =.Zھ$1a8Y)B˼0y08Q,"Ӆ2:i^>ǎiZ*D-IkHwzJEZP?RY֜伵OϘbBJ:d%WNq?aoh벞3_ZX|O{wTEIAcɘb qFg?q1J i^d]OW/>8z05gd kMP^Oxrjtjh4.I$EgXRSB]!IZiе0/ Y+|';to>3f||qfoѢإ}h|W`[;s0~9/KGHIq1&KgBXp:|^@$$[$*QJ5g̕9g|zxeb(إE+ÒWaB K65/7i,Ӫoy\ pzVi)\Wfwo[2NljR,Z/_̳qpHD!_lXHq*NTZSmBXYתV 7=;}Ơܺ>R$-;XkDo~$<WhDvُv-zJ_M u'\䐠7-J оyYP~>h> stream xڍVTۦ$F2 iݝRc  J Ҋ RJ4W}|yB$i9 e DcjP?3P_ F}|h@ (BdeeD~p EX78_a86_ܰX/9_ Cc\E Hobb>)x'G|Qp _h4#@!b@N`h@]p6+B=}| u>8l Axa}|~/Y嬊F"(8 끠m@Q?./ ξ^ sg `,`n_f^N/3!8/Op_b|!0, @AǛ. xA_+;(7dfn,.t'*.!qq ~olQ.hw ?5!]1(mR`MPy4|=={~Dxǫ}4~.Pj c_zPd(\=D"l_={"Pp#g( Ç5So?J.͜4@wR@?ߺPh,>tAcaѿ|1n<_ߓ a 4]o+EWGV, 0;4di/"1i}tp ɢSNOMFVW=P5SZ > n lAcxߥP]6>jbx.ic|yNOYIB c 9C\:€8f>m6, GTu?J l}b%>iN,Q D$xK|muf+e}?JD3b:H /"յS~NmgCmw3׏//Idž\cOܟRcM2֠B^eC澆(mI1*PuR8ؗcg%13}b^#V:Jn{bHʪb}1)(Ńq˘\mlE<:WؼK%2PS (Րށ}N]vE$o'rjGpT"5J j%1տ;xfDeRre2 \3ٱ-]\Mr]~L[}QY$ic}jLQ *6.T% E#Gs!=dG3OCF&gV_^^xhS-ϐ2n1Hн4fl&f^G-lҴt{R9V$ӄ_b{ƵGEؑ N[3zfw!?u}||lSrT ´U$ %}H/i[3 ַ=rեI8q.L"'@¬I a/~ohs2?-:es+LvnHD\Bu4U8*@7")"Zf\dV nOZ4/<@}kȻу+IB7"DŽ8a㳚n~mNhUn/TDex'q,~:^A$?fcN@r_7T?Qpʳm׹Q$el7I/ >1 d_eΚ?K}^ eaI5dz ZMü]u]-*14ko:M9&Ӳ]<9.v[Nk)ÅּN'e|ZurJ),_Fs]e"y0$O)mY^)٪'!bIa(V4s7]< o320\$}Jmj0Ps9-urnELmtf ^=AGKG*˜1$LvĽv?@fµ8_V=ad3!8o K{Rg,օn(ez"/tfM7WemZL""zyTstn#\KumDxDZ/A/$ƂGFuIӱ)W$N B_kˊW?lZspYٕDCbp1b&HIFU&O ]qkꢭ:Ak5pNzv+pmEp C2^֙n=.KƎh?bQm&짌 }fb<|]k-b^-f ? 8[p2̘M~[1e+iԮ9 CJQm qcZoؑ ^-%&W!m@emɚU2 <AWYt1jZ /H|>!B>s7;ˬ~lama&Vm~%3^`[eyxroa=M1!O{zf^=otXc`sO S,ˍ˳scmdGqD&նq~A:[*UܿO)%3=nе4 Cbo? 1 N+ XpI~qZ'e4 ^,g5K6p4FnmG9t_eeO?xqoerXHq~0U|~m ܍7ƒ˳QiGS_d6UYy?ӆV?7JQeۆwMUOrʤsl2IiK=ĂPC<̒E;]l۩a2}b`ZF'Eks@ J&ʂ4wrTt.[#*bf6'xٍpg`D}Zu'F)&y}̣ ǻYL#R'{1Bǯnq 6 dbg/)(|mf[HTAfQ+鋥b>&1ʹY[~%\IsSv[ ~m7#q,܏7c?`s,ZȃըN8>B Gՠn3Wvxm nUV֔VQ1\1]/">u(ʠRn&l*j6CHץQ=1 8HslVZ )$|><pzUdj@j=v190ٿk^2uU|(9$D_i&Wo:WXΤG8X+ꗩzS ;ʻN5)!KazkyOQt;K@9wr}BO1O|E(pcTUP>ww\GPUeAӷˡ?؅q.̀4$Sַ_s\c08X2seLW\-rXr4,&zCd9$9pƠɼg5yjʹڭU4OJ`p6I. 5.l;jTtYB!e'*z o$Jљ}{$霿Ns?MYg2$ŭ FT&g}Vq+3Hx){wg<|>L6%å)^I>OXXUwժ%m`6Fjb(K>+,vU*Q[S}>%gji@т\[؀Rhx0!Y.67wS 79v.&:͆ W\ia.`W[7QFN۾1?Tjћk{REi燧1a1]홗7]E GU,0kX3 y鄘^-:Q%}Π>T9$5Bz*F#,IT]]V-% 'H~z րw =+^]-Jy|oI.;щ\B ygkrUQr1]pttd`)y\Zd4JJƛv31;Wb^#5~92S$XvJ\)w 9KH]f,Sdߝ{@D5Nȏm1SǶW;HJtj5ufLrSzm=Vd- Gl71>/{)+}ci+}4yp&/{]CcXWvmoIXjȿԒ'5*AMȴ ~ؤ8 ^N̟M,O> iӈ]aU]i /gTB%2Nc5oszWsӏ5*3JTpAa sdObj4 sAȵ{ /&.S ϵa%:<ry,}R I*t%K!*S"[n{z._y)X fGendstream endobj 134 0 obj << /Filter /FlateDecode /Length1 2667 /Length2 17204 /Length3 0 /Length 18734 >> stream xڌeT;Hp%!!xpנޜs=k jWWu+ %\xrjjL&&V&&rr5Ko :ގQ' H&f2ȸY<̜LwC=|h>̰BipEICP7= D}x織!M5/?NtNbF:>STYc[%t:[>=Cm{,ʳJ+Iz% %ɢ]\ӵCTt.ÉI&Me9%wǍcRLRjȳIJ8dFlhȞGj>5 D4č+> {ܨ((#J<SEdD L4f>z&M *o-K-ϊrG"lE}PjZVQBy*wdϟjQo09*!9,63Nb/c7ea{^]Y:Hpx>&9])ddž| (9ʣM'*ςR ^ `Yy ƺEZEᄋ^EKj+^; >afڎ+|b-K:Fq@*G_%-4p\'ZH N:0"Pmaqiv}؁>:CW ~0^@2hQz塮rL&+Ͻpe1ΤNf-QtgM}xUWߠMGsJ'dp\ LIcvp|r9} ^kpzK7+%Td\z.AA] #1ZsՁ4󻸃swmH%%aV=DLuV̪d{ #i2z.SPM$5Iq``oIt b ֻN.5p_72W3=p2s苗٨Ʀip>@B' >.h?(d tS?)TtAUdN$i{BFA8]-WA'{Ƀpqϋ [^Q]ofs|K4eV=׃Kۗ['Z&go|l#=VzR;P^L$hV3$ut(uɍ^ jDI܄o< nW3(G ya/(aUД=E+S7H ?u&Ę{1|+ҟ2h҈V+L,*;蘍ᴼׁIp/tJ[Txg)ܰz`pf~qs,6㸕A(N3Ā0K9]rO v%J k|G}Cj?o%PB~<Π 2&ϧ T%e2y]LۦEMX>#0Ե` ĺg?Hupƴ\7 36uAS?tkcCh_!5{0:Vhza雧#wHP«:פK`;[+<7$e $I/vԲGϏ=l >d:/D6 3XsSUPƨcOsolmvPh ƿtBY,byaEX:R)NkH^KdK@$F^vi\r{%(o0jnM9;ǙEeMyHDs<NVN D &џ'_2E"Sf'8`NxZ`KWS{bM8 DAZ7 了ӚhOdlCУ`4y5-w!hBD 6 ]M)qtm(çmE ѸQ6ދk D(˚ x*-2C"noCgb8S7wx:3ԐX)c;t!|]7V~:K!9R9h,yvp^l5ޘ˾zP5d nxM<r+3,8}\ҽi 3FXkݺWLeN#Wɜg j|becq:i$(0V:Aǰ7EH﵏7_d>[y$ $,zB"ddO{bq6*Efeȵy4 "$<dztJ!p%$"b]gBqv PHJoxҮ#Br%JHF&8CD!BXfϼV$t|d%}(:|s ,Y|Ll}:..R>1~nv!V ů=؁芊x:\qDF4OW a}^K ؜\̪\@bZ0ʟ~y1YzrZl* >QEJ%^%xW iWXQE˰z/EXU=rA@Eā>X@iY%D ]%濦1Fnt`g`HՄ5"qc-۝.׮(]-'?pfot~ ć #iS:±ֲ2!7ep^tbv=c 5q9GG൉c>N[S6yn~u[߃w>iC!A <X@v/`L63ʧZuB@4 @V5v Q/_g^W0Yv}y'zFrCGYoF4nusO%.EUԞsc"v*i2p«xlu[F*\vQx@7gsöfDWQ&nE#+VE&魾qN':x.'箤ͥQo]INڵny\(ɴxnW676:9R+w vx]fi>!$eZCUB푮\U`-gЋ-No*J~H 8qnRg(䢽ܭsSʙP6y:H$U2̞7ELbB02ШR^Utr`SV9_umV-|rԛ>\{i2P[y , Ӂ㸩_ XIstV*2|ysrB1̌?[I7{ż8Dv`;9 2FOLA<ʪr9N&\#QqY,ɬ.~mGVȼ1o5jwaҦumI}1g톲9\ ^^2f zѮ47ڇZ/ћ*`wNx[KWKp \J5ה o0C) i04ՠpBRF]4r&j-i)*2gsG".YE2̯G;Sa>o}mbo:Uh-Y$n|qkW3=s.7qX'y'AhIK^_uN[2TК آ 5سJ=#a^mݸNV=lp̪v|! ٱs$qʵ\ƑGjN炂G O!e]`px}%rEG[0 RRi !;"ʘdQlޯiy隻s~ڛЧLb@d[BV_ߏ|F-UG=&T^aWsZdD:a\k.q<'C͗[ig.{LGlIr'q|O/-`t7U6Vǖ dv2F\ a6m*M!-n VNkd#@8fJDz,~҄pKP-A*CU-S(W$MTwGW C̪٧\%Q8IĮ?6-g{u%Xy?\<`+ؑ].~\/'(X$_H16 ; kw! `%%CE^)R$x$/#[ْ_Z÷(L?T˧-UՊӶW#v ϕGx Q9X4YXW⒧3¯;r|Mx+r#&;3ev,c7~n⸋e$GZo!SaR&)\}u_ vF;sH?wn"_̵c!&-J=[DFl%4ց`AL5. qQiFRxY4 Ủogq%BX+0}PHbڜL 12fRni'BT }z YƇ=ճS N=Qtot3%By=4~v)ٵmV' yj\ U”f "%- ̿t<}iԋjj/3.-^7֤xg-$8;KzJݿDū)8T&VJ?0i] Qޏ}=M>ߴЇjͯR.T j)( I S%6;0%2u8QT,, 2֧6$Y0O_2[`{̀SyVW$YJf^,V px!T-[X[,Hj_n1B:"hG4I~pS/~O( !FdFN$kH};)Ϧ/SVknS ;+XMp5mM~qt7k,_0o}> yY ~WBx} "ZDu(GpozXHquӳ+8V0ׯA~,YageOpC4U͋΢Ui#ʍ9t{csUU.pU8y~qL/-A_6ݛD0Slug59ڋ&r !^, T_tQnn%-w6FRD>|JMX* Ԧsŕ6q;&\z}=;;^ƫ|!xx}G>P9;(GO)nwǶvi g+ג4es4@PE}c|[7/WXْGH 'FݖvRH$4qcO#kǷHfd(."n.TU^x2w3lq)ͺQ aR!٠2g/oMTKtBX 2g=H)5!?5S#{}bzȵB'-0fV~>3oN>w~km KXkt1!Ypb`'gO_ڮjR>0xpB[_֩q=1{M+xz--()Ҩ٥Iڿ8oZ]ދ˶D.l 5x~6'dʐaMZ08locuLmp=KR?bO.Wsp92ipR{=`p8n7_1ܟԝN'Vĸd8y1= / Ǒ.1i Ӿ(̑l5ւ%aWBKҼ@9_Z>8R.RmŴǩ咜2aGjFr[ZI$zp/Ӓ焮Mя\]Op!~s]`k7Wz ѼN+c<\J|z E7ɓj2B &w!'/xe(ƌERb: l"H4B7Szq{Bxe+茷=U \q5ӊNUlMGNTu67$A&pxϋqxDHı<6!?E6qWe"E+ "sw (>=NϭW%%xfgt{&mr̵ą?,IEu(eSK6~niKj0`K/ޘO8/`#*^#cyfra`2Ưl(RiH/yX r"cc,l|_%\;wߨ$7vz^,_Nꪵtșv - X7sRS$OKehKh32ɨtJj"g%X;$DuaU ֍,% zb] [jje瀻zG)YƛMC-دe(|!I&w{Q19XZ}'EarmFVJ@0iMmmGJF1K{:֚fO׳"i!EO?`ubuh*GrB<hoa]pbcKۜ|25o]/rU6@\[x79#YN937=>$c_-%byEAp-Cȇd\3gIwLJ AdsvpN$pƳNl ܼ{NfL$L+^;~Y{G.Î$z4MXVflgވaM UL،;4'-+*#-N14jVݾ+~^}ް>nrRwگ3U#);\]h8)7R-Ց򓀼 r [(J[/R<6cv44#τ _~wm&\xZk+ʂ"+ph? 1(MUC|8/#3t[+:q^)^>u)<3t%:%MLWU>dC^=9ݝ Ι'!]D%q1M%CŮ'Q\+K:iT^HkV7J1/J`mLT(vMUc|N0mr5\&EDb^i1JHDխ+YF1G0 * ; Ha3+I/[{(k0A.AQh Q ;Vfj1 ]y9E#$gF+H7u%U?ĎkG*zO- aI*[GDϋFUq!6>,,7W</ɚx?=mU%G$$k *#Xns)+K5Ӣz;k9zijd؈dj)Hw [mUp5%~P\I rÎl@ʵG  u|Dy(S˺fCs? -WڿoBu"GtE#D4Ü֘#62b 5\@_H|Q6N9#&v">†2,:蠶A7emS8:͏00ܻ/+&ۋ[Hk*6S.o`-ғ25͑펯~ OlB < j/+NpXL?9:HޑE ^y`wK߹<ʸQgBE}Υ_XͤCsM>h9@q̍ln!o*A~>W:nnduerMC!GW`xDp$Epl<53g0 ɘ:ӧZ367SerF8˥sݏ+bPGSĉ"B;5K{%Fj=ѬFo3fckmW&뾺eP(@}H"V:5o'={B@`p4OƋjH=>\,qRe3}o]N*Vޥ\ZJۭieĽ 0)t50ྸDG%0QP gOϒH ' cTv+;7࿸炧~6\UX1 qЈ a*RHL,-R/0b]lKB LA@VMԋ6m> 6P2]%se$H6r]|Hm ezG/o|^_+/19?3F]uVȟ-*{J>H&A}ָXDҹM{&mjzށ`Rv*v12.0WqB= PEJn%+p'RLδɈPEy`A<]m\{ȕ<4OhKOۿb}㑁tbZ5wnt7[i\bu)m T7幇[]^GHc}CpmaBH(]isc ?/2ܹ̌/ 5-MlypqtG*^0WP7MLWzį%sлl>Jhi|TbC=ΈEhD(rUjMF1R>=gYwƕ?# 4/fs֬z~@( @~=2fzb;Dt [ dw!6[-G;Òp]8 v&uk>4svWӠ@i^BAHVjų^Qmtwa\gOY׆?Z)lZˮ}L(C{I ͣQ lI{ZF'nwΌ4L ;tT;;fS7H2`[s`].`2 ^ӭB7Ijd_%|qL=-ՕmSՔ\#->_:{5Cڭw.c8pnm'Y5ƍӳ*[U;"06T$*qCWԾ:#̣J?`#E}n"u)}oWtW]xק3 S%s}5w,@ oӉ)J@ЇyEaRUO쭤CbuKdWE8ƚ^1e/A2cI[dW`5t,LJbBoP+bnFP~>)K ^g`y9eɭ Y24S806>);x.^8kEǗ6=w&_MÒ7/ޞZC8 WV쓁9]*ȗ4RM-JE'0) BWWg_Vrm(h@JE,v/#˧dծWxjBP\{Mr[&jzpL$sNZ %7.~}T/XS,[͢VI}h(Rz e_WG PU.i%0-ЁX~ĵGq5/cJE9VVy\R$}V(uOUg;eЌՄAVZ(~49t|fٻ*mɔ;, ˍ-Mf7 B9%ꞺMK4-ȱ*ϰшb>]xpȇ^~6b6>y_](M,g/g(I^%_fP^  r( 4"d}OBB3Y/lM5i#J[Ik{IER'oeڢ Awq@qo^` ԯW4xna:$ GK' T%UH$wo]~@w 3>Ձa M{04 Ms N!f8,dz[%x"h[N!lwJm0~гXfGY-<*iČ!(N+[C/pcm: 57FqK@_)pU0h<0]Y }re5\oF`2wϮ",50kD("O>N[ji8g]o7zFUhYz})FbnL~g$ ’MD +a1Z1vpfJ7/m˺Xq@f ('1OG7!64߬sc͎]hX4I OC`~R#;.w2M{zGOYl9)5ȣ* y ah6Tuo x! x Z|,&~(:L꠰d/AU3_XRp,bUEtt1KyBX!?q|XR%=YNւȲb̓ms[]g;RGXo>[/dF!ݽ%?kKM0* 5WŐ}zr~f$ 5BQ꺽}z:ZNZ@ ,ud<ɥH4fi_SᨆIaUAq<[.;v)L u^@jDL;6rƏMˎ ]W[uGGu$vW.T8GF\DdkZx@ސu)xw}$G͌j3>kbTe82R+;S |Lk%nkc-!$A"Vvx% sR=C;ΕV/'(fxp~rygkǥ+HI#K`5#^M}n=5abXYx9j4AP  ,!k&ӧXBa@Jo (U%vas.?Pqo.3C GPSȰ}38 \гzs7EƧF_f*:j?m?Do|?W"6R*56' t &C쐎/1!8!OXD=#zgWwfbXJո)E5u6yuJl#\ɮ]gG]cfQZVc-2^nnZ_ZoGq"K{3IgӃ(E@ض*K];'f-ܺ{%$FhLW(CK'ag 1ʺR@o$lT:E% ^x%;ӰrRC=qI]V*-eސ[}* "WL/[ Z&)*RFNtROURՅ(.1853Bא}` [1CNOL 1 2Tx*/urX9OWotY5.̜M#ĚtXOhF>{xÇ ~oW;L2;%58;f;W뺝u1~L*򯺴L}]tJ5{uŋjcIYinrB[$eeIgQ%6F:i> ]Ҽiŵ7.[L{@H9w賢b̘`&P5Z}; 8㡤ՆM]O ntZ7CZEr:rh!@ *k Gimpw @ 7Y|$¸.K1ۋ 0YFG6vsz:퓈 T6 ɍ jG8NCy_2UlP}Z!7b{RER:NGa%D*\G_bCa< 2=diԔLn ;+14Ofvqb"q}U# . "K"1pWWC϶$z #!89j i|&WC\guz"/'x%nTf[:+nÆpvkr76Q 4\v5daH6X}pDCIIg&,HNE>oha$|VУz3_8QpA$4 GH5'u١G-D3AZ:F%0 JJĘgh%lO=)%=# Gx1{+t* #:EB'.{ݿ!(0 \<ƨ`=mb%$Vr=n7NҒ֦&GcEqvd'f G`n@-;-͔ ^2mA4Ȣ?#lKIRJ1ZWc瓮:uHOFعƋzL|L P ڤd 2U||q6Y(CY]x_.x8Afq``Ys,LQCS`) &RB75 z#ǭ9mΣF׽_#_ ƐB ,MdWNeAòfo,oƻD[)~#T0 qH_9[b?VؑD+2TBAČp24X#-E@eRҽe ~M1]l4B"#! ٦z־x81(?\NFGm4Wxul@=A*gZ5O#b&h.;/1F8ņDo[FiGa&.Q*MvZ]^s]u*T"{{Hիǫ=ET{6mlQJDκ /gw;m_IsǾ?#G[2X> stream xڍxTS6ҤW{BI JA:( )J. EEE{}+kw晙y癝o$p!h P cd@A PAqB%#Иc A¢!{$yiI`O V@Dt:EFo/xK]1IѢhO]sԧ*9>=?W99Ȼw>u^bF!KU@hkg#y\<3fb?ـ ׊+l2BGdג.Ժ6PvJΚW,~lʾx@@aii2~pGw*!{ӧ7y"Zb" $oAaq**W'їGr.؉/.x<(䬫rKflA!Zw!ۭ)1.uJXY"^\Z^CׇkiDyř6Bs0sA0Oa,'Kt&.]~j;7=Q=f$ΜMwbzn[Ă \]Җ sl"dEױt -"I*/Ԉ}"*. |aN"y-7m< l ,]u%A.7,Bg ~RU~2{㫈{nmQ%T /RQd+EEbs}+U[[*D :)z-O 3;̆9iem?8V`wԮiiS`8|+{6#Q>~&grA9޽xg.F= 2j]FZU74y+O )~ڢͤ~T[}[N5}IɉA Nzבn #~:ELيtOa0SDC;iy#V˫UoNϡ4ܽe>WgBDO:`_0H;GFI[W<׷jϡ*ssHb 16lpE1DZv xN*j1Ҫ͡WJ)ϕpȇ F6rmT$l{: T:YBńHz HAYTXOx#I P|ia:qES#M  2k+J#[ PN\G+uϧ+XY$R Њ'KZaRIxl^Rq8V x;g-cs/Cm޳p}9:'8_ % '9^ٛhX 4b+NH2!R=SPmJ,;~-bZoT (?zr`Hp:1SU%~ 8yƿD2k߅j~Y6tK`X}e ?1B.|c[gA2`j<#|x!vZ2c{`kEҍؗ"I#)͠2~J ʛ:0 ৮,TͺQ1*?RjMPgݹRG/݌mo>DZ^2kJ:5#kbs5Jߵk}<>j.:X7eia "*[qWv @JS+FJQP zs\*037]&Wjs2J n z wfm8ȁ؊W;/6aa7; < /ͧ HM\C(/M }9/ ݘ~Ի%a*wU߅ j'Y^zӎcpq)'0Zsu)Emf'x^NWi>f(B:-ޭs\~Gox{f;(z>h-?ܴQV\YHd? ~^4ʸ]4|i$v~HTu\L^~/*G[9KBڗT^"f>gb0kjaQ Pܓڦ9& M! Fơ`q0o=[B@M6<ܻhT_=R )_1Vb1=~~ ZN*KZP}֖LTTmy^RZbE5r#dw^-Nke*I=w֨Px&rO>w4;9Sg.d / ,j6xhv>'9TNt7tV {Js+?#v*rjg|z*g=mXa FKjv6eq/΍n&y'}ViEg`>6Z/&MQ:N,٨EϓrT[T1dn0`qj02doH+;>]κ9줯Q^Q0wG#P]uHgKH).8<;Ș(/BS )fdOnfT'Ԧa69DO*eh2#}'3ۨ9d_ (EΟk4*TxBVAC-rm/Xjo<:r[vWYϥ"DeǷ9o&u~YZ1_΍K!_6-nFS3܈&͔A6ka鴈l7EWsTN'A@2eJsv=irvQw׊8:)@}OtG~H񱂾oktW=Yaٌ>2YXn5hZ .K Qi J2zeE[CPi~5^]ǜWwxM;F1xSt.1eRD8O׿1 y]hlL#> stream xڌT%z gng۶mmk mdN9Ik<8sj_ QVc1w4J::102Yl̬pnv(4.֎s}M> v6 '/ /33翆.qks#@ G!bmif4.D.f&7+GF3;5BP[921yzz2ػ2:X <ݬ@We=?(V֮V9Zy;k3뇋9&#Pr:X4wx_&ffN& k; @IRˍ``ㇿJ7HL>+_ f s1G{{+_[>:8z:YX;[E݉I(#% :^fVL%PvKpsqS`nm0ZZ;!Z ~,~dav5b&)EyY%mP[)*e`08ظ<7rT?##>z_  3(:~l3@g9>~>.H_zMcnqT sV[_Dž8XHkWIk/տ6cngTvt003ə~) qQQcx1+F́^Zmۇ ?rrDqD . `xL#.f+Ib0A| G>ſG?#Sb0A4|#|&#&vcQA%bGKf#`fv;'_{?ULCL\aQO $KqK\>Yq(1R;3LJ?GV評2l?OӟPSq?9??9}|9τY#1qt|H* =s׏WG?i?A&7+?&Q?>@?#?G|;<f.-p{K.94v=։{2L She0t?#Al܋lKP =koHV|{5JR=[.:i"%`P>l #K΍sPʫqb}"|@尖Sb!N#V?t")! -ڕw:RpG.JDFA/jKGgׇ4]Xgt>|cY0-Im2]"aJlcS )3>+hiBLXvݼFxStR!Ϩ̒LX,bAKI`[kAF4>npqQAP2(d)8~Ň{Pi8VNz9Xc7BrQj!m Uw{zɫud}+^ #ZzI' ٔh|<aOߒ{fMl~O}&nt83<}LWho[:ԩIǘ<@dt9@Jte<;gpTozTUbkNn>pRk#;fsėo{AJ/M=kclr2X\X\" /JHь|񛉱t| s1mt$+ 9F:EeJv X\N*qfҙ Wz爞:iY_Xf crn3LsvhW ȃ̇aaQ(!4~gPOEn( U9[.l(άӱGQipAg#38GilH?$IL̵n~F͂;P i*%M3V(aK,-ko;SI~^~Ϻ, MT+Nկ ъSHI@o{݋PKflj,qlAy29}m ?- 7NcNK^,,)z ^|#yV߯5NO=HV.9u$D7ԗ~[NX;+5`58DZSl/0J<9^9 8ǘP .On*AU5BX °7٭]:3S ZT oCR .' St CEmQNUJf_w<_ 4QVSAg>Q!#R H(+*FI" s1\-biQJb1:[e @>ݼ؅TyN*h8MWWe)C03$KGr WK7 r&1.L6~?.*:7ޱ2GPWOth=&a m~i?8#~y@UFD-Q~x_3[Ut GaLyNJ#7(vn=)KzcOuˈ( !5:k6|ώ3}=#@){hVQAwP}u~I!mɂ98#4ݎo=@ p, Ar i"x3 BT(~h79h hesk/k,=y گ+"6$>rSf[z ]%C6F/ Qwb,iOZg`dPP$͘.}t41![` mͤ|"4 s[$-3xEPG}PQ"0h`[_ 3vᕷnT gqxߍ ɣ)~ˡR>L9TtCVA2WvuQ&"A`}k坶P4i(vm7>g;9 꾻v`iHT--H' ;:d ) 8AKKP ˱!^վft2xe{ t.k汀|;AR5-\ " h<87; hjÈphSDɜb:*|.[}@(Pty_CfBBF, F&CrT7J2}#-:$ܪ$BiGؤvo*x$H: >vyu^b)dǣ[TVMɠ~ ri*v/suwbO7pƠgdW^"w ;^l1&IC,)%YUjPN=uڟ$9q: T Ϳaj+W* [$ZĒBߴK)?~97(c: @ᦜd5AtL|Ҫ? ͲMIſbs`y{=pT.@1Urλy#pO,z_m$3crOm< V'_2P|AhcX=oǩ2)B_MEF_6֥s6/:wX#k0YHxw0wQPȈv(gR-Czz>YyI0M9 sLR(ǝ{Q'ؘ!Xk&Mcu4J#D$S(܄v#AT`DS5s[0cAe^hTTGU4Iu[lK\dsFj^t"'瞊[A*A/5_ϓf.{5w[UnbJ|3{Om.A-UT!ڻOO1Hhn_@}Z:J_B8&WrSJ4}SWQރi-LAv:`%D7ґe:Xm3Ӿ ]0nsʯ)n_KeSGU w}Ǎ70#Ko)N"^ø]BeObo2KVV57B|SIƫ^;k-θ+,jT .8^h\۳K׏Mj_}|qLlMaAV K&}eIB?ŨV3SJd@q5f*zj<䜳 XDoW toh[tltoykt|߶w>t+nڬj7 ]4aj 1\6=^OK)tFZvL0b\ip݄q"a=E^.zH@`Du-Q2 ֠ M2"C"*,0,J:ޮKRX XiD|/>-'U(Ӫ|/OW[V=0%>S`n3Qn4T CVlc? tr}nqJVkMu& xY|]nK,׽rNJ1%{H._RO7.o-[ԕRM^'PAr{[ };::aߓIR1,ZײQ?kxyCG zy j<7qbcǣ膊K9'ul'_K$ب,u2Kηa><6?$]{-5 w RST%!>]#WF&BT&^WDX#1 bb_jRH]]j^^ IJX8SPQe߰Sd.@X"rdy.(3eC-fte՘Z Ӫ:!YGfBF ??Y䇃`o\x]i>Cɯط3Fo[16Td2v*E>;ae/{vKͤ7('V b`¹}F% urc\vd,k$ZCdU|}΍@7x3=C;#P5rymړR nk(-s0؆hIxo1/I3U%s9!̒ hLѶnѹM8AM[ GQm"'B$4G,\8i(x|eynIߴBq=C00uY~Oap,?83A]\o9R ?W}j}k~ۨzͣߓ5`+ `S&&ȧ2A5("#гaygY{gt=@bYh.S(Hn8<$|>3Hg4S &Wo5:FΛ&1V8zs4S(Ѣ^GAQ`qkq@ЂM0f$)^I*}FHyq!ASo ! fow+ 0v hb$5OJht╆{Z9Jv?R>hܲ¨]Bw)Xޡ(fG3{hg-M¯kD!yyIߨe:"D母Ejۛ=nV#|(*~;h7w/(}&%Sb<:o F SR-d߯ND5 ; 7bRbr%&ܣƙ3x*UG}|Zk&μL ִ۠\./vM5RhM]dfaIyV` %nGŹ]~Ʌ=30s[PdM֭aҧKtrOv vg5}P-m'JZ.^}Bûw)Fս}N/Ku.R`uFr 9ic+1`ڠ(;D%f3Fz?UrB*|ꚕ Iƭ{tˣ7VjҫXN 'del}l/ -Xe39\l8 }4NP Cxx)EŸTrmGC>$lEZU;`wa̾'!1FkVSLۨF Q}›`sbށLk/5<Lgv$6c0/ɌaHk!,HW꧒S5<9E_cb.4z aR+wMj =ȵ{! fRKsC rO%N#n?R} %AVozua.= liƎ%O=HZJKiXL&xw^ƿ^)L ^U KXOMSx?㡲WI?c&;ÉR.Ul%ZvbM 1VQ,8+7ushFfDf֑=@kUwu ۔Ю*po^˃S`$eZj QLUKwZ@=ة%:Eη˟. &?UIu2FYJx։Hs_6Ri"żYnVtv+>FNJ`_|lU0VX XU]-= TcȬۮf A$lۖtlJ\Su?t&g)ТxUZI-!|D=U0;a=ml~ &d@=nCIvK(cՖREQ7SѯMN HremVǥ$TqO?Lym څE:T5XMMD%Xm)2l"BMoҦ\]B\+}E`euhiЈr g@1xh%)}!+|>CV\EEv]Aӆe:]Y K{ [LEP4%-},%bom5٦aZg7A¬x[^(rP=y.9͸ 7go[(6f,.gy1GӾ~Ye@EfD*0 q(F: wBw7%}[og7[{H.Eۃzm.ԗ;@#="ؤht]ԬoAqMOyQ5 N'=qz0[s^={F vlTuli I~;O)sLnE [6GdO>tVSD跾Â9WIIRo8K(1g$fT(4^0ْvW9cN %،+@$[cw(!~RvĨxTtuJF -٤zPB{{xfw<1p'c 9\k;49:}.N!~d*J `$t 8?r՚]ױ~oB2{rJICEӈ)gL.밯!럷pTubx+r0l(ԐeW*WHCUA(]|Xi'FhX8 }(4awUxuylL zBG}6` m "bJp6y5{N^4xmo0cwĂ溇dR-[wy ir@x]Czv/A(;^t"ɿQQnpF'Í|&Dez8#jBUվ?Nvq~Q=]];sIu'L ݓ>n_$IRfRL”߄}c&%Ks}!V]E^M*W,@a#įk{ zAPKbƸJ㸫  <@}dCcxmi\xu.pkǁN.#lKR#>$K1KIbO4 s|iWL/1vg^<}_㐆`\XL; ;Zvi>>$õdpD! :S+\ w&#feL"$!Ǹf.lJ5M]̄p\/(\,EXȟdt~yYh)NiuSkWQ[!ݪt;~"Ζ*RU7'ɂ(Fڈ ͘X<o^8s=y̕BI^ xY_TS}Ba6=iIMhn!2E`ESo';,] O,-2|dPOGU՛ lV c+K7KmP <(P>HiSQܤ]ϏGJ Ts5}y $Hfun⸋VpfhM^tɕú%ox$UfWlJ1AKbCdSfd=.4 1D TX/ypd U[NqdSe=JDt59?=޳xn9s;P~&GqV S i/{d)R[cHwq,LVF^|e.L-C#24`unRŪE4k,l ,L~rgf /ZQ_?&I8Bm- QK|Zodp5㇖sLh='OcsT;W,CByi .fcmR}X;,>gGn{Bg WZ  ipYR `/RܮbĘ#kt}C1t/IVҔA,n n3Q<]{{2iF] 7,Hޅ/66Ї +!WUjx뗘F)ypc"Q#~Xǡ%lZD n뎘>+m?YhoS}=f98W,1Yr\G;f>.g%r՚LWRQ3LCFI^ lPk34Si]'&Yٲq>^i;'zXvz<]˚W!D,g"U~FbߵFѨRg@I!)bߨtoH@t.vThca m4)3Л|R~K~2kCo*`cp)'QcaǶsX*QmLLq .Q~Tսl}cˏGPkx`eg~i)!5CC$0 c;;#hp;Oӷ2!Rzf "=͡Y}FP*ѕV agJMEsDBRygݘ<(yx_\% T8x]lr(wگv! 3P("G34Kv@+JiJC(71E>̧G9-re>j A `g\ˤMp-V، ?_89\FRܺ0*g>ewCm+Y?QwbEˉ2i%Zӝ$eI3>3mp\bK<*GPۡB q~  -"xٴ`vzaT=~Ji\\ZGfK$".*o ZVHM? xkW!hXUʙ l, RAUj&U #7Diu0&[^j29o߹\@@RbRQC~fn0lӊ5 \;,Yp~CW? S['ժG;%!4=ЧSG YYsp[MEyR({cMzbSKcr抢z' oXQjX(m,j>d&RndD8&$fxW;_G0qς/tHd,FPڛiJk曝k6?CǴ2dSa*Y?:şfļ%R ?yE lsNba։,N#C& hPm!9yRx%bƭxi/)~ݠ FyF ƒ;2ѩ!#Vr#sn𩋡2{JqeU``ˠ3>\6A!!P, ?h<VbJ1gجa-Ybi.Aw{+bhQXYaN55ۦ|[H$gXߛGͦGvrf zyKWآT˻Th7 39 y1Ozݎb`-~2>ƑVvwH.]H rDX+/鐑 ܪMeV=Fs 8z0Ru05z/G8d~6h{AMLL`tx󺈵 %(ܟEĕ֑LTpԗbmHk=F.ª K>!ĐV~[ǃRvc`mL{B8MMPq1_,ͦܲ$@imM dckU+,c޾޻'[%ʁP@BīF7 舴xjdVeE턭c9k33J`5''#R+;WOĘL,2pרW~ҽ4uk't`KИ 6 ᕟ,?4jd_$-As7ZgPERnG̕%TE?/J|,N5, ;ߪO[  BW@_E@㳏(,9Hz'7HСf${v9T QՋ^-: jΚ8 JY=yS.WWsYEI{_|WHҕ ZiE Ӽվh?M-~N ˸)w>p&jӭ>\JΙO\rxhGwVcain?6S#`.=x9Y\'a}' ȵlz<=9zQVOs;f pc00fM**4 [s$RTB m#с=m16Lee6ؤ8мٚpYqPׅGv)0(6?18i>t,3 @_C`{!27' ZFok~(7+Uk%DG+ek% C[wqVp] 8sn&, "\eU[~A1/ Ljbw<@Z^/S[s8]Û}EEYՁ bbjF/%D3k Rj? dளySl^v%-,w8fZTX+'{۝[&6ep-9z;{6z|w?v(~l 1;>u >gU='zFo:_<4غ$ 2'5?@RW-3h3DBwž)/Ϣ]KCB[Q6&gj,A읙oh t/陘4 [0:"`&Pr ɺ$M <@ CⴼYqŚ "@E>'Q`R68BD[8jH>ɉrb  ]05a YS/{UϿcaM C2HY>P5ۀl.Y/}~ !0':P ?( **ifv^>7X֑;?c gŲY$5Rk&Ȟ' s.lLD2%~lE=鴣-GWoVy& ("+ܖڎ -j>97%$/25|AӫwQ*i@s [R;xtWε)KdG_czFܧQ(3X | mVa~c (#fDڃi"Gvc.eiX(ELMcZ0*t.o󸄡A׃.28 ixA0!6QOE>mId Ag$4]=}'_ul5?ٻ,=e=_q" |ŋg\0཈z}pQj##DczV0Mξ&T)G:/$Tub5h(c>5G6$'Z/bRżITL]W,AkO=mo4ȱ ^?&Yrq|՗VTp30x)fG|Kj1iAc0Sp;]_ur2yL7i<5`QqbVo,~Yxm "od_uܵ1op:hfDA!0wPmqɇ{GJdxiͧC4);jU ʛލ FE<+ sy{jmSUBx[5~ V[nRx2 Efhesą *M1vendstream endobj 137 0 obj << /Type /XRef /Length 164 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 100 0 R /Root 99 0 R /Size 138 /ID [<293a41f7c561686ecb8978c0766c3757>] >> stream xcb&F~0 $8JT 3d%W < "A$k8d X,[ L@ D2ǁH@5,"Y$&md"WH' T"eLHf) "6\q_F_ endstream endobj startxref 212743 %%EOF mutoss/vignettes/simToolManual.Rnw0000644000176200001440000000033214404061507017067 0ustar liggesusers% \VignetteIndexEntry{MuToss Simulation Tool Guide} \documentclass[a4paper]{article} \usepackage{hyperref} \usepackage{pdfpages} \begin{document} \includepdf[fitpaper=true,pages=-]{simToolVignette.pdf} \end{document} mutoss/vignettes/index.html0000644000176200001440000000235114404061507015613 0ustar liggesusers

The mutoss package and accompanying mutossGUI package are designed to ease the application and comparison of multiple hypothesis testing procedures. The GUI is called with the mutossGUI( )

function. Once invoked, the analysis starts by inserting either p-values or raw data and specifying the type of analysis and error control type wanted. The results can be visualized in the GUI or exported as R objects for further analysis- possibly with the accompanying compareMutoss( ) functions.


More information available in the Quick Start Guide.

mutoss/vignettes/quickstart.Rnw0000644000176200001440000002023414404061507016500 0ustar liggesusers\documentclass[english]{article} \usepackage[T1]{fontenc} \usepackage[latin9]{inputenc} \usepackage{calc} \usepackage{babel} \usepackage{hyperref} \usepackage{url} \begin{document} % \VignetteIndexEntry{MuToss Quick Start Guide} \title{$\mu$TOSS Quick Start Guide} \author{\scriptsize {Gilles Blanchard}, % \url{gilles.blanchard@wias-berlin.de} \scriptsize Weierstrass Institute for Applied Analysis and Stochastics Berlin \and \scriptsize {Thorsten Dickhaus}, % \url{dickhaus@math.hu-berlin.de} \scriptsize Humboldt-University Berlin \and \scriptsize {Niklas Hack}, % \url{niklas.hack@meduniwien.ac.at} \scriptsize Medical University of Vienna \and \scriptsize {Frank Konietschke}, % \url{Frank.Konietschke@medizin.uni-goettingen.de} \scriptsize Georg-August-University G\"ottingen \and \scriptsize {Kornelius Rohmeyer}, % \url{rohmeyer@biostat.uni-hannover.de} \scriptsize Leibniz University Hannover \and \scriptsize {Jonathan Rosenblatt}, % \url{john.ros@gmail.com} \scriptsize Tel Aviv University \and \scriptsize {Marsel Scheer}, % \url{mscheer@ddz.uni-duesseldorf.de} \scriptsize German Diabetes Center \and \scriptsize {Wiebke Werft}, % \url{w.werft@Dkfz-Heidelberg.de} \scriptsize German Cancer Research Center } \maketitle \begin{abstract} $\mu$TOSS is an \verb=R= package providing an open source, easy-to-extend platform for multiple hypothesis testing (MHT), one of the most active research fields in statistics over the last 10-15 years. Its first motivation is to establish a common platform and standardization for MHT procedures at large. The $\mu$TOSS software has been designed and written in the framework of a ``Harvest Programme'' call of the PASCAL2 European research network. Basically, it consists of the two R packages \verb=mutoss= and \verb=mutossGUI=. For researchers, it features a convenient unification of interfaces for MHT procedures (including standardized functions to access existing specific MHT \verb=R= packages such as \verb=multtest= and \verb=multcomp=, as well as recent MHT procedures that are not available elsewhere) and helper functions facilitating the setup of benchmark simulations for comparison of competing methods. For end users, a graphical user interface and an online user's guide for finding appropriate methods for a given specification of the multiple testing problem is included. Ongoing maintenance and subsequent extensions will aim at establishing $\mu$TOSS as a state of the art in statistical computing for MHT. \end{abstract} \section{Introduction} The $\mu$TOSS packages allow the user to discover, apply and compare multiple testing procedure and multiple interval estimation procedures. The $\mu$TOSS packages include a corpus of functions implementing and integrating these procedures and a GUI. These are found in the mutoss and mutossGUI packages respectively. \section{$\mu$TOSS Rationale} The rationale behind the $\mu$TOSS packages is two-fold. It is aimed at allowing statisticians to discover, apply and compare standard and custom multiplicity controlling procedures. This is achieved by the mutoss package. It is also aimed at the researcher wishing to Analise new data or reproduce published results. This is accomplished by the mutossGUI package. % \framebox{\begin{minipage}[t]{1\columnwidth}% At the time of release, the package has only undergone basic testing. This being the case, we recommend new data to be analyzed with standard software alongside $\mu$TOSS. This is planned to change in future releases.% \end{minipage}} \section{System Requirements} \subsection{mutoss Package} The package will run on any machine running R with recommended version 2.8 and above. \subsection{mutossGUI package} On top of the mutoss package requirements, Java Run time Environment ver 5 and above is needed. \section{GUI Work flow} Download and install the \textit{mutossGUI} package. The GUI should start automatically. Others wise load it with \texttt{>mutossGUI()} \subsection{Testing of Hypotheses} If you have already a vector of p-values start at step (5). \begin{enumerate} \item Load the raw data (assumed to be a \textit{data.frame} object) using the \textbf{Data} button. \item Specify the model type and explanatory variables using the \textbf{Model} button.\\ For linear contrasts choose \textbf{Single endpoint in k groups}.\\ For applying the same model to many response variables choose \textbf{Multiple (linear) regression.} \item Define model by choosing response and expalnatory variables. \item Define the hypotheses of interest by specifying the contrasts using the \textbf{Hypotheses} button. \item Insert p-values using the \textbf{p-Value} button or calculate them following the previous steps. \item Choose the error type to control using the \textbf{Error Rate} button. \item Use the \textbf{Adjusted p-Values} to calculate the procedure specific adjusted p-values (you will be propted for additional options when necesary) or choose \textbf{Rejeted} to apply the procedure and reject hypotheses. \item Visualize results by choosing the \textbf{Info} option in the \textbf{Adjusted p-Values} or \textbf{Rejected} buttons. \item Save the output as an R object using the \textbf{File->Export MuToss Object to R} option. \end{enumerate} Further analysis is now possible using the compareMutoss functions or other R functionality. \subsection{Interval Estimations} Steps 1-4 are identical to the hypothesis testing work flow. \begin{enumerate} \item Load the raw data (assumed to be a \textit{data.frame} object) using the \textbf{Data} button. \item Specify the model type and explanatory variables using the \textbf{Model} button.\\ For linear contrasts choose \textbf{Single endpoint in k groups}.\\ For applying the same model to many response variables choose \textbf{Multiple (linear) regression.} \item Define model by choosing response and expalnatory variables. \item Define the contrasts of interest by specifying the contrasts using the \textbf{Hypotheses} button. \item Choose the error type to control using the \textbf{Error Rate} button. \item Use the \textbf{Confidence Intervals }to compute confidence intervals on parameters of interest. \item Visualize results by choosing the \textbf{Info} option in the \textbf{Confidence Intervals} button. \item Save the output as an R object using the \textbf{File->Export MuToss Object to R} option. \end{enumerate} Further analysis is now possible using R functionality. \section{Command Line Work Flow} Download and install the \textit{mutoss} package to access the different procedures in the package (note mutossGUI is not needed for this purpose). A list can presented using\\ \texttt{>help(package='mutoss')} To work with these elementary functions, just use them as any other R function. Seee inline help for further details. To use these functions to read and write into Mutoss S4 class objects use the \textit{mutoss.apply( )} function. See the inline help of the function for further details. \section{Glossary} \begin{description} \item [{Hypotheses-Testing-Procedures}] The corpus of procedures for testing multiple statistical hypotheses. \item [{Interval-Estimating-Procedures}] The corpus of procedures for constructing interval estimates for multiple parameters. \item [{p-Value-Procedures}] The corpus of (multiple) hypotheses testing procedures which rely on the marginal p-values of each hypothesis (and do not require the original data and model). This procedures might possibly require additional information such as logical relations between procedures, a qualitative description of the probabilistic relation between test statistics etc. \item [{Data-Procedures}] The corpus of (multiple) testing procedures which require the original response variables, the explanatory variables (model) and the parameters of interest (contrasts). \\ These procedures can be seen as p-value-procedures with a specific relation between test-statistics which is derived from the model and the contrasts. \item [{Error-Type}] The type of error a procedure aims to control. This can be a hypothesis testing error rate (FWER. FDR,...) or an interval estimation error rate (simultanous coverage, false coverage rate,...). \item [{Error-Rate}] The allowed rate of the \textit{Error Type}. \end{description} \end{document} mutoss/NEWS0000644000176200001440000000206014404104420012272 0ustar liggesusersVersion 0.1-13 ============== - ranktruncated warns for large numbers of p-values. (Thanks to Phillip Bredahl Mogensen for notification!) - noted that adaptiveBH is not equivalent to multcomp's ABH. (Thanks to David Swanepoel for notification!) Version 0.1-12 ============== - changed description according to CRAN policy Version 0.1-11 ============== - fixed CRAN notes and warnings - switched from RUnit to testthat Version 0.1-10 ============== - compatibility with qvalue 1.99.0 Version 0.1-9 ============= - compatibility to qvalue 1.43.0 Version 0.1-8 ============= - moving many packages from DEPENDS to IMPORTS - fixed layout in examples - fixed various warnings Version 0.1-7 ============= - corrections in the Hommel documentation - package multtest is a dependency Version 0.1-6 ============= - simulation Tool: Objects returned by simulation() use less memory and generated data can be discarded. Version 0.1-5 ============= - jointCDF.orderedUnif which was only a helper function is now exported Version 0.1-4 ============= - Bug fix in ABH_pi0_estmutoss/R/0000755000176200001440000000000014404061507012006 5ustar liggesusersmutoss/R/SNK.R0000644000176200001440000001247414404061507012574 0ustar liggesusers# Student - Newman - Keuls Test # # Author: FrankKonietschke ############################################################################### snk <- function(formula,data,alpha, MSE=NULL, df=NULL, silent = FALSE){ dat <- model.frame(formula, data) if (ncol(dat) != 2) { stop("Specify one response and only one class variable in the formula") } if (is.numeric(dat[, 1]) == FALSE) { stop("Response variable must be numeric") } response <- dat[, 1] group <- as.factor(dat[, 2]) fl <- levels(group) a <-nlevels(group) N <- length(response) samples <- split(response,group) n <- sapply(samples,"length") mm <- sapply(samples,"mean") vv <- sapply(samples,"var") if (is.null(MSE)){ MSE <- sum((n-1)*vv)/(N-a) } if (is.null(df)){ df <- N-a } nc <- a*(a-1)/2 order.h1 <- data.frame(Sample=fl, Size=n, Means=mm,Variance=vv) ordered <- order.h1[order(order.h1$Means,decreasing=FALSE), ] rownames(ordered) <- 1:a #---------------- Compute helping indices ----------# i <- 1:(a-1) h1 <- list() for(s in 1:(a-1)){ h1[[s]]<- i[1:s] } vi <- unlist(h1) j <- a:2 h2 <-list() for (s in 1:(a-1)){ h2[[s]] <- j[s:1] } vj <- unlist(h2) h3 <- list() h4 <- list() for (s in 1:(a-1)){ h3[[s]] <- rep(j[s],s) h4[[s]] <- rep(i[s],s) } Nmean <- unlist(h3) Step <- unlist(h4) #--------Compute the Mean Differences---------# mean.difference <- sapply(1:nc,function(arg){ i <- vi[arg] j <- vj[arg] (ordered$Means[j]-ordered$Means[i]) }) mean.difference <- round(mean.difference, 4) # ------- Compute the test statistics --------# T <- sapply(1:nc,function(arg){ i<-vi[arg] j<-vj[arg] (ordered$Means[j]-ordered$Means[i])/sqrt(MSE/2*(1/ordered$Size[i] + 1/ordered$Size[j])) }) T <- round(T, 4) # ----- Compute now the critical value -----# quantiles <- qtukey(1-alpha,Nmean,df) pvalues <- ptukey(T,Nmean,df,lower.tail=FALSE) #---- Calculate the rejected Hypotheses ------# Rejected1 <- (pvalues=vj) Under2 <- (vi[s]<=vi) Under3 <- Under1 * Under2 Under4 <- which(Under3==1) Rejected1[Under4] <- FALSE } } #-----Prepare the pValues for the Output----# Out1 <- (pvalues < alpha) Out2 <- (Rejected1 == FALSE) Out3 <- Out1 * Out2 Out4 <- (Out3 == 1) pvalues <- round(pvalues,4) pvalues[Out4] <- paste(">",alpha) variances.output <- data.frame(Overall=MSE, df=df) Comparison <- data.frame(Comparison=names.ordered,Diff=mean.difference, Statistic=T, Adj.P=pvalues, Rejected=Rejected1, Layer = Step) if (! silent) { cat("#----Student-Newman-Keuls (1927; 1939; 1952) rejective Multiple Test Procedure \n\n") cat("#----Attention: The SNK test controls the FWER only in the WEAK sense \n\n") } result <- list(Ordered.Means = ordered, Variances=variances.output, SNK = Comparison) return(result) } snk.wrapper <- function(model, data, alpha, silent=FALSE) { result <- snk(formula=formula(model), data, alpha = alpha) difference <- result$SNK$Diff#, result$SNK$Statistic, result$SNK$Layer) diffm<-cbind(difference,rep(NA,length(difference)),rep(NA,length(difference))) diffm<-matrix(diffm,nrow=length(difference)) rownames(diffm)<-result$SNK$Comparison return(list(adjPValues=result$SNK$Adj.P,rejected=result$SNK$Rejected,statistics=result$SNK$Statistic, confIntervals= diffm,errorControl = new(Class='ErrorControl',type="FWER",alpha=alpha))) } mutoss.snk <- function() { return(new(Class="MutossMethod", label="Student-Newman-Keuls Test", errorControl="FWER.weak", callFunction="snk.wrapper", output=c("adjPValues", "rejected", "confIntervals", "errorControl"), info="

Student - Newman - Keuls rejective test procedure.\ The procedure controls the FWER in the WEAK sense.

\n\n\

The Newman-Keuls procedure is based on a stepwise or \ layer approach to significance testing. Sample means are \ ordered from the smallest to the largest. The largest \ difference, which involves means that are r = p steps apart, \ is tested first at alpha level of significance; if significant, \ means that are r = p - 1 steps apart are tested at \alpha level \ of significance and so on.\

\n\

Reference:

\
    \
  • Keuls M (1952). \" The use of the studentized range in \ connection with an analysis of variance \" Euphytica 1 37, 112-122.
  • \n\
", parameters=list( data=list(type="data.frame"), model=list(type="ANY"), alpha=list(type="numeric") ) )) } mutoss/R/fisher.R0000644000176200001440000001164514404061507013420 0ustar liggesusers############# # Fisher 23 # ############# fisher23.model <- function() { return(list(model=list(typ="Fisher 2-by-3"))) } mutoss.fisher23.model <- function() { return(new(Class="MutossMethod", label="Fisher's exact test in (2x3) tables", callFunction="fisher23.model", output=c("model"), info="

(Marginal) Fisher's exact test in (2x3) tables

Reference:

  • Fisher, R. A. (1922). \"On the interpretation of Chi^2 from contingency tables, and the calculation of P.\" Journal of the Royal Statistical Society, 85 (1):87-94.
", parameters=list( ) )) } fisher23.marginal <- function(data, model) { #m <- dim(data)[3] #result <- vector(mode="numeric",length=m) result <- apply(data, 3, function(x) {fisher23_fast(x,2.0e-16)$rand_p} ) return(list(pValues=result)) } fisher23_fast <- function(obs, epsilon){ # obs = observations = a 2x3 table #build marginals = (n1., n2., n.1, n.2, n.3) marginals <- c(sum(obs[1, ]), sum(obs[2, ]), sum(obs[, 1]), sum(obs[, 2]), sum(obs[, 3])) n <- sum(marginals) / 2 x <- array(data=rep.int(0.0, 2*3*max(marginals)*max(marginals)), c(2, 3, max(marginals)*max(marginals))) #build log nominator statistic log_nom <- sum(log(gamma(marginals+1))) - log(gamma(n+1)) #build log denominator statistic log_denom <- sum(log(gamma(obs+1))) #compute probability of observed table prob_table <- exp(log_nom - log_denom) nonrand_p <- 0.0 rand_count <- 0 dim1 <- min(marginals[1], marginals[3]) #traverse all possible tables with given marginals counter <- 0 for (k in 0:dim1) { for (l in max(0,marginals[1]-marginals[5]-k):min(marginals[1]-k, marginals[4])) { counter <- counter+1 x[1, 1, counter] <- k x[1, 2, counter] <- l x[1, 3, counter] <- marginals[1] - x[1, 1, counter] - x[1, 2, counter] x[2, 1, counter] <- marginals[3] - x[1, 1, counter] x[2, 2, counter] <- marginals[4] - x[1, 2, counter] x[2, 3, counter] <- marginals[5] - x[1, 3, counter] } } log_denom_iter <- rep.int(0.0, times=counter) for (k in 1:counter) { log_denom_iter[k] <- sum(log(gamma(x[, , k]+1))) } prob_lauf <- exp(log_nom - log_denom_iter) nonrand_p <- sum(prob_lauf[prob_lauf <= prob_table]) rand_count <- sum(abs(exp(prob_lauf) - exp(prob_table)) < epsilon) u <- runif(1) rand_p <- max(0.0, nonrand_p - u*rand_count*prob_table) return(list(nonrand_p=nonrand_p, rand_p=rand_p, prob_table=prob_table)) } ############# # Fisher 22 # ############# fisher22.model <- function() { return(list(model=list(typ="Fisher 2-by-2"))) } mutoss.fisher22.model <- function() { return(new(Class="MutossMethod", label="Fisher's exact test in (2x2) tables", callFunction="fisher22.model", output=c("model"), info="

(Marginal) Fisher's exact test in (2x2) tables

Reference:

  • Fisher, R. A. (1922). \"On the interpretation of Chi^2 from contingency tables, and the calculation of P.\" Journal of the Royal Statistical Society, 85 (1):87-94.
", parameters=list( ) )) } fisher22.marginal <- function(data, model) { #m <- dim(data)[3] #result <- vector(mode="numeric",length=m) result <- apply(data, 3, function(x) {fisher22_fast(x,2.0e-16)$rand_p} ) return(list(pValues=result)) } fisher22_fast <- function(obs, epsilon){ # obs = observations = a 2x2 table #build marginals = (n1., n2., n.1, n.2) marginals <- c(sum(obs[1, ]), sum(obs[2, ]), sum(obs[, 1]), sum(obs[, 2])) n <- sum(obs) x <- array(data=rep.int(0.0, 2*2*max(marginals)*max(marginals)), c(2, 2, max(marginals)*max(marginals))) #build log nominator statistic log_nom <- sum(log(gamma(marginals+1))) - log(gamma(n+1)) #build log denominator statistic log_denom <- sum(log(gamma(obs+1))) #compute probability of observed table prob_table <- exp(log_nom - log_denom) nonrand_p <- 0.0 rand_count <- 0 dim1 <- min(marginals[1], marginals[3]) #traverse all possible tables with given marginals counter <- 0 for (k in (marginals[1]-marginals[4]):dim1) { counter <- counter+1 x[1, 1, counter] <- k x[1, 2, counter] <- marginals[1] - k x[2, 1, counter] <- marginals[3] - k x[2, 2, counter] <- marginals[2] - x[2, 1, counter] } log_denom_iter <- rep.int(0.0, times=counter) for (k in 1:counter) { log_denom_iter[k] <- sum(log(gamma(x[, , k]+1))) } prob_lauf <- exp(log_nom - log_denom_iter) nonrand_p <- sum(prob_lauf[prob_lauf <= prob_table]) rand_count <- sum(abs(exp(prob_lauf) - exp(prob_table)) < epsilon) u <- runif(1) rand_p <- max(0.0, nonrand_p - u*rand_count*prob_table) return(list(nonrand_p=nonrand_p, rand_p=rand_p, prob_table=prob_table)) } mutoss/R/nparcomp1.R0000644000176200001440000007520214404061507014037 0ustar liggesusers# Simultaneous confidence intervals for relative contrast effects # # Author: FrankKonietschke ############################################################################### nparcomp <- function (formula, data, type = c("UserDefined", "Tukey", "Dunnett", "Sequen", "Williams", "Changepoint", "AVE", "McDermott", "Marcus","UmbrellaWilliams"), control = NULL, conflevel = 0.95, alternative = c("two.sided", "less", "greater"), rounds = 3, correlation = FALSE, asy.method = c("logit", "probit", "normal", "mult.t"), plot.simci = FALSE, info = TRUE, contrastMatrix = NULL) { corr.mat <- function(m, nc) { rho <- matrix(c(0), ncol = nc, nrow = nc) for (i in 1:nc) { for (j in 1:nc) { rho[i, j] <- m[i, j]/sqrt(m[i, i] * m[j, j]) } } return(rho) } ssq <- function(x) { sum(x * x) } logit <- function(p) { log(p/(1 - p)) } probit <- function(p) { qnorm(p) } expit <- function(G) { exp(G)/(1 + exp(G)) } index <- function(char, test) { nc <- length(char) for (i in 1:nc) { if (char[i] == test) { return(i) } } } z.quantile <- function(conflevel = conflevel, corr, a, df = df.sw, dbs) { if (dbs == "n") { if (a == "two.sided") { z <- qmvnorm(conflevel, corr = corr, tail = "both")$quantile } if (a == "less" || a == "greater") { z <- qmvnorm(conflevel, corr = corr, tail = "lower")$quantile } } if (dbs == "t") { if (a == "two.sided") { z <- qmvt(conflevel, df = df.sw, interval = c(-10, 10), corr = corr, tail = "both")$quantile } if (a == "less" || a == "greater") { z <- qmvt(conflevel, df = df.sw, interval = c(-10, 10), corr = corr, tail = "lower")$quantile } } return(z) } if (conflevel >= 1 || conflevel <= 0) { stop("The confidence level must be between 0 and 1!") if (is.null(alternative)) { stop("Please declare the alternative! (two.sided, less, greater)") } } type <- match.arg(type) alternative <- match.arg(alternative) asy.method <- match.arg(asy.method) if (length(formula) != 3) { stop("You can only analyse one-way layouts!") } dat <- model.frame(formula, data) if (ncol(dat) != 2) { stop("Specify one response and only one class variable in the formula") } if (is.numeric(dat[, 1]) == FALSE) { stop("Response variable must be numeric") } response <- dat[, 1] factorx <- as.factor(dat[, 2]) fl <- levels(factorx) a <- nlevels(factorx) if (a <= 2) { stop("You want to perform a two-sample test. Please use the function npar.t.test") } samples <- split(response, factorx) n <- sapply(samples, length) if (any(n <= 1)) { warn <- paste("The factor level", fl[n <= 1], "has got only one observation!") stop(warn) } ntotal <- sum(n) a <- length(n) tmp <- expand.grid(1:a, 1:a) ind <- tmp[[1]] > tmp[[2]] vi <- tmp[[2]][ind] vj <- tmp[[1]][ind] nc <- length(vi) gn <- n[vi] + n[vj] intRanks <- lapply(samples, rank) pairRanks <- lapply(1:nc, function(arg) { rank(c(samples[[vi[arg]]], samples[[vj[arg]]])) }) pd <- sapply(1:nc, function(arg) { i <- vi[arg] j <- vj[arg] (sum(pairRanks[[arg]][(n[i] + 1):gn[arg]])/n[j] - (n[j] + 1)/2)/n[i] }) dij <- dji <- list(0) sqij <- sapply(1:nc, function(arg) { i <- vi[arg] j <- vj[arg] pr <- pairRanks[[arg]][(n[i] + 1):gn[arg]] dij[[arg]] <<- pr - sum(pr)/n[j] - intRanks[[j]] + (n[j] + 1)/2 ssq(dij[[arg]])/(n[i] * n[i] * (n[j] - 1)) }) sqji <- sapply(1:nc, function(arg) { i <- vi[arg] j <- vj[arg] pr <- pairRanks[[arg]][1:n[i]] dji[[arg]] <<- pr - sum(pr)/n[i] - intRanks[[i]] + (n[i] + 1)/2 ssq(dji[[arg]])/(n[j] * n[j] * (n[i] - 1)) }) vd.bf <- ntotal * (sqij/n[vj] + sqji/n[vi]) singular.bf <- (vd.bf == 0) vd.bf[singular.bf] <- 1e-05 df.sw <- (n[vi] * sqij + n[vj] * sqji)^2/((n[vi] * sqij)^2/(n[vj] - 1) + (n[vj] * sqji)^2/(n[vi] - 1)) lambda <- sqrt(n[vi]/(gn + 1)) cov.bf1 <- diag(nc) rho.bf <- diag(nc) for (x in 1:(nc - 1)) { for (y in (x + 1):nc) { i <- vi[x] j <- vj[x] v <- vi[y] w <- vj[y] p <- c(i == v, j == w, i == w, j == v) if (sum(p) == 1) { cl <- list(function() (t(dji[[x]]) %*% dji[[y]])/(n[j] * n[w] * n[i] * (n[i] - 1)), function() (t(dij[[x]]) %*% dij[[y]])/(n[i] * n[v] * n[j] * (n[j] - 1)), function() -(t(dji[[x]]) %*% dij[[y]])/(n[v] * n[j] * n[i] * (n[i] - 1)), function() -(t(dij[[x]]) %*% dji[[y]])/(n[i] * n[w] * n[j] * (n[j] - 1))) case <- (1:4)[p] rho.bf[x, y] <- rho.bf[y, x] <- sqrt(ntotal * ntotal)/sqrt(vd.bf[x] * vd.bf[y]) * cl[[case]]() cov.bf1[x, y] <- cov.bf1[y, x] <- sqrt(vd.bf[x] * vd.bf[y]) } } } V <- (cov.bf1 + diag(vd.bf - 1)) * rho.bf cov.bf1 <- cbind(V,-1*V) cov.bf2<-cbind(-1*V,V) cov.bf <- rbind(cov.bf1,cov.bf2) switch(type, UserDefined = { if (is.null(contrastMatrix)){stop("Give a contrast matrix with the contrast.matrix = <> option or choose a contrast!")} if (is.null(control)) { nc <- nrow(contrastMatrix) weights.help <- weightMatrix(n, contrast.matrix = contrastMatrix) weight<-weights.help$weight.matrix weight.help <- weights.help$weight.help cmpid <- paste("C", 1:nc) type.of.contrast <- "User Defined" } else { stop("Please declare the control group via your contrast matrix!") } type.of.contrast <- "User Defined" }, Tukey = { if (is.null(control)) { if (alternative!="two.sided"){stop("The Tukey contrast can only be tested two-sided!")} nc <- a * (a - 1)/2 cmpid <- sapply(1:nc, function(arg) { i <- vi[arg] j <- vj[arg] paste("p", "(", fl[i], ",", fl[j], ")", sep = "") }) weights.help <- weightMatrix(n, "Tukey") weight<-weights.help$weight.matrix weight.help <- weights.help$weight.help } else { stop("The Tukey contrast hasn't got a control group!") } type.of.contrast <- "Tukey" }, Dunnett = { nc <- a - 1 if (is.null(control)) { cont <- 1 } else { if (!any(fl == control)) { stop("The dataset doesn't contain this control group!") } cont <- which(fl == control) } vj <- which((1:a) != cont) vi <- rep(cont, a - 1) weights.help <- weightMatrix(n, "Dunnett",cont) weight<-weights.help$weight.matrix weight.help <- weights.help$weight.help cmpid <- sapply(1:nc, function(arg) { i <- vi[arg] j <- vj[arg] paste("p", "(", fl[i], ",", fl[j], ")", sep = "") }) type.of.contrast <- "Dunnett" }, Sequen = { if (is.null(control)) { nc <- a - 1 vi <- 1:(a - 1) vj <- 2:a weights.help <- weightMatrix(n, "Sequen") weight<-weights.help$weight.matrix weight.help <- weights.help$weight.help cmpid <- sapply(1:nc, function(arg) { i <- vj[arg] j <- vi[arg] paste("p", "(", fl[j], ",", fl[i], ")", sep = "") }) type.of.contrast <- "Sequen" } else { stop("The Sequen-Contrast hasn't got a control group!") } }, Williams = { if (is.null(control)) { nc <- a - 1 weights.help <- weightMatrix(n, "Williams") weight<-weights.help$weight.matrix weight.help <- weights.help$weight.help cmpid <- paste("C", 1:(a - 1)) type.of.contrast <- "Williams" } else { stop("The Williams contrast hasn't got a control group!") } }, Changepoint = { if (is.null(control)) { nc <- a - 1 weights.help <- weightMatrix(n, "Changepoint") weight<-weights.help$weight.matrix weight.help <- weights.help$weight.help cmpid <- paste("C", 1:(a - 1)) type.of.contrast <- "Changepoint" } else { stop("The Changepoint-Contrast hasn't got a control group!") } }, AVE = { if (is.null(control)) { nc <- a weights.help <- weightMatrix(n, "AVE") weight<-weights.help$weight.matrix weight.help <- weights.help$weight.help cmpid <- paste("C", 1:a) type.of.contrast <- "Average" } else { stop("The Average-Contrast hasn't got a control group!") } }, McDermott = { if (is.null(control)) { nc <- a - 1 weights.help <- weightMatrix(n, "McDermott") weight<-weights.help$weight.matrix weight.help <- weights.help$weight.help cmpid <- paste("C", 1:(a - 1)) type.of.contrast <- "McDermott" } else { stop("The McDermott-Contrast hasn't got a control group!") } }, UmbrellaWilliams = { if (is.null(control)) { nc <- a * (a - 1)/2 weights.help <- weightMatrix(n, "UmbrellaWilliams") weight<-weights.help$weight.matrix weight.help <- weights.help$weight.help cmpid <- paste("C", 1:(a * (a - 1)/2)) type.of.contrast <- "Umbrella Williams" } else { stop("The Umbrella Williams-Contrast hasn't got a control group!") } }, Marcus = { if (is.null(control)) { nc <- a * (a - 1)/2 weights.help <- weightMatrix(n, "Marcus") weight<-weights.help$weight.matrix weight.help <- weights.help$weight.help cmpid <- paste("C", 1:(a * (a - 1)/2)) type.of.contrast <- "Marcus" } else { stop("The Marcus-Contrast hasn't got a control group!") } } ) pd1 <- (pd == 1) pd0 <- (pd == 0) pd[pd1] <- 0.999 pd[pd0] <- 0.001 pd.help1 <- c(pd, 1-pd) pd <- c(weight%*%pd.help1) cov.bf <- weight %*% cov.bf %*% t(weight) for (i in 1:nc) { if (cov.bf[i, i] == 0) { cov.bf[i, i] <- 0.001 } } vd.bf <- c(diag(cov.bf)) vd.bf <- c(vd.bf) rho.bf <- corr.mat(cov.bf, nc) t.bf <- sqrt(ntotal) * (pd - 1/2)/sqrt(vd.bf) rownames(weight) <- paste("C", 1:nc) ncomp <- a * (a - 1)/2 tmp <- expand.grid(1:a, 1:a) ind <- tmp[[1]] > tmp[[2]] v2 <- tmp[[2]][ind] v1 <- tmp[[1]][ind] namen1 <- sapply(1:ncomp, function(arg) { i <- v2[arg] j <- v1[arg] paste("p", "(", fl[i], ",", fl[j], ")", sep = "") }) namen2 <- sapply(1:ncomp, function(arg) { i <- v2[arg] j <- v1[arg] paste("p", "(", fl[j], ",", fl[i], ")", sep = "") }) colnames(weight) <- c(namen1,namen2) df.sw[is.nan(df.sw)] <- 1000 df.sw <- weight %*% c(df.sw,df.sw) df.sw <- max(4, min(df.sw)) pd <- c(pd) logit.pd <- logit(pd) logit.dev <- diag(1/(pd * (1 - pd))) logit.cov <- logit.dev %*% cov.bf %*% t(logit.dev) vd.logit <- c(diag(logit.cov)) t.logit <- (logit.pd) * sqrt(ntotal/vd.logit) probit.pd <- qnorm(pd) probit.dev <- diag(sqrt(2 * pi)/(exp(-0.5 * qnorm(pd) * qnorm(pd)))) probit.cov <- probit.dev %*% cov.bf %*% t(probit.dev) vd.probit <- c(diag(probit.cov)) t.probit <- (probit.pd) * sqrt(ntotal/vd.probit) p.bfn = p.bft = p.bflogit = p.bfprobit = c() p.n = p.t = p.logit = p.probit = c() if (alternative == "two.sided") { z.bft <- z.quantile(conflevel = conflevel, corr = rho.bf, "two.sided", df = df.sw, dbs = "t") z.bfn <- z.quantile(conflevel = conflevel, corr = rho.bf, "two.sided", df = 0, dbs = "n") lower.bft <- pd - sqrt(vd.bf/ntotal) * z.bft upper.bft <- pd + sqrt(vd.bf/ntotal) * z.bft lower.bfn <- pd - sqrt(vd.bf/ntotal) * z.bfn upper.bfn <- pd + sqrt(vd.bf/ntotal) * z.bfn lower.logit <- expit(logit.pd - sqrt(vd.logit/ntotal) * z.bfn) upper.logit <- expit(logit.pd + sqrt(vd.logit/ntotal) * z.bfn) lower.probit <- pnorm(probit.pd - sqrt(vd.probit/ntotal) * z.bfn) upper.probit <- pnorm(probit.pd + sqrt(vd.probit/ntotal) * z.bfn) #---------------------------------------------------------# #--------------Berechnung von p-Werten -------------------# for (i in 1:nc) { p.bft[i] <- 1-pmvt(lower=-abs(t.bf[i]), abs(t.bf[i]), df=df.sw, corr=rho.bf,delta=rep(0,nc)) p.bfn[i] <- 1-pmvnorm(lower=-abs(t.bf[i]), abs(t.bf[i]),corr=rho.bf,mean=rep(0,nc)) p.bflogit[i] <- 1-pmvnorm(lower=-abs(t.logit[i]), abs(t.logit[i]),corr=rho.bf ,mean=rep(0,nc)) p.bfprobit[i] <- 1-pmvnorm(lower=-abs(t.probit[i]), abs(t.probit[i]),corr=rho.bf,mean=rep(0,nc)) p.tt <- pt(t.bf[i], df.sw) p.t[i] <- min(2*p.tt,2-2*p.tt) p.nn <- pnorm(t.bf[i]) p.n[i] <- min(2*p.nn, 2-2*p.nn) p.ll <- pnorm(t.logit[i]) p.logit[i] <- min(2*p.ll, 2-2*p.ll) p.pp <- pnorm(t.probit[i]) p.probit[i] <- min(2*p.pp, 2-2*p.pp) } text.output.p <- "H_0: p(i,j)=1/2" text.output.KI <- paste(100 * conflevel, "%", "2-sided", "Simultaneous-Confidence-Intervals for Relative Effects") upper <- "]" lower <- "[" } if (alternative == "greater") { z.bft <- z.quantile(conflevel = conflevel, corr = rho.bf, "less", df = df.sw, dbs = "t") z.bfn <- qmvnorm(conflevel, corr = rho.bf, tail = "lower")$quantile lower.bft <- pd - sqrt(vd.bf/ntotal) * z.bft lower.bfn <- pd - sqrt(vd.bf/ntotal) * z.bfn lower.logit <- expit(logit.pd - sqrt(vd.logit/ntotal) * z.bfn) lower.probit <- pnorm(probit.pd - sqrt(vd.probit/ntotal) * z.bfn) upper.bft = upper.probit = upper.logit = upper.bfn = 1 for (i in 1:nc) { p.bfn[i] <- 1 - pmvnorm(lower = -Inf, upper = t.bf[i], mean = rep(0, nc), corr = rho.bf) p.bft[i] <- 1 - pmvt(lower = -Inf, upper = t.bf[i], delta = rep(0, nc), df = df.sw, corr = rho.bf) p.bflogit[i] <- 1 - pmvnorm(lower = -Inf, upper = t.logit[i], mean = rep(0, nc), corr = rho.bf) p.bfprobit[i] <- 1 - pmvnorm(lower = -Inf, upper = t.probit[i], mean = rep(0, nc), corr = rho.bf) p.t[i] <-1-pt(t.bf[i], df.sw) p.n[i] <- 1-pnorm(t.bf[i]) p.logit[i] <- 1- pnorm(t.logit[i]) p.probit[i] <-1- pnorm(t.probit[i]) } text.output.p <- "H_0: p(i,j)<=1/2" text.output.KI <- paste(100 * conflevel, "%", "1-sided", "Simultaneous-Confidence-Intervals for Relative Effects") upper <- "]" lower <- "(" } if (alternative == "less") { z.bft <- z.quantile(conflevel = conflevel, corr = rho.bf, "less", df = df.sw, dbs = "t") z.bfn <- z.quantile(conflevel = conflevel, corr = rho.bf, "less", df = 0, dbs = "n") upper.bft <- pd + sqrt(vd.bf/ntotal) * z.bft upper.bfn <- pd + sqrt(vd.bf/ntotal) * z.bfn upper.logit <- expit(logit.pd + sqrt(vd.logit/ntotal) * z.bfn) upper.probit <- pnorm(probit.pd + sqrt(vd.probit/ntotal) * z.bfn) lower.bft = lower.probit = lower.logit = lower.bfn = 0 for (i in 1:nc) { p.bfn[i] <- 1 - pmvnorm(lower = t.bf[i], upper = Inf, mean = rep(0, nc), corr = rho.bf) p.bft[i] <- 1 - pmvt(lower = t.bf[i], upper = Inf, delta = rep(0, nc), df = df.sw, corr = rho.bf) p.bflogit[i] <- 1 - pmvnorm(lower = t.logit[i], upper = Inf, mean = rep(0, nc), corr = rho.bf) p.bfprobit[i] <- 1 - pmvnorm(lower = t.probit[i], upper = Inf, mean = rep(0, nc), corr = rho.bf) p.t[i] <- pt(t.bf[i], df.sw) p.n[i] <- pnorm(t.bf[i]) p.logit[i] <- pnorm(t.logit[i]) p.probit[i] <- pnorm(t.probit[i]) } text.output.p <- " H_0: p(i,j)>=1/2" text.output.KI <- paste(100 * conflevel, "%", "1-sided", "Simultaneous-Confidence-Intervals for Relative Effects") upper <- ")" lower <- "[" } bfn.lower <- round(lower.bfn, rounds) bfn.upper <- round(upper.bfn, rounds) bft.lower <- round(lower.bft, rounds) bft.upper <- round(upper.bft,rounds) logit.lower <- round(lower.logit, rounds) logit.upper <- round(upper.logit,rounds) probit.lower <- round(lower.probit, rounds) probit.upper <- round(upper.probit,rounds) p.bflogit <- round(p.bflogit, rounds) p.bfprobit <- round(p.bfprobit, rounds) p.bft <- round(p.bft, rounds) p.bfn <- round(p.bfn, rounds) p.logit <- round(p.logit, rounds) p.probit <- round(p.probit, rounds) p.t <- round(p.t, rounds) p.n <- round(p.n, rounds) pd <- round(pd, rounds) if (correlation == TRUE) { Correlation <- list(Correlation.matrix.N = rho.bf, Covariance.matrix.N = cov.bf, Warning = paste("Attention! The covariance matrix is multiplied with N", "=", ntotal)) } else { Correlation <- NA } data.info <- data.frame(row.names = 1:a, Sample = fl, Size = n) switch(asy.method, logit = { x.werte = cbind(lower.logit, pd, upper.logit) result <- list(weight.matrix = weight, Data.Info = data.info, Analysis.of.relative.effects = data.frame(row.names = c(1:nc), comparison = cmpid, rel.effect = pd, lower= logit.lower, upper=logit.upper, t.value = t.logit, p.adj = p.bflogit, p.raw= p.logit), Mult.Distribution = data.frame(Quantile = z.bfn, p.Value.global = min(p.bflogit)), Correlation = Correlation) Asymptotic.Method <- "Multivariate Delta-Method (Logit)" }, probit = { x.werte = cbind(lower.probit, pd, upper.probit) result <- list(weight.matrix = weight, Data.Info = data.info, Analysis.of.relative.effects = data.frame(row.names = c(1:nc), comparison = cmpid, rel.effect = pd, lower = probit.lower, upper = probit.upper, t.value = t.probit, p.adj = p.bfprobit, p.raw = p.probit), Mult.Distribution = data.frame(Quantile = z.bfn, p.Value.global = min(p.bfprobit)), Correlation = Correlation) Asymptotic.Method <- "Multivariate Delta-Method (Probit)" }, normal = { x.werte = cbind(lower.bfn, pd, upper.bfn) result <- list(weight.matrix = weight, Data.Info = data.info, Analysis.of.relative.effects = data.frame(row.names = c(1:nc), comparison = cmpid, rel.effect = pd, lower = bfn.lower, upper=bfn.upper, t.value = t.bf, p.adj = p.bfn, p.raw = p.n), Mult.Distribution = data.frame(Quantile = z.bfn, p.Value.global = min(p.bfn)), Correlation = Correlation) Asymptotic.Method <- "Multivariate Normal Distribution" }, mult.t = { x.werte = cbind(lower.bft, pd, upper.bft) result <- list(weight.matrix = weight, Data.Info = data.info, Analysis.of.relative.effects = data.frame(row.names = c(1:nc), comparison = cmpid, rel.effect = pd, lower = bft.lower, upper=bft.upper, t.value = t.bf, p.adj = p.bft,p.raw = p.t), Mult.Distribution = data.frame(Quantile = z.bft, p.Value.global = min(p.bft), d.f. = df.sw), Correlation = Correlation) Asymptotic.Method <- paste("Multi t - Distribution with d.f.= ", round(df.sw, 4)) }) if (plot.simci == TRUE) { test <- matrix(c(1:nc), ncol = nc, nrow = nc) angaben <- c(cmpid) angaben <- matrix(c(angaben), ncol = nc, nrow = nc) k <- c(1:nc) plot(x.werte[, 2], k, xlim = c(0, 1), axes = FALSE, type = "p", pch = 15, xlab = "", ylab = "") abline(v = 0.5, col = "red", lty = 1, lwd = 2) axis(1, at = seq(0, 1, 0.1)) axis(2, at = test, labels = angaben) axis(4, at = test, labels = test) points(x = x.werte[, 3], y = test[, 1], pch = upper) points(x = x.werte[, 1], y = test[, 1], pch = lower) for (i in 1:nc) { polygon(c(x.werte[i, 1], x.werte[i, 3]), c(i, i)) } box() title(main = c(text.output.KI, paste("Type of Contrast:", "", type.of.contrast, sep = ""), paste("Method:", "", Asymptotic.Method, sep = "")), ylab = "Comparison", xlab = paste("lower", lower, "-----", "p", "------", upper, "upper")) } if (info == TRUE) { cat("\n", "", "Nonparametric Multiple Comparison Procedure based on relative contrast effects", ",", "Type of Contrast", ":", type.of.contrast, "\n", "NOTE:", "\n", "*-------------------Weight Matrix------------------*", "\n", "-", "Weight matrix for choosen contrast based on all-pairs comparisons", "\n", "\n", "*-----------Analysis of relative effects-----------*", "\n", "-", "Simultaneous Confidence Intervals for relative effects p(i,j)\n with confidence level", conflevel, "\n", "-", "Method", "=", Asymptotic.Method, "\n", "-", "p-Values for ", text.output.p, "\n", "\n", "*----------------Interpretation--------------------*", "\n", "p(a,b)", ">", "1/2", ":", "b tends to be larger than a", "\n", "*--------------Mult.Distribution-------------------*", "\n", "-", "Equicoordinate Quantile", "\n", "-", "Global p-Value", "\n", "*--------------------------------------------------*", "\n") } return(result) } weightMatrix <- function(n,type = c("UserDefined","Tukey","AVE","Dunnett", "Sequen", "Changepoint", "Marcus", "McDermott", "Williams", "UmbrellaWilliams"), base = 1, contrast.matrix=NULL) { a <- length (n) n.col <- a*(a-1)/2 tmp <- expand.grid(1:a, 1:a) ind <- tmp[[1]] > tmp[[2]] vi <- tmp[[2]][ind] vj <- tmp[[1]][ind] type <- match.arg(type) switch (type, UserDefined = { if (is.null(contrast.matrix)){stop("Choose a contrast or give a contrast matrix by using 'contrast.matrix = matrix'")} #if(any(abs(contrast.matrix)>1)){stop("The contrast weights must be between 0 and 1!")} if (ncol(contrast.matrix)!=a){stop("The contrast matrix has more or less columns than samples!")} nc<-nrow(contrast.matrix) for (i in 1:nc){ places_pos<-(contrast.matrix[i,]>0) places_neg<-(contrast.matrix[i,]<0) sum_pos<-sum(contrast.matrix[i,][places_pos]) sum_neg<-sum(contrast.matrix[i,][places_neg]) if (abs(sum_neg)!= sum(sum_pos)) { stop(" Wrong contrast matrix!The sum of negative and positive weights must be equal") } for ( j in 1:a){ if (contrast.matrix[i,j]<0){ contrast.matrix[i,j]<-contrast.matrix[i,j]/abs(sum_neg)} if (contrast.matrix[i,j]>0){ contrast.matrix[i,j]<-contrast.matrix[i,j]/sum_pos} } } n.row <- nrow(contrast.matrix) ch <- contrast.matrix w<-matrix(0,nrow = n.row , ncol=n.col ) weight.help2<-matrix(0,nrow = n.row , ncol=n.col ) weight.help1<-matrix(0,nrow = n.row , ncol=n.col ) for (i in 1:n.row){ for (j in 1:n.col){ help <- c(rep(i,n.col)) a <- help[j] b <- vi[j] d <- vj[j] w[i,j] <- ch[a,b] *ch[a,d] if (w[i,j]>0){w[i,j]<-0} if (ch[a,b] > 0 && ch[a,d] < 0) {weight.help2[i,j]<-1} if(ch[a,b] < 0 && ch[a,d] > 0){weight.help1[i,j] <-1} } } w1<-w*weight.help1 w2<-w*weight.help2 w<--1*cbind(w1,w2) w }, AVE = { n.row <- a ch <- contrMat(n, type="AVE") w<-matrix(0,nrow = n.row , ncol=n.col ) weight.help2<-matrix(0,nrow = n.row , ncol=n.col ) weight.help1<-matrix(0,nrow = n.row , ncol=n.col ) for (i in 1:n.row){ for (j in 1:n.col){ help <- c(rep(i,n.col)) a <- help[j] b <- vi[j] d <- vj[j] w[i,j] <- ch[a,b] *ch[a,d] if (w[i,j]>0){w[i,j]<-0} if (ch[a,b] > 0 && ch[a,d] < 0) {weight.help2[i,j]<-1} if(ch[a,b] < 0 && ch[a,d] > 0){weight.help1[i,j] <-1} } } w1<-w*weight.help1 w2<-w*weight.help2 w<--1*cbind(w1,w2) w }, Changepoint = { n.row <- a - 1 ch <- contrMat(n, type = "Changepoint") w<-matrix(0,nrow = n.row , ncol=n.col ) weight.help2<-matrix(0,nrow = n.row , ncol=n.col ) weight.help1<-matrix(0,nrow = n.row , ncol=n.col ) for (i in 1:n.row){ for (j in 1:n.col){ help <- c(rep(i,n.col)) a <- help[j] b <- vi[j] d <- vj[j] w[i,j] <- ch[a,b] *ch[a,d] if (w[i,j]>0){w[i,j]<-0} if (ch[a,b] > 0 && ch[a,d] < 0) {weight.help2[i,j]<-1} if(ch[a,b] < 0 && ch[a,d] > 0){weight.help1[i,j] <-1} } } w1<-w*weight.help1 w2<-w*weight.help2 w<--1*cbind(w1,w2) w }, Dunnett = { n.row <- a - 1 ch <- contrMat(n, type = "Dunnett", base = base) w<-matrix(0,nrow = n.row , ncol=n.col ) weight.help2<-matrix(0,nrow = n.row , ncol=n.col ) weight.help1<-matrix(0,nrow = n.row , ncol=n.col ) for (i in 1:n.row){ for (j in 1:n.col){ help <- c(rep(i,n.col)) a <- help[j] b <- vi[j] d <- vj[j] w[i,j] <- ch[a,b] *ch[a,d] if (w[i,j]>0){w[i,j]<-0} if (ch[a,b] > 0 && ch[a,d] < 0) {weight.help2[i,j]<-1} if(ch[a,b] < 0 && ch[a,d] > 0){weight.help1[i,j] <-1} } } w1<-w*weight.help1 w2<-w*weight.help2 w<--1*cbind(w1,w2) w }, Sequen = { n.row <- a - 1 ch <- contrMat(n, type = "Sequen", base) w<-matrix(0,nrow = n.row , ncol=n.col ) weight.help2<-matrix(0,nrow = n.row , ncol=n.col ) weight.help1<-matrix(0,nrow = n.row , ncol=n.col ) for (i in 1:n.row){ for (j in 1:n.col){ help <- c(rep(i,n.col)) a <- help[j] b <- vi[j] d <- vj[j] w[i,j] <- ch[a,b] *ch[a,d] if (w[i,j]>0){w[i,j]<-0} if (ch[a,b] > 0 && ch[a,d] < 0) {weight.help2[i,j]<-1} if(ch[a,b] < 0 && ch[a,d] > 0){weight.help1[i,j] <-1} } } w1<-w*weight.help1 w2<-w*weight.help2 w<--1*cbind(w1,w2) w }, Marcus = { n.row <- a*(a-1)/2 ch <- contrMat(n, type = "Marcus", base) w<-matrix(0,nrow = n.row , ncol=n.col ) weight.help2<-matrix(0,nrow = n.row , ncol=n.col ) weight.help1<-matrix(0,nrow = n.row , ncol=n.col ) for (i in 1:n.row){ for (j in 1:n.col){ help <- c(rep(i,n.col)) a <- help[j] b <- vi[j] d <- vj[j] w[i,j] <- ch[a,b] *ch[a,d] if (w[i,j]>0){w[i,j]<-0} if (ch[a,b] > 0 && ch[a,d] < 0) {weight.help2[i,j]<-1} if(ch[a,b] < 0 && ch[a,d] > 0){weight.help1[i,j] <-1} } } w1<-w*weight.help1 w2<-w*weight.help2 w<--1*cbind(w1,w2) w }, McDermott = { n.row <- a -1 ch <- contrMat(n, type = "McDermott", base) w<-matrix(0,nrow = n.row , ncol=n.col ) weight.help2<-matrix(0,nrow = n.row , ncol=n.col ) weight.help1<-matrix(0,nrow = n.row , ncol=n.col ) for (i in 1:n.row){ for (j in 1:n.col){ help <- c(rep(i,n.col)) a <- help[j] b <- vi[j] d <- vj[j] w[i,j] <- ch[a,b] *ch[a,d] if (w[i,j]>0){w[i,j]<-0} if (ch[a,b] > 0 && ch[a,d] < 0) {weight.help2[i,j]<-1} if(ch[a,b] < 0 && ch[a,d] > 0){weight.help1[i,j] <-1} } } w1<-w*weight.help1 w2<-w*weight.help2 w<--1*cbind(w1,w2) w }, Williams = { n.row <- a - 1 ch <- contrMat(n, type = "Williams") w<-matrix(0,nrow = n.row , ncol=n.col ) weight.help2<-matrix(0,nrow = n.row , ncol=n.col ) weight.help1<-matrix(0,nrow = n.row , ncol=n.col ) for (i in 1:n.row){ for (j in 1:n.col){ help <- c(rep(i,n.col)) a <- help[j] b <- vi[j] d <- vj[j] w[i,j] <- ch[a,b] *ch[a,d] if (w[i,j]>0){w[i,j]<-0} if (ch[a,b] > 0 && ch[a,d] < 0) {weight.help2[i,j]<-1} if(ch[a,b] < 0 && ch[a,d] > 0){weight.help1[i,j] <-1} } } w1<-w*weight.help1 w2<-w*weight.help2 w<--1*cbind(w1,w2) w } , Tukey = { n.row <- a*(a-1)/2 ch <- contrMat(n, type = "Tukey", base) w<-matrix(0,nrow = n.row , ncol=n.col ) weight.help2<-matrix(0,nrow = n.row , ncol=n.col ) weight.help1<-matrix(0,nrow = n.row , ncol=n.col ) for (i in 1:n.row){ for (j in 1:n.col){ help <- c(rep(i,n.col)) a <- help[j] b <- vi[j] d <- vj[j] w[i,j] <- ch[a,b] *ch[a,d] if (w[i,j]>0){w[i,j]<-0} if (ch[a,b] > 0 && ch[a,d] < 0) {weight.help2[i,j]<-1} if(ch[a,b] < 0 && ch[a,d] > 0){weight.help1[i,j] <-1} } } w1<-w*weight.help1 w2<-w*weight.help2 w<--1*cbind(w1,w2) w }, UmbrellaWilliams = { n.row <- a*(a-1)/2 ch <- contrMat(n, type = "UmbrellaWilliams", base) w<-matrix(0,nrow = n.row , ncol=n.col ) weight.help2<-matrix(0,nrow = n.row , ncol=n.col ) weight.help1<-matrix(0,nrow = n.row , ncol=n.col ) for (i in 1:n.row){ for (j in 1:n.col){ help <- c(rep(i,n.col)) a <- help[j] b <- vi[j] d <- vj[j] w[i,j] <- ch[a,b] *ch[a,d] if (w[i,j]>0){w[i,j]<-0} if (ch[a,b] > 0 && ch[a,d] < 0) {weight.help2[i,j]<-1} if(ch[a,b] < 0 && ch[a,d] > 0){weight.help1[i,j] <-1} } } w1<-w*weight.help1 w2<-w*weight.help2 w<--1*cbind(w1,w2) w } ) ch.out <- matrix(c(ch),nrow=n.row) result <- list(weight.matrix = w, weight.help1 = weight.help1,weight.help2 = weight.help2,contrast.matrix = ch.out) result } nparcomp.wrapper <- function(model, data, hypotheses, alpha, alternative, asy.method) { control <- NULL type <- NULL contrastMatrix <- NULL if (hypotheses %in% c("Tukey", "Dunnett", "Sequen", "Williams", "Changepoint", "AVE", "McDermott", "Marcus", "UmbrellaWilliams")) { type <- hypotheses } else { type <- "UserDefined" contrastMatrix <- hypotheses } result <- nparcomp(formula=formula(model), data, type = type, control = control, conflevel = 1-alpha, alternative, rounds = 3, correlation = TRUE, asy.method, plot.simci = FALSE, info = TRUE, contrastMatrix = contrastMatrix) pvalues <- result$Analysis.of.relative.effects$p.adj rejected1 <- (pvalues < alpha) confi <- cbind(result$Analysis.of.relative.effects$rel.effect, result$Analysis.of.relative.effects$lower, result$Analysis.of.relative.effects$upper) rownames(confi)<-result$Analysis.of.relative.effects$comparison temp <- cbind(confi,pvalues) colnames(temp) <- c("Estimate", "Lower","Upper","pValue") print(temp) return(list(adjPValues=pvalues, rejected=rejected1, confIntervals= confi, errorControl = new(Class='ErrorControl',type="FWER",alpha=alpha))) } mutoss.nparcomp <- function() { return(new(Class="MutossMethod", label="Nonparametric relative contrast effects", errorControl="FWER", callFunction="nparcomp.wrapper", output=c("adjPValues", "rejected","confIntervals", "errorControl"), info="

Nonparametric relative contrast effects

With this function, it is possible to compute nonparametric simultaneous confidence\ intervals for relative contrast effects in the unbalanced one way layout. Moreover, it computes\ adjusted p-values. The simultaneous confidence intervals can be computed using\ multivariate normal distribution, multivariate t-distribution with a Satterthwaite Approximation\ of the degree of freedom or using multivariate range preserving transformations with Logit or\ Probit as transformation function. There is no assumption on the underlying distribution function, only\ that the data have to be at least ordinal numbers.

Reference:

  • Konietschke, F. \"Simultane Konfidenzintervalle fuer nichtparametrische relative Kontrasteffekte.\" Dissertation, University of Goettingen, 2009.
  • Konietschke, F., Brunner, E., Hothorn, L.A. \"Simultaneous confidence intervals for nonparametric relative contrast effects.\" Research report at the University of Hannover, 2009.
", parameters=list( data=list(type="data.frame"), model=list(type="ANY"), hypotheses=list(type="ANY"), alpha=list(type="numeric"), alternative=list(type="character", label="Alternative", choices=c("two.sided", "less", "greater")), asy.method=list(type="character", label="Asymptotic approx. method", choices=c("logit", "probit", "normal", "mult.t")) ) )) } mutoss/R/multtest.R0000644000176200001440000004125214404061507014016 0ustar liggesusers####################################################################### ########### here are the multtest methods - marginal siblings can be found in marginal.R ###################### ### one sample model with multtest ### onesamp.multtest <- function(data, alternative, robust, psi0, alpha, nulldist, B=1000, method, seed=12345) { result <- MTP(X=data, W = NULL, Y = NULL, Z = NULL, Z.incl = NULL, Z.test = NULL, na.rm = TRUE, test = "t.onesamp", robust = robust, standardize = TRUE, alternative = alternative, psi0 = psi0, typeone = "fwer", k = 0, q = 0.1, fdr.method = "restricted", alpha = alpha, smooth.null = FALSE, nulldist = nulldist, B = B, ic.quant.trans = FALSE, MVN.method = "mvrnorm", penalty = 1e-06, method = method, get.cr = FALSE, get.cutoff = FALSE, get.adjp = TRUE, keep.nulldist = FALSE, keep.rawdist = FALSE, seed = seed, cluster = 1, type = NULL, dispatch = NULL, marg.null = NULL, marg.par = NULL, keep.margpar = TRUE, ncp = NULL, perm.mat = NULL, keep.index = FALSE, keep.label = FALSE) return(list(adjPValues=result@adjp, rejected=as.vector(result@reject))) } mutoss.onesamp.multtest.model <- function(model) { return("typ" %in% names(model) && model$typ == "onesamp") } mutoss.onesamp.multtest <- function() { return(new(Class="MutossMethod", label="Resampling-based one sample test", errorControl="FWER", callFunction="onesamp.multtest", output=c("adjPValues", "rejected"), info="

Resampling-based one sample test

There are different choices of resampling methods available for estimating the joint test statistics null distribution:\n\

  • \"boot.cs\": non-parametric bootstrap with centering and scaling
  • \n\
  • \"boot.ctr\": centered-only bootstrap distribution
  • \n\
  • \"boot.qt\": quantile transformed bootstrap distribution. the default marginal t-distribution with n-1 degree of freedom is used.
  • \n\
  • \"perm\": permutation distribution (refering to the Westfall and Young procedures)
  • \n\
  • \"ic\": under GUI construction (available at (library(multtest))
  • \n

There are four adjustment methods to control the FWER:

  • \"sd.minP\": step-down common-quantile procedure based on the minima of unadjusted p-values
  • \"sd.maxT\": step-down common-cut-off procedure based on the maxima of test statistics
  • \"ss.minP\": single-step common-quantile procedure
  • \"ss.maxT\": single-step common-cut-off procedure

The default number of bootstrap iterations (or number of permutations if resampling method is \"perm\") is 1000. This can be reduced to increase the speed of computations, at a cost to precision. However, it is recommended to use a large number of resampling iterations, e.g. 10,000.

The robust version uses the Wilcoxon-Mann-Whitney test, otherwise a t-test will be performed.

Reference:

  • Dudoit, S. and van der Laan, M.J. (2007). Mulitple Testing Procedures and Applications to Genomics. Springer Series in Statistics.
  • \n\
  • Westfall, P.H. and Young, S.S. (1993). Resampling-Based Multiple Testing. Examples and Methods for p-value adjustment. Wiley Series in Probability and Mathematical Statistics.
  • \n
", parameters=list( data=list(type="ANY"), model=list(type="ANY"), robust=list(type="logical", label="Robust statistic"), alternative=list(type="character", label="Alternative", choices=c("two.sided", "less", "greater")), psi0=list(type="numeric", label="Hypothesized null value", default=0), alpha=list(type="numeric"), nulldist=list(type="character", label="Resampling Method", choices=c("boot.cs", "boot.ctr", "boot.qt", "perm")), B=list(type="numeric", label="Number of Resampling Iterations", default=1000), method=list(type="character", label="Adjustment Method", choices=c("sd.minP","sd.maxT","ss.minP","ss.maxT"), seed=list(type="ANY", default=12345) ) ))) } ### paired sample model with multtest ### paired.multtest <- function(data, model, alternative, robust, psi0, alpha, nulldist, B=1000, method, seed=12345) { result <- MTP(X=data, W = NULL, Y = model$classlabel, Z = NULL, Z.incl = NULL, Z.test = NULL, na.rm = TRUE, test = "t.pair", robust = robust, standardize = TRUE, alternative = alternative, psi0 = psi0, typeone = "fwer", k = 0, q = 0.1, fdr.method = "restricted", alpha = alpha, smooth.null = FALSE, nulldist = nulldist, B = B, ic.quant.trans = FALSE, MVN.method = "mvrnorm", penalty = 1e-06, method = method, get.cr = FALSE, get.cutoff = FALSE, get.adjp = TRUE, keep.nulldist = FALSE, keep.rawdist = FALSE, seed = seed, cluster = 1, type = NULL, dispatch = NULL, marg.null = NULL, marg.par = NULL, keep.margpar = TRUE, ncp = NULL, perm.mat = NULL, keep.index = FALSE, keep.label = FALSE) return(list(adjPValues=result@adjp, rejected=as.vector(result@reject))) } mutoss.paired.multtest.model <- function(model) { return("typ" %in% names(model) && model$typ == "pairedsamp") } mutoss.paired.multtest <- function() { return(new(Class="MutossMethod", label="Resampling-based paired sample test", errorControl="FWER", callFunction="paired.multtest", output=c("adjPValues", "rejected"), info="

Resampling-based paired test

There are different choices of resampling methods available for estimating the joint test statistics null distribution:\n\

  • \"boot.cs\": non-parametric bootstrap with centering and scaling
  • \n\
  • \"boot.ctr\": centered-only bootstrap distribution
  • \n\
  • \"boot.qt\": quantile transformed bootstrap distribution. the default marginal t-distribution with n-1 degree of freedom is used, where n is the number of pairs.
  • \n\
  • \"perm\": permutation distribution (refering to the Westfall and Young procedures)
  • \n\
  • \"ic\": under GUI construction (available at (library(multtest))
  • \n

There are four adjustment methods to control the FWER:

  • \"sd.minP\": step-down common-quantile procedure based on the minima of unadjusted p-values
  • \"sd.maxT\": step-down common-cut-off procedure based on the maxima of test statistics
  • \"ss.minP\": single-step common-quantile procedure
  • \"ss.maxT\": single-step common-cut-off procedure

The default number of bootstrap iterations (or number of permutations if resampling method is \"perm\") is 1000. This can be reduced to increase the speed of computations, at a cost to precision. However, it is recommended to use a large number of resampling iterations, e.g. 10,000.

The robust version uses the Wilcoxon-Mann-Whitney test, otherwise a t-test will be performed.

Reference:

  • Dudoit, S. and van der Laan, M.J. (2007). Mulitple Testing Procedures and Applications to Genomics. Springer Series in Statistics.
  • \n\
  • Westfall, P.H. and Young, S.S. (1993). Resampling-Based Multiple Testing. Examples and Methods for p-value adjustment. Wiley Series in Probability and Mathematical Statistics.
  • \n
", parameters=list( data=list(type="ANY"), model=list(type="ANY"), robust=list(type="logical", label="Robust statistic"), alternative=list(type="character", label="Alternative", choices=c("two.sided", "less", "greater")), psi0=list(type="numeric", label="Hypothesized null value", default=0), alpha=list(type="numeric"), nulldist=list(type="character", label="Resampling Method", choices=c("boot.cs", "boot.ctr", "boot.qt", "perm")), B=list(type="numeric", label="Number of Resampling Iterations", default=1000), method=list(type="character", label="Adjustment Method", choices=c("sd.minP","sd.maxT","ss.minP","ss.maxT"), seed=list(type="ANY", default=12345)) ) )) } ### two sample model with multtest #### twosamp.multtest <- function(data, model, alternative, robust, psi0, equalvar, alpha, nulldist, B=1000, method, seed=12345) { if (equalvar) { result <- MTP(X=data, W = NULL, Y = model$classlabel, Z = NULL, Z.incl = NULL, Z.test = NULL, na.rm = TRUE, test = "t.twosamp.equalvar", robust = robust, standardize = TRUE, alternative = alternative, psi0 = psi0, typeone = "fwer", k = 0, q = 0.1, fdr.method = "restricted", alpha = alpha, smooth.null = FALSE, nulldist = nulldist, B = B, ic.quant.trans = FALSE, MVN.method = "mvrnorm", penalty = 1e-06, method = method, get.cr = FALSE, get.cutoff = FALSE, get.adjp = TRUE, keep.nulldist = FALSE, keep.rawdist = FALSE, seed = seed, cluster = 1, type = NULL, dispatch = NULL, marg.null = NULL, marg.par = NULL, keep.margpar = TRUE, ncp = NULL, perm.mat = NULL, keep.index = FALSE, keep.label = FALSE) } else { result <- MTP(X=data, W = NULL, Y = model$classlabel, Z = NULL, Z.incl = NULL, Z.test = NULL, na.rm = TRUE, test = "t.twosamp.unequalvar", robust = robust, standardize = TRUE, alternative = alternative, psi0 = psi0, typeone = "fwer", k = 0, q = 0.1, fdr.method = "restricted", alpha = alpha, smooth.null = FALSE, nulldist = nulldist, B = B, ic.quant.trans = FALSE, MVN.method = "mvrnorm", penalty = 1e-06, method = method, get.cr = FALSE, get.cutoff = FALSE, get.adjp = TRUE, keep.nulldist = FALSE, keep.rawdist = FALSE, seed = seed, cluster = 1, type = NULL, dispatch = NULL, marg.null = NULL, marg.par = NULL, keep.margpar = TRUE, ncp = NULL, perm.mat = NULL, keep.index = FALSE, keep.label = FALSE) } return(list(adjPValues=result@adjp, rejected=as.vector(result@reject))) } mutoss.twosamp.multtest.model <- function(model) { return("typ" %in% names(model) && model$typ == "twosamp") } mutoss.twosamp.multtest <- function() { return(new(Class="MutossMethod", label="Resampling-based two sample test", errorControl="FWER", callFunction="twosamp.multtest", output=c("adjPValues", "rejected"), info="

Resampling-based two sample test

There are different choices of resampling methods available for estimating the joint test statistics null distribution:\n\

  • \"boot.cs\": non-parametric bootstrap with centering and scaling
  • \n\
  • \"boot.ctr\": centered-only bootstrap distribution
  • \n\
  • \"boot.qt\": quantile transformed bootstrap distribution. the default marginal t-distribution with n-1 degree of freedom is used.
  • \n\
  • \"perm\": permutation distribution (refering to the Westfall and Young procedures)
  • \n\
  • \"ic\": under GUI construction (available at (library(multtest))
  • \n

There are four adjustment methods to control the FWER:

  • \"sd.minP\": step-down common-quantile procedure based on the minima of unadjusted p-values
  • \"sd.maxT\": step-down common-cut-off procedure based on the maxima of test statistics
  • \"ss.minP\": single-step common-quantile procedure
  • \"ss.maxT\": single-step common-cut-off procedure

The default number of bootstrap iterations (or number of permutations if resampling method is \"perm\") is 1000. This can be reduced to increase the speed of computations, at a cost to precision. However, it is recommended to use a large number of resampling iterations, e.g. 10,000.

The robust version uses the Wilcoxon-Mann-Whitney test, otherwise a t-test will be performed.

Reference:

  • Dudoit, S. and van der Laan, M.J. (2007). Mulitple Testing Procedures and Applications to Genomics. Springer Series in Statistics.
  • \n\
  • Westfall, P.H. and Young, S.S. (1993). Resampling-Based Multiple Testing. Examples and Methods for p-value adjustment. Wiley Series in Probability and Mathematical Statistics.
  • \n
", parameters=list( data=list(type="ANY"), model=list(type="ANY"), robust=list(type="logical", label="Robust statistic"), alternative=list(type="character", label="Alternative", choices=c("two.sided", "less", "greater")), psi0=list(type="numeric", label="Hypothesized null value", default=0), equalvar=list(type="logical", label="Equal variance"), alpha=list(type="numeric"), nulldist=list(type="character", label="Resampling Method", choices=c("boot.cs", "boot.ctr", "boot.qt", "perm")), B=list(type="numeric", label="Number of Resampling Iterations", default=1000), method=list(type="character", label="Adjustment Method", choices=c("sd.minP","sd.maxT","ss.minP","ss.maxT"), seed=list(type="ANY", default=12345)) ) )) } ##################### F test ############################################# ########################################################################### ftest.multtest <- function(data, model, robust, alpha, nulldist, B=1000, method, seed=12345) { result <- MTP(X=data, W = NULL, Y = model$classlabel, Z = NULL, Z.incl = NULL, Z.test = NULL, na.rm = TRUE, test = "f", robust = robust, standardize = TRUE, typeone = "fwer", alpha = alpha, smooth.null = FALSE, nulldist = nulldist, B = B, ic.quant.trans = FALSE, MVN.method = "mvrnorm", penalty = 1e-06, method = method, get.cr = FALSE, get.cutoff = FALSE, get.adjp = TRUE, keep.nulldist = FALSE, keep.rawdist = FALSE, seed = seed, cluster = 1, type = NULL, dispatch = NULL, marg.null = NULL, marg.par = NULL, keep.margpar = TRUE, ncp = NULL, perm.mat = NULL, keep.index = FALSE, keep.label = FALSE) return(list(adjPValues=result@adjp, rejected=as.vector(result@reject))) } mutoss.ftest.multtest <- function() { return(new(Class="MutossMethod", label="Resampling-based F test", errorControl="FWER", callFunction="ftest.multtest", output=c("adjPValues", "rejected"), info="

Resampling-based F test

There are different choices of resampling methods available for estimating the joint test statistics null distribution:\n\

  • \"boot.cs\": non-parametric bootstrap with centering and scaling
  • \n\
  • \"boot.ctr\": centered-only bootstrap distribution
  • \n\
  • \"boot.qt\": quantile transformed bootstrap distribution. the default marginal F-distribution with df1=k-1, df2=n-k for k gruops is used.
  • \n\
  • \"perm\": permutation distribution (refering to the Westfall and Young procedures)
  • \n\
  • \"ic\": under GUI construction (available at (library(multtest))
  • \n

There are four adjustment methods to control the FWER:

  • \"sd.minP\": step-down common-quantile procedure based on the minima of unadjusted p-values
  • \"sd.maxT\": step-down common-cut-off procedure based on the maxima of test statistics
  • \"ss.minP\": single-step common-quantile procedure
  • \"ss.maxT\": single-step common-cut-off procedure

The default number of bootstrap iterations (or number of permutations if resampling method is \"perm\") is 1000. This can be reduced to increase the speed of computations, at a cost to precision. However, it is recommended to use a large number of resampling iterations, e.g. 10,000.

The robust version uses the Kruskal-Wallis test, otherwise a F test will be performed.

Reference:

  • Dudoit, S. and van der Laan, M.J. (2007). Mulitple Testing Procedures and Applications to Genomics. Springer Series in Statistics.
  • \n\
  • Westfall, P.H. and Young, S.S. (1993). Resampling-Based Multiple Testing. Examples and Methods for p-value adjustment. Wiley Series in Probability and Mathematical Statistics.
  • \n
", parameters=list( data=list(type="ANY"), model=list(type="ANY"), robust=list(type="logical", label="Robust statistic"), alpha=list(type="numeric"), nulldist=list(type="character", label="Resampling Method", choices=c("boot.cs", "boot.ctr", "boot.qt", "perm")), B=list(type="numeric", label="Number of Resampling Iterations", default=1000), method=list(type="character", label="Adjustment Method", choices=c("sd.minP","sd.maxT","ss.minP","ss.maxT"), seed=list(type="ANY", default=12345) ))) )} mutoss.ftest.multtest.model <- function(model) { return("typ" %in% names(model) && model$typ == "ftest") }mutoss/R/SUDProcedures.R0000644000176200001440000011516614404061507014632 0ustar liggesusers# Here all implemented concrete SUD-Procedures can be found. # # Author: MarselScheer and WerftWiebke ############################################################################### #++++++++++++++++++++++++++++ OutputFkt +++++++++++++++++++++ printRejected = function(rejected, pValues = NULL, adjPValues = NULL) { cat("Number of hyp.:\t", length(rejected), "\n") cat("Number of rej.:\t", sum(rejected), "\n") idx <- which(rejected) if (length(idx) != 0) { output <- data.frame(rejected = idx) if (!is.null(pValues)) { output <- data.frame(output, pValues[idx]) names(output)[length(names(output))] <- "pValues" } if (!is.null(adjPValues)) { output <- data.frame(output, adjPValues[idx]) names(output)[length(names(output))] <- "adjPValues" } if (!is.null(pValues)) # sorting by pValues output <- output[order(output$pValue), ] else { if (!is.null(adjPValues)) # no pValues availible, sorting by adjPValues output <- output[order(output$adjPValues), ] } rownames(output) <- 1:length(idx) print(output) } } #---------------------------- OutputFkt --------------------- #Rom_simpleImplementation <- function(pValues, alpha) #{ # # ROM, D. M. (1990). A sequentially rejective test procedure based # # on a modified Bonferroni inequality. Biometrika 77, 663-665. # # # Formula for the critical values is taken from # # FINNER, H. and ROTERS, M. (2002). Multiple hypotheses testing and # # expected type I errors. Ann. Statist. 30, 220-238. # # Notice: The smallest critical value in this paper is alpha_1!! # # Thus the critical values are calculated in this manner, and # # at the end the order is reversed. # # # ++++++ Calculating critical values # # # TODO: Perhaps there are computational problems if too many hypotheses are tested. # len <- length(pValues) # criticalValues <- rep(0, times=len) # criticalValues[1] <- alpha # # # TODO: !! firstSum_k[14:len] is constant for example if alpha=5%, len=200 # # firstSum_k := SUMME(alpha^i, i=1..(k-1)) # firstSum_k <- cumsum(c(0, sapply(1:(len-1), function(i) alpha^i))) # # criticalValues[2] <- 1/2 * (firstSum_k[2] - 0) # secondSummand <- function(i) choose(k,i) * criticalValues[i+1]^(k-i) # for (k in 3:len) # { # # TODO: secondSum can be calculated faster! # secondSum <- sum(sapply(1:(k-2), secondSummand)) # criticalValues[k] <- 1 / k * (firstSum_k[k] - secondSum) # #cat("1 ", secondSum, "\n") # } # criticalValues <- criticalValues[len:1] # # # ------ Calculating critical Values # # SU(pValues, criticalValues) # #} # TODO: MS !! Discussion about big n !! rom <- function(pValues, alpha, silent = FALSE) { # # Remark: The critical values calculated by this procedure were # compared with the critical values calculated by Rom # himself in his paper and they are the same. # Formula for the critical values is taken from # FINNER, H. and ROTERS, M. (2002). Multiple hypotheses testing and # expected type I errors. Ann. Statist. 30, 220-238. # Notice: The smallest critical value in this paper is alpha_1!! # Thus the critical values are calculated in this manner, and # at the end the order is reversed. # ++++++ Calculating critical Values # TODO: MS perhaps there are computational problems if too many hypotheses are tested. len <- length(pValues) criticalValues <- rep(0, times=len) criticalValues[1] <- alpha # TODO: MS !! firstSum_k[14:len] is constant for example if alpha=5%, len=200 # firstSum_k := SUMME(alpha^i, i=1..(k-1)) firstSum_k <- cumsum(c(0, sapply(1:(len-1), function(i) alpha^i))) criticalValues[2] <- 1/2 * (firstSum_k[2] - 0) # SUMME(binomial(k,i) * alpha_{i+1}^{k-i}, i=1..(k-2)) # = SUMME(aki, i=1..(k-2)) # = SUMME(binomial(k-1, i) * k / (k-i) * a(k-1)i * alpha_{i+1}, i=1..(k-2)) # for k = 3 and i = 1 # aki and binKoef actually has 2 dimensions, the k-dimension and the i-dimension. # But in this code we will only work with the i-dimension. In every step of # the for-loop aki[i] will be updated. aki <- rep(0, times = (len-2)) binKoef <- rep(1, times = (len-2)) binKoef[1] <- choose(3,1) aki[1] <- criticalValues[2]^(3-1) for (k in 3:len) { secondSummand <- sum(binKoef[1:(k-2)] * aki[1:(k-2)]) criticalValues[k] <- 1/k * (firstSum_k[k] - secondSummand) # updating the vectors for the next step binKoef[k-1] <- (k+1) * k / 2 #choose(k+1, k-1) binKoef[1:(k-2)] <- binKoef[1:(k-2)] * (k+1) / (k:3) aki[k-1] <- criticalValues[k]^2 aki[1:(k-2)] <- aki[1:(k-2)] * criticalValues[2:(k-1)] } criticalValues <- criticalValues[len:1] # ------ Calculating critical Values rejected <- SU(pValues, criticalValues) if (! silent) { cat("\n\n\t\tRom's (1990) step-up procedure\n\n") printRejected(rejected, pValues, NULL) } # TODO: MS calculating adjustedPValues for ROM numerically return(list(rejected = rejected, criticalValues = criticalValues, errorControl = new(Class='ErrorControl',type="FWER",alpha=alpha)) ) } mutoss.rom <- function() { return(new(Class="MutossMethod", label="Rom's (1990) step-up", errorControl="FWER", callFunction="rom", output=c("rejected", "criticalValues","errorControl"), info="

Rom's step-up procedure

\n\n\

Rom's step-up-procedure is applied to pValues. The procedure controls the FWER in the strong sense if the pValues are stochastically independent.

This function calculates the critical values by the formula given in Finner, H. and Roters, M. (2002) based on the joint distribution of order statistics. After that a step-up test is performed to reject hypotheses associated with pValues.

Since the formula for the critical values is recursive, the calculation of adjusted pValues is far from obvious and is not implemented here.

Reference:

\
    \
  • Rom, D. M. \" A sequentially rejective test procedure based on a modified Bonferroni inequality. \" Biometrika 77, 663-665.
  • \n\
", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric")) )) } #-------------------- Holm's Step-down--------------------# holm <- function(pValues, alpha, silent = FALSE) { m <- length(pValues) criticalValues <- sapply(1:m, function(i) alpha/(m-i+1)) adjPValues <- p.adjust(pValues, "holm") rejected <- (adjPValues <= alpha) if (! silent) { cat("\n\n\t\tHolm's (1979) step-down Procedure\n\n") printRejected(rejected, pValues, adjPValues) } return(list(adjPValues = adjPValues, rejected = rejected, criticalValues=criticalValues, errorControl = new(Class='ErrorControl',type="FWER",alpha=alpha)) ) } mutoss.holm <- function() { return(new(Class="MutossMethod", label="Holm's (1979) step-down", errorControl="FWER", callFunction="holm", output=c("adjPValues", "rejected", "criticalValues","errorControl"), info="

Holm's step-down-procedure

\n\n\

Holm's step-down-procedure is applied to pValues. It controls the FWER in the strong sense under arbitrary dependency.

\n\

Holm's procedure uses the same critical values as the Hochberg's procedure, namely c(i)=α/(m-i+1), but is a step-down version while Hochberg's method is a step-up version of the Bonferroni test. Holm's method is based on the Bonferroni inequality and is valid regardless of the joint distribution of the test statistics, whereas Hochberg's method relies on the assumption that Simes' inequality holds for the joint null distribution of the test statistics. If this assumption is met, Hochberg's step-up procedure is more powerful than Holm's step-down procedure.

\n\

Reference:

\
    \
  • Holm, S. (1979). \" A simple sequentially rejective multiple test procedure. \" Scand. J. Statist. Vol. 6, 65-70.
  • \n\
  • Huang, Y. and Hsu, J. (2007). \" Hochberg's step-up method: cutting corners off Holm's step-down method. \" Biometrika, 94(4):965-975.
", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric")) )) } # TODO: MS Probably jointCDF.unif should probably be moved to some math.R or so. # TODO: MS !! jointCDF.unif: There are numerical issues because the of accuracy of doublePrecison # TODO: MS !! How to communicate numerical issues to the user. jointCDF.orderedUnif = function(vec) { # vec is not ordered. Thus the probability must be 0 if (!all(order(vec) == 1:length(vec))) { print("ORDER!") print(vec) print(order(vec)) vecName <- deparse(substitute(vec)) warning(paste("jointCDF.unif(): The variable", vecName, "is not ordered. Thus the probability is 0!")) return(0) } if (min(vec) <= 0) return(0) vec[ vec > 1 ] <- 1 if (100 < length(vec)) warning("Length of the argument is longer than 100. Calculated value may not be useable!") # By Bolshev's recursion # P(U_{1:n} <= vec[1], ..., U_{n:n} <= vec[n]) # = Fn(vec[1], ..., vec[n]) # = 1 - sum( binom(n, j) * Fj(vec[1], ..., vec[j]) * (1-vec[j+1])^(n-j), j=0..n-1) # with F0 = 1. # The variable Fj[k+1] used in this function will correspond to # Fk(vec[1], ..., vec[k]) for all k = 0 .. n. # So Fj[1] is F0 = 1, Fj[2] is F1(vec[1]) and so on. Fj <- rep(0, times = length(vec) + 1) Fj[1] <- 1 # F0 # consider k; # Fj[k+1]; # Fk(vec[1], ..., vec[k]) # = 1 - sum( binom(k, s) * Fs(vec[1], ..., vec[s]) * (1-vec[s+1])^(n-s) , s=0..k-1 ) # = 1 - sum( choose(k,s) * Fj[s+1] * (1 - vec[s+1])^(k-s), s=0..k-1 ) summand <- function(s) choose(k,s) * Fj[s+1] * (1 - vec[s+1])^(k-s) for(k in 1:length(vec)) Fj[k+1] <- 1 - sum( sapply(0:(k-1), summand)) return(Fj[length(vec)+1]) } calculateBetaAdjustment = function(n, startIDX_SUD, alpha, silent = FALSE, initialBeta = 1, maxBinarySteps = 50, tolerance = 0.0001) { #+++++++++++++++++++++++++++ Subfunctions +++++++++++++++++++++++++ #probability mass function pmf <- function(criticalValues, startIDX_SUD, n, n0, j) {# Calculates P_{n,n0}(V = j) for a set of critical Values. # Formulas are from Finner, Gontscharuk, Dickhaus: FDR controlling step-up-down tests # related to the asmptotically optimal rejection curve. (to appear) if (n0 < j) return(0) n1 <- n - n0 if (startIDX_SUD <= n1) { if (j == 0) return( choose(n0,j) * 1 * (1-criticalValues[n1 + j + 1])^(n0-j) ) return( choose(n0,j) * jointCDF.orderedUnif(criticalValues[(n1 + 1):(n1 + j)]) * (1-criticalValues[n1 + j + 1])^(n0-j) ) } if ((n1 < startIDX_SUD) && (j < startIDX_SUD - n1 - 1)) { if (n1 + j == 0) # <=> n1 == 0 and j == 0 return(choose(n0,j) * jointCDF.orderedUnif(c(rep(1 - criticalValues[startIDX_SUD], times = (n - startIDX_SUD + 1)), 1 - criticalValues[(startIDX_SUD - 1):(n1 + j + 1)])) * 1 ) return(choose(n0,j) * jointCDF.orderedUnif(c(rep(1 - criticalValues[startIDX_SUD], times = (n - startIDX_SUD + 1)), 1 - criticalValues[(startIDX_SUD - 1):(n1 + j + 1)])) * criticalValues[n1 + j]^j ) } if ((n1 < startIDX_SUD) && (j == startIDX_SUD - n1 - 1)) { if (n1 + j == 0) # <=> n1 == 0 and j == 0 return(choose(n0,j) * jointCDF.orderedUnif(rep(1 - criticalValues[startIDX_SUD], times = (n - startIDX_SUD + 1))) * 1 ) return(choose(n0,j) * jointCDF.orderedUnif(rep(1 - criticalValues[startIDX_SUD], times = (n - startIDX_SUD + 1))) * criticalValues[n1 + j]^j ) } if ((n1 < startIDX_SUD) && (j == startIDX_SUD - n1)) return(choose(n0,j) * jointCDF.orderedUnif(rep(criticalValues[startIDX_SUD], times=j)) * (1 - criticalValues[n1 + j + 1])^(n0 - j) ) if ((n1 < startIDX_SUD) && (startIDX_SUD - n1 < j)) return(choose(n0,j) * jointCDF.orderedUnif(c(rep(criticalValues[startIDX_SUD], times=(startIDX_SUD - n1)), criticalValues[(startIDX_SUD + 1):(n1 + j)])) * (1 - criticalValues[n1 + j + 1])^(n0 - j) ) } calculateMaximumUpperFDRBound <- function(criticalValues, n, startIDX_SUD) { # Formulas are from Finner, Gontscharuk, Dickhaus: FDR controlling step-up-down tests # related to the asmptotically optimal rejection curve. (to appear) # Calculating the probability mass function of V under a DU(n_0, n) model # n = Number of hypotheses # n0 = Number of true hypotheses # pm[j+1,n0+1] = P_{n,n0}(V = j) pm <- sapply( 1:n, function(n0) { sapply(0:n, # actually we only had to go to n0, but in this way pm will be a matrix function(j) { pmf(criticalValues, startIDX_SUD, n, n0, j) } ) } ) # now the special case n0 = 0, then P_{n,n0}(V=0) = 1 pm <- cbind(c(1, rep(0, times = n)), pm) # just for plausibility, gonna look if P_{n,n0}(V in {0, ..., n}) = 1 for every n0 = 1, ..., n rng <- range(colSums(pm)) if (rng[2]-rng[1] > 0.01) warning("Maximum upper bounds of FDR probably not accurate!") # Calculating b(n,n0|startIDX_SUD) for every n0 # which is a uppper bound for the FDR according to Finner, Gontscharuk, Dickhaus. bn <- sapply(1:n, function(n0) { n1 <- n - n0 n0 * sum(sapply(1:n0, function(j) criticalValues[n1 + j]/(n1 + j) * pm[j, n0])) } ) bn return(max(bn)) } SearchInitialBetaInterval <- function(n, startIDX_SUD, alpha, initialBeta) { # searches two beta's: beta1 and beta2 such that the beta2-adjusted AORC # controls the FDR and the beta1-adjusted AORC not and beta2 + step = beta1 criticalValues <- sapply(1:n, function(i) i * alpha / (n + initialBeta - i * (1 - alpha))) UpperFDRBound <- calculateMaximumUpperFDRBound(criticalValues, n, startIDX_SUD) # startBeta controls the FDR, thus beta must be reduced! if (UpperFDRBound < alpha) { FDRControlOfInitialBeta <- TRUE step <- -1 } else { FDRControlOfInitialBeta <- FALSE step <- 1 } beta <- initialBeta + step intervalFound <- FALSE while (!intervalFound) { criticalValues <- sapply(1:n, function(i) i * alpha / (n + beta - i * (1 - alpha))) UpperFDRBound <- calculateMaximumUpperFDRBound(criticalValues, n, startIDX_SUD) # if we have FDRControl by the initialBeta but not for beta, then we are done! # Also if we have not control of the FDR by the initalBeta but for beta, then we are done! if (xor(UpperFDRBound < alpha, FDRControlOfInitialBeta)) intervalFound <- TRUE else # initialBeta and beta both control the FDR or both do not control the FDR beta <- beta + step } if (FDRControlOfInitialBeta) return(c(beta, beta + 1)) return(c(beta - 1, beta)) } #--------------------------- Subfunctions ------------------------- if (!silent) cat("Searching initial interval to start the bisection approach.\n") betaInt <- SearchInitialBetaInterval(n, startIDX_SUD, alpha, initialBeta) beta <- betaInt[2] step <- (betaInt[2] - betaInt[1]) / 2 numberOfSteps <- 0 if (!silent) cat("Starting the bisection approach.\n") lastFeasibleBeta <- beta lastFeasibleUpperFDRBound <- -Inf while(numberOfSteps < maxBinarySteps) { numberOfSteps <- numberOfSteps + 1 criticalValues <- sapply(1:n, function(i) i * alpha / (n + beta - i * (1 - alpha))) UpperFDRBound <- calculateMaximumUpperFDRBound(criticalValues, n, startIDX_SUD) if (!silent) cat("Step ", numberOfSteps, ": beta =", beta, " => Upper FDR bound =", UpperFDRBound, "\n") if (alpha - tolerance <= UpperFDRBound && UpperFDRBound <= alpha) { if (!silent) { cat("\nUpper FDR bound element in [alpha - tolerance, alpha]\n") cat("Returned beta =", beta, " => Upper FDR bound =", UpperFDRBound, "\n") } return(beta) } if (UpperFDRBound > alpha) beta <- beta + step else { lastFeasibleBeta <- min(beta, lastFeasibleBeta) lastFeasibleUpperFDRBound <- max(UpperFDRBound, lastFeasibleUpperFDRBound) beta <- beta - step } step <- step / 2 } if(!silent) cat("\nReturned beta =", lastFeasibleBeta, " => Upper FDR bound =", lastFeasibleUpperFDRBound, "\n" ) return(lastFeasibleBeta) } #------------------------ AORC---------------------# aorc <- function(pValues, alpha, startIDX_SUD = length(pValues), betaAdjustment, silent = FALSE) { len <- length(pValues) if (missing(betaAdjustment)) { if (!silent) cat("Using calculateBetaAdjustment() to set the missing parameter betaAdjustment.\n") betaAdjustment = calculateBetaAdjustment(len, startIDX_SUD, alpha, silent) } criticalValues <- sapply(1:len, function(i) i * alpha / (len + betaAdjustment - i * (1 - alpha))) rejected <- SUD(pValues, criticalValues, startIDX_SUD) if (! silent) { cat("\n\n\t\tAsymptotically optimal rejection curve (2009)\n\n") printRejected(rejected, pValues) } return(list(rejected = rejected, criticalValues = criticalValues, errorControl = new(Class='ErrorControl',type="FDR",alpha=alpha))) } mutoss.aorc <- function() { return(new(Class="MutossMethod", label="Asymptotically optimal rejection curve (2009)", errorControl="FDR", callFunction="aorc", output=c("criticalValues", "rejected", "errorControl"), info="

Step-up-down procedure based on the asymptotically optimal rejection curve

\n\n\

The graph of the function f(t) = t / (t * (1 - alpha) + alpha) is called the asymptotically \ optimal rejection curve. Denote by finv(t) the inverse of f(t). Using the \ critical values finv(i/n) for i = 1, ..., n yields asymptotic FDR control. \ To ensure finite FDR control it is possible to adjust f(t) by a factor. The \ function calculateBetaAdjustment() calculates a beta such that (1 + beta / n) * f(t) \ can be used to control the FDR for a given finite sample size. If beta is not provided, calculateBetaAdjustment() will be called automatically.\

\n\

Reference:

\
    \
  • Finner, H., Dickhaus, T. & Roters, M. \" On the false discovery rate and an asymptotically \ optimal rejection curve. \" The Annals of Statistics 37, 596-618.
  • \n\
", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric"), startIDX_SUD=list(type="integer", label="Start Index for Step-Up-Down", optional=TRUE), betaAdjustment=list(type="numeric", label="Adjustment factor beta_n", optional=TRUE)) )) } #aorc( runif(30), 0.05, 5) #----------------- Banjamini Liu----------------# BL <- function(pValues, alpha, silent=FALSE) { m <- length(pValues) criticalValues <- sapply(1:m, function(i) 1-(1-min(1, (m*alpha)/(m-i+1)))^(1/(m-i+1))) rejected <- SD(pValues, criticalValues) index <- order(pValues) # index for sorting pValues rindex <- order(index) # reversed index to obtain the original order spval <- pValues[index] adjPValues <- vector(mode="numeric",length=m) adjPValues[1] <- min(1 - (1 - spval[1])^m, 1) for (i in 2:m) adjPValues[i] <- max(adjPValues[i - 1], ifelse((alpha*m)/(m-i+1)<=1, ((m-i+1)/m)*(1 - (1 - spval[i])^(m - i + 1)), 0))#(0)?! adjPValues <- adjPValues[rindex] # obtain the original order #rejected <- (adjustedPValues <= alpha) # either this or SUD leads to rejected if (! silent) { cat("\n\n\t\tBenjamini-Liu's (1999) step-down procedure\n\n") printRejected(rejected, pValues, adjPValues) } return(list(adjPValues=adjPValues, criticalValues=criticalValues, rejected=rejected, errorControl = new(Class='ErrorControl',type="FDR",alpha=alpha))) } mutoss.BL <- function() { return(new(Class="MutossMethod", label="Benjamini-Liu (1999) step-down", errorControl="FDR", callFunction="BL", output=c("adjPValues", "criticalValues", "rejected", "errorControl"), assumptions=c("Independent test statistics."), info="

Benjamini-Liu (1999) step-down

\n\n

Reference:

  • Bejamini, Y. and Liu, W. (1999). \" A step-down multiple hypotheses testing procedure that controls the false discovery rate under independence . \" Journal of Statistical Planning and Inference Vol. 82(1-2): 163-170.
  • \n

Benjamini-Liu's step-down procedure is applied to pValues. The procedure controls the FDR if the corresponding test statistics are stochastically independent. In Benjamini and Liu (1999) a large simulation study concerning the power of the two procedures suggested that the BL step-down procedure is more powerfull then the Linear Step-Up (BH) when the number of hypotheses is small. This is also the case when most hypotheses are far from the null. The BL step-down method calculates critical values according to Benjamin and Liu (1999), i.e. ci = 1 - (1 - min(1, m*α/(m-i+1)))(1/(m-i+1)) for i = 1,...,m, where m is the number of hypotheses tested. Then, let k be the smallest i for which P(i) > ci and reject associated hypotheses H(1),...,H(k-1).", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric")) )) } #-------------------- BH Linear Step Up--------------------# BH <- function(pValues, alpha, silent=FALSE) { m <- length(pValues) criticalValues <- sapply(1:m, function(i) (i*alpha)/m) adjPValues <- p.adjust(pValues, "BH") rejected <- (adjPValues <= alpha) if (! silent) { cat("\n\n\t\tBenjamini-Hochberg's (1995) step-up procedure\n\n") printRejected(rejected, pValues, adjPValues) } return(list( adjPValues=adjPValues, criticalValues=criticalValues, rejected=rejected, errorControl = new(Class='ErrorControl',type="FDR",alpha=alpha))) } mutoss.BH <- function() { return(new(Class="MutossMethod", label="Benjamini-Hochberg (1995) step-up", errorControl="FDR", callFunction="BH", output=c("adjPValues", "criticalValues", "rejected", "errorControl"), assumptions=c("independence or positive regression dependency"), info="

Benjamini-Hochberg (1995) Linear Step-Up Procedure

\n\n\

The Benjamini-Hochberg (BH) linear step-up procedure controls the FDR if the test statistics are stochastically independent or satisfy positive regression dependency (see Benjamini and Yekutieli 2001 for details). In their seminal paper, Benjamini and Hochberg (1995) suggest the False Discovery Rate (FDR) as an alternative error criterion to the Family-Wise-Error-Rate and show that for 0<=m0<=m independent pValues corresponding to true null hypotheses and for any joint distribution of the m1=m-m0 p-values corresponding to the non-null hypotheses the FDR is controlled at level (m0/m)*α. Benjamini and Yekutieli show (2001) that this procedure controls the FDR in a much more general setting i.e. when the PRDS condition is satisfied. #####Benjamini et al. (2006) improved by adaptive procedures which use an estimate of m0 and apply the BH method at level α'=&alpha*m/m0, to fully exhaust the desired level α.

\n

References:

\
    \
  • Benjamini, Y. and Hochberg, Y. (1995). \" Controlling the false discovery rate: A practical and powerful approach to mulitple testing. \" Journal of the Royal Statistical Society, Series B, 57:289-300.
  • \n\
  • Benjamini, Y. and Yekutieli, D. (2001). \" The control of the false discovery rate in multiple testing under dependency. \" Annals of Statistics, 29(4):1165-1188.
  • \n\
  • Benjamini, Y., Krieger, A. and Yekutieli, D. \" Adaptive linear step-up procedures that control the false discovery rate. \" Biometrika, 93(3):491-507, 2006.
  • \n\
", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric")) )) } BY <- function(pValues, alpha, silent=FALSE) { m <- length(pValues) a <- sum(1/(1:m)) criticalValues <- sapply(1:m, function(i) (i*alpha)/(a*m)) #rejected <- SU(pValues, criticalValues) adjPValues <- p.adjust(pValues, "BY") rejected <- (adjPValues <= alpha) if (! silent) { cat("\n\n\t\tBenjamini-Yekutieli's (2001) step-up procedure\n\n") printRejected(rejected, pValues, adjPValues) } return(list(adjPValues=adjPValues, criticalValues=criticalValues, rejected=rejected, errorControl = new(Class='ErrorControl',type="FDR",alpha=alpha))) } mutoss.BY <- function() { return(new(Class="MutossMethod", label="Benjamini-Yekutieli (2001) step-up", errorControl="FDR", callFunction="BY", output=c("adjPValues", "criticalValues", "rejected", "errorControl"), assumptions=c("any dependency structure"), info="

Benjamini-Yekutieli (2001) step-up procedure

\n\n\

Reference:

\
    \
  • Bejamini, Y. and Yekutieli, D. (2001). \" The control of the false discovery rate in multiple testing under dependency. \" Annals of Statistics, 29(4):1165-1188.
  • \n\

The Benjamini-Yekutieli step-up procedure is applied to pValues. The procedure ensures FDR control for any dependency structure. The critical values of the Benjamini-Yekutieli (BY) procedure are calculated by replacing the α of the Benjamini-Hochberg procedure by α/(∑1/i), i.e. c(i)=i*α/m*(∑1/i) for i=1,...,m. For large number m of hypotheses the critical values of the BY procedure and the BH procedure differ by a factor log(m). Benjamini and Yekutieli (2001) showed that this step-up procedure controls the FDR at level α*m/m0 for any test statistics dependency structure.

\n", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric")) )) } hochberg <- function(pValues, alpha, silent=FALSE) { m <- length(pValues) criticalValues <- sapply(1:m, function(i) alpha/(m-i+1)) #rejected <- SU(pValues, criticalValues) adjPValues <- p.adjust(pValues, "hochberg") rejected <- (adjPValues <= alpha) if (! silent) { cat("\n\n\t\tHochberg's (1988) step-up procedure\n\n") printRejected(rejected, pValues, adjPValues) } return(list(adjPValues=adjPValues, criticalValues=criticalValues, rejected=rejected, errorControl = new(Class='ErrorControl',type="FWER",alpha=alpha))) } mutoss.hochberg <- function() { return(new(Class="MutossMethod", label="Hochberg (1988) step-up", errorControl="FWER", callFunction="hochberg", output=c("adjPValues", "criticalValues", "rejected", "errorControl"), assumptions=c("independent tests"), info="

Hochberg (1988) step-up procedure

\n\n\

Reference:

\
    \
  • Hochberg, Y. (1988). A sharper Bonferroni procedure for multiple tests of significance. Biometrika, 75:800-802.
  • \n\
  • Huang, Y. and Hsu, J. (2007). Hochberg's step-up method: cutting corners off Holm's step-down method. Biometrika, 94(4):965-975.
  • \n

The Hochberg step-up procedure is based on marginal p-values. It controls the FWER in the strong sense under joint null distributions of the test statistics that satisfy Simes' inequality. The Hochberg procedure is more powerful than Holm's (1979) procedure, but the test statistics need to be independent or have a distribution with multivariate total positivity of order two or a scale mixture thereof for its validity (Sarkar, 1998). Both procedures use the same set of critical values c(i)=α/(m-i+1). Whereas Holm's procedure is a step-down version of the Bonferroni test, and Hochberg's is a step-up version of the Bonferroni test. Note that Holm's method is based on the Bonferroni inequality and is valid regardless of the joint distribution of the test statistics.

\n", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric")) )) } adaptiveBH <- function(pValues, alpha, silent=FALSE) { m <- length(pValues) pi0.ABH <- ABH_pi0_est(pValues)$pi0 criticalValues <- sapply(1:m, function(i) (i*alpha)/(m*pi0.ABH)) adjPValues <- p.adjust(pValues,"BH")*pi0.ABH rejected <- (adjPValues <= alpha) if (! silent) { cat("\n\n\t\tBenjamini-Hochberg (2000) adaptive step-up procedure\n\n") printRejected(rejected, pValues, adjPValues) } return(list(adjPValues=adjPValues, criticalValues=criticalValues, rejected=rejected, pi0=pi0.ABH, errorControl = new(Class='ErrorControl',type="FDR",alpha=alpha))) } mutoss.adaptiveBH <- function() { return(new(Class="MutossMethod", label="Benjamini-Hochberg (2000) adaptive step-up", errorControl="FDR", callFunction="adaptiveBH", output=c("adjPValues", "criticalValues", "rejected", "pi0", "errorControl"), assumptions=c("independence or positive regression dependency"), info="

Benjamini-Hochberg (2000) adaptive linear step-up procedure

\n\n\

Reference:

\
    \
  • Benjamini, Y. and Hochberg, Y. (2000). On the Adaptive Control of the False Discovery Rate in Multiple Testing With Independent Statistics. Journal of Educational and Behavioral Statistics, 25(1): 60-83.
  • \n\
  • Benjamini, Y. and Hochberg, Y. (1995). Controlling the false discovery rate: A practical and powerful approach to mulitple testing. Journal of the Royal Statistical Society, Series B, 57:289-300.
  • \n\
  • Hochberg, Y. and Benjamini, Y. (1990). More powerful procedures for multiple significance testing. Statistics in Medicine 9, 811-818.
  • \n

The adaptive Benjamini-Hochberg step-up procedure is applied to pValues. It controls the FDR at level alpha for independent or positive regression dependent test statistics. In the adaptive Benjamini-Hochberg step-up procedure the number of true null hypotheses is estimated first as in Hochberg and Benjamini (1990), and this estimate is used in the procedure of Benjamini and Hochberg (1995) with alpha'=alpha*m/m0. The method for estimating m0 is motivated by the graphical approach proposed by Schweder and Spjotvoll (1982), as developed and presented in Hochberg and Benjamini (1990).

\n", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric")) )) } #---------------------- Adaptive STS-----------------# adaptiveSTS <- function(pValues, alpha, lambda=0.5, silent=FALSE) { m <- length(pValues) adjP <- p.adjust(pValues,"BH") pi0 <- storey_pi0_est(pValues, lambda)$pi0 criticalValues <- sapply(1:m, function(i) (i*alpha)/(m*pi0)) adjPValues <- adjP*min(pi0, 1) rejected <- (adjPValues <= alpha) if (! silent) { cat("\n\n\t\tStorey-Taylor-Siegmund (2004) adaptive step-up procedure\n\n") printRejected(rejected, pValues, adjPValues) } return(list(adjPValues=adjPValues, criticalValues=criticalValues, rejected=rejected, pi0=pi0, errorControl = new(Class='ErrorControl',type="FDR",alpha=alpha))) } mutoss.adaptiveSTS <- function() { return(new(Class="MutossMethod", label="Storey-Taylor-Siegmund (2004) adaptive step-up", errorControl="FDR", callFunction="adaptiveSTS", output=c("adjPValues", "criticalValues", "rejected", "pi0", "errorControl"), assumptions=c("test independence or positive regression dependency"), info="

Storey-Taylor-Siegmund (2004) adaptive step-up procedure

\n\n

The adaptive STS method uses a conservative estimate of pi0 which is plugged in a linear step-up procedure. The estimation of pi0 requires a parameter λ which is set to 0.5 by default. Note that the estimated pi0 is truncated at 1 as suggested by the author, so the implemetation of the procedure is not entirely supported by the proof in the reference.

\n

Reference:

  • Storey, J.D., Taylor, J.E. and Siegmund, D. \" Strong control, conservative point estimation and simultaneous conservative consistency of false discovery rates: a unified approach.\" Journal of the Royal Statistical Society, B 66(1):187-205, 2004.
  • \n
", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric"), lambda=list(type="numeric", default = 0.5)) )) } #---------------------------- Sidack Step Down--------------------------------# SidakSD <- function(pValues, alpha, silent=FALSE) { m <- length(pValues) criticalValues <- sapply(1:m, function(i) 1-(1-alpha)^(1/(m-i+1))) #rejected <- SD(pValues, criticalValues) tmp <- mt.rawp2adjp(pValues, "SidakSD") adjPValues <- tmp$adjp[order(tmp$index),2] rejected <- (adjPValues <= alpha) if (! silent) { cat("\n\n\tSidak-like (1987) step-down procedure\n\n") printRejected(rejected, pValues, NULL) } return(list(adjPValues=adjPValues, criticalValues=criticalValues, rejected=rejected, errorControl = new(Class='ErrorControl',type="FWER",alpha=alpha))) } mutoss.SidakSD <- function() { return(new(Class="MutossMethod", label="Sidak-like (1987) step-down", errorControl="FWER", callFunction="SidakSD", output=c("adjPValues", "criticalValues", "rejected", "errorControl"), assumptions=c("test independence","positive orthant dependent test statistics"), info="

Sidak-like (1987) step-down procedure

\n\n\

Reference:

\
    \
  • Hollander, B.S. and Covenhaver, M.D. \" An Improved Sequentially Rejective Bonferroni Test Procedure.\" Biometrics, 43(2):417-423, 1987.
  • \n\

The Sidak-like step-down procedure is an improvement over Holm's (1979) step-down procedure. The improvement is analogous to the Sidak's correction over the original Bonferroni procedure. This Sidak-like step-down procedure assumes positive orthant dependent test statistics.

\n", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric")) )) } #----------------------------------Blanchard Roquain 2008 ----------------------# indepBR <- function(pValues, alpha, lambda=1, silent = FALSE) { if ( lambda <= 0 || lambda >= 1/alpha) { stop('indepBR() : lambda should belong to (0, 1/alpha)') } len <- length(pValues) criticalValues <- sapply( 1:len, function(i) alpha * min( i * ( 1 - lambda * alpha) / (len - i + 1) , lambda ) ) rejected <- SU(pValues, criticalValues) if (! silent) { cat("\n\n\t\t Blanchard-Roquain 1-stage step-up under independence (2009)\n\n") printRejected(rejected, pValues) } return(list(rejected = rejected, criticalValues = criticalValues, errorControl = new(Class='ErrorControl',type="FDR",alpha=alpha))) } mutoss.indepBR <- function() { return(new(Class="MutossMethod", label="Blanchard-Roquain adaptive step-up (2009)", errorControl="FDR", callFunction="indepBR", output=c("criticalValues", "rejected", "errorControl"), assumptions=c("p-value independence"), info="

Blanchard-Roquain (2009) 1-stage adaptive step-up

\n\n\

Reference:

\
    \
  • Blanchard, G. and Roquain, E. \" Adaptive False Discovery Rate Control under Independence and Dependence.\" Journal of Machine Learning Research 10:2837-2871, 2009. .
  • \n\

This is a step-up procedure with critical values\n\ Ci = alpha * min( i * ( 1 - lambda * alpha) / (m - i + 1) , lambda )\n\ where alpha is the level at which FDR should be controlled and lambda an \ arbitrary parameter belonging to (0, 1/alpha) with default value 1. \ This procedure controls FDR at the desired level when the p-values are independent.

", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric"), lambda=list(type="numeric", default=1)) )) } #----------------------------Blanchard Roquain 2009---------------------# twostageBR <- function(pValues, alpha, lambda=1, silent = FALSE) { if ( lambda <= 0 || lambda >= 1/alpha) { stop('twostageBR() : lambda should belong to (0, 1/alpha)') } m <- length(pValues) stage1 <- indepBR( pValues, alpha, lambda, silent = TRUE) pi0inv <- ( 1 - lambda*alpha )*m / ( m + 1 - sum(stage1$rejected) ) BHadjPValues <- p.adjust(pValues,"BH") rejected <- ( BHadjPValues <= alpha*pi0inv ) if (! silent) { cat("\n\n\t\tBlanchard-Roquain (2009) 2-stage step-up Procedure\n\n") printRejected(rejected, pValues) } return(list(rejected=rejected, errorControl = new(Class='ErrorControl',type="FDR",alpha=alpha))) } mutoss.twostageBR <- function() { return(new(Class="MutossMethod", label="Blanchard-Roquain 2-stage adaptive step-up (2009)", errorControl="FDR", callFunction="twostageBR", output=c("rejected", "errorControl"), assumptions=c("p-value independence"), info="

Blanchard-Roquain 2-stage step-up under independence

\n\n\

Reference:

\
    \
  • Blanchard, G. and Roquain, E. \" Adaptive False Discovery Rate Control under Independence and Dependence.\" Journal of Machine Learning Research 10:2837-2871, 2009. .
  • \n\
\

This is an adaptive linear step-up procedure where the proportion of true\ nulls is estimated using the Blanchard-Roquain 1-stage procedure with parameter lambda,\ via the formula\n\ estimated pi0 = ( m - R(alpha,lambda) + 1) / ( m*( 1 - lambda * alpha ) )\n\ where R(alpha,lambda) is the number of hypotheses rejected by the BR 1-stage procedure, alpha is the level at which FDR should be controlled and lambda an arbitrary parameter belonging to (0, 1/alpha) with default value 1. This procedure controls FDR at the desired level when the p-values are independent.

", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric"), lambda=list(type="numeric",default=1)) )) } mutoss/R/Rank_Truncated.R0000644000176200001440000000305114404103107015025 0ustar liggesusers# # # Author: FrankKonietschke ############################################################################### ranktruncated <- function(pValues, K, silent = FALSE){ L <- length(pValues) if (L>1000) { warning("Method implementation is numerical instable for large numbers of p-values. Please do not rely on results.") } if (K > L){ warn1 <- paste("K must be smaller than L") stop(warn1) } #-----Compute the test statistic-----# index <- order(pValues) rindex <- order(index) spval <- pValues[index] w <- prod(spval[1:K]) #---Compute the used pvalues--------# w.pvalues <- pValues[rindex] p.used <- data.frame(Position=index[1:K], pValue=spval[1:K]) #--Compute the function awt as in the paper-----# awt <- function(w,t,K){ if (w<=t^K){ s <- c(0:(K-1)) num1 <- K*log(t)-log(w) num2 <- w * sum(num1^s/factorial(s)) } if (w > t^K) { num2<- t^K } return(num2) } # ----- Compute now the exact distribution-----# fac1 <- choose(L, K+1)*(K+1) t <- seq(0.001,0.999,0.001) terg <- c() for (i in 1:length(t)){ terg[i] <- (1-t[i])^(L-K-1)*awt(w,t[i],K) } #--------------Compute the p-Value -------------# distribution <- fac1*mean(terg) #-Regarding the error of numerical integration-# p1 <- (distribution>1) distribution[p1] <- 1 #--------------Prepare the output---------------# if (! silent) { cat("#----Rank Truncated Product of P-Values (Dubridge and Koeleman; 2003) \n\n") } result <- data.frame(Statistic = w, p.Value=distribution) return(list(Used.pValue=p.used, RTP=result)) } mutoss/R/REGWQ.R0000644000176200001440000001302614404061507013020 0ustar liggesusers# REGWQ - Ryan / Einot and Gabriel / Welsch test procedure # # Author: FrankKonietschke ############################################################################### regwq <- function(formula, data,alpha, MSE=NULL, df=NULL, silent = FALSE){ dat <- model.frame(formula, data) if (ncol(dat) != 2) { stop("Specify one response and only one class variable in the formula") } if (is.numeric(dat[, 1]) == FALSE) { stop("Response variable must be numeric") } response <- dat[, 1] group <- as.factor(dat[, 2]) fl <- levels(group) a <-nlevels(group) N <- length(response) samples <- split(response,group) n <- sapply(samples,"length") mm <- sapply(samples,"mean") vv <- sapply(samples,"var") if (is.null(MSE)){ MSE <- sum((n-1)*vv)/(N-a) } if (is.null(df)){ df <- N-a } nc <- a*(a-1)/2 order.h1 <- data.frame(Sample=fl, Size=n, Means=mm,Variance=vv) ordered <- order.h1[order(order.h1$Means,decreasing=FALSE), ] rownames(ordered) <- 1:a #---------------- Compute helping indices ----------# i <- 1:(a-1) h1 <- list() for(s in 1:(a-1)){ h1[[s]]<- i[1:s] } vi <- unlist(h1) j <- a:2 h2 <-list() for (s in 1:(a-1)){ h2[[s]] <- j[s:1] } vj <- unlist(h2) h3 <- list() h4 <- list() for (s in 1:(a-1)){ h3[[s]] <- rep(j[s],s) h4[[s]] <- rep(i[s],s) } Nmean <- unlist(h3) Step <- unlist(h4) #--------Compute the Mean Differences---------# mean.difference <- sapply(1:nc,function(arg){ i <- vi[arg] j <- vj[arg] (ordered$Means[j]-ordered$Means[i]) }) mean.difference <- round(mean.difference, 4) # ------- Compute the test statistics --------# T <- sapply(1:nc,function(arg){ i<-vi[arg] j<-vj[arg] (ordered$Means[j]-ordered$Means[i])/sqrt(MSE/2*(1/ordered$Size[i] + 1/ordered$Size[j])) }) T <- round(T, 4) #-------Compute the adjusted p-Values-------# pvalues <- ptukey(T,Nmean,df,lower.tail=FALSE) #------Compute the adjusted alpha-levels----# alpha.level <- 1-(1-alpha)^(Nmean/a) level1 <- (Nmean==a) level2 <- (Nmean==a-1) level3 <- level1 + level2 alpha.level[level3==1] <- alpha alpha.level <- round(alpha.level,4) # ----- Compute now the critical value -----# quantiles <- qtukey(1-alpha.level,Nmean,df) for (h in 1:(nc-1)){ if (quantiles[h+1] >=quantiles[h]){ quantiles[h+1] <- quantiles[h] } } #---- Calculate the rejected Hypotheses ------# Rejected1 <- (pvalues=vj) Under2 <- (vi[s]<=vi) Under3 <- Under1 * Under2 Under4 <- which(Under3==1) Rejected1[Under4] <- FALSE } } #-----Prepare the pValues for the Output----# Out1 <- (pvalues < alpha.level) Out2 <- (Rejected1 == FALSE) Out3 <- Out1 * Out2 Out4 <- (Out3 == 1) pvalues <- round(pvalues,4) quantiles <- round(quantiles,4) pvalues[Out4] <- paste(">",alpha.level[Out4]) quantiles[Out4] <- paste(">", T[Out4]) variances.output <- data.frame(Overall=MSE, df=df) Comparison <- data.frame(Comparison=names.ordered,Diff=mean.difference, Statistic=T,Quantiles=quantiles, Adj.P=pvalues, Alpha.Level=alpha.level, Rejected=Rejected1, Layer = Step) if (!silent) { cat("#----REGWQ - Ryan / Einot and Gabriel / Welsch test procedure \n\n") printRejected(Comparison$Rejected, pvalues, Comparison$Adj.P) } #result <- list(Ordered.Means = ordered, Variances=variances.output, # REGWQ = Comparison) #diffm<-matrix(c(Comparison["Diff"],rep(NA,length(Comparison["Diff"])*2)),nrow=length(Comparison["Diff"])) diffm<-cbind(Comparison$Diff,rep(NA,length(Comparison$Diff)),rep(NA,length(Comparison$Diff))) diffm<-matrix(diffm,nrow=length(Comparison$Diff)) rownames(diffm)<-Comparison$Comparison return(list(adjPValues=Comparison$Adj.P, rejected=Comparison$Rejected, statistic=Comparison$Statistic, confIntervals=diffm,errorControl = new(Class='ErrorControl',type="FWER",alpha=alpha))) } mutoss.regwq <- function() { return(new(Class="MutossMethod", label="Ryan / Einot and Gabriel / Welsch test", errorControl="FWER", callFunction="regwq", output=c("adjPValues","rejected","statistic","confIntervals","errorControl"), info="

Ryan / Einot and Gabriel / Welsch test procedure. The procedure controls the FWER.

\n\n\

It is based on a stepwise or \ layer approach to significance testing. Sample means are \ ordered from the smallest to the largest. The largest \ difference, which involves means that are r = p steps apart, \ is tested first at alpha level of significance; if significant, \ means that are r < p steps apart are tested at an adjusted alpha level \ of significance and so on. \ The alpha levels are adjusted for the p-1 different\ layers by the formula alpha_p= alpha, if p=k or p=k-1,\ alpha_p = 1-(1-\alpha)^{p/k} otherwise.

\n\

Reference:

\
    \
  • Hochberg, Y., Yamhane, A.C. (1987). \" Multiple Comparison Procedures \ \" Wiley, New York.
  • \n\
", parameters=list(formula=list(type="formula"), data=list(type="ANY"), alpha=list(type="numeric"), MSE=list(type="numeric"), df=list(type="numeric")) ) ) } mutoss/R/moreSUDprocedures.R0000644000176200001440000001742314404061507015552 0ustar liggesusers# # Author: JonathanRosenblatt ############################################################################### #---------- Service Functions---------# reject<- function(sorted, criticals){ m<- length(sorted) stopifnot( length(criticals) == m ) indicators<- sorted0 , j>=1 , j<=m , r>=0 , r<=m) adjusted<- ifelse(a>0.5, 1 , a/(1-a) ) temp.min<- adjusted[m] for(i in m:j){ if(adjusted[i]<=temp.min) temp.min<- adjusted[i] else adjusted[i]<- temp.min } return(adjusted) }# Close solve.q function two.stage.adjust<- function(sorted, r=0, patience=4, m){ adjusted<- rep(0,m) # Adjusting sorted p-values adjusted.q<- solve.q(sorted=sorted,m=m,j=1,r=0) checking<- adjusted.q #Has the procedure rejected everything at the first stage? if(sum(linearStepUp(sorted,adjusted.q[1]/(1+adjusted.q[1]),m=m)$Pvals[['rejected']])==m){ adjusted.q<- rep(adjusted.q[1],m) return(adjusted.q) } else{ for (j in 1:m) { delta.r<- 1 delta.q<- 1 new.q<- adjusted.q[j] r.new<- sum(linearStepUp(sorted,new.q/(1+new.q),m=m)$Pvals[['rejected']]) counter<- 0 max.q<- 0 while(delta.r>0 & delta.q>0){ old.q<- new.q r.old<- r.new new.q<- solve.q(sorted=sorted,m=m,j=j,r=r.old)[j] r.new<- sum(linearStepUp(sorted,new.q/(1+new.q),m=m)$Pvals[['rejected']]) delta.r<- abs(r.new-r.old) delta.q<- abs(new.q-old.q) counter<- counter+1 if(counter>patience & max.q!=new.q) max.q<- max(max.q,new.q) else if(counter>patience & max.q==new.q ) break } #Close interations inside q[j] adjusted.q[j]<- min(new.q,1) adjusted.q[min(j+1,m)]<- adjusted.q[j] stopifnot(any(adjusted.q[j]<=checking[j])) }#Close looping over j. temp.min<- adjusted.q[m] for(i in m:1){ if(adjusted.q[i]<=temp.min) temp.min<- adjusted.q[i] else adjusted.q[i]<- temp.min } return(adjusted.q) }#Close 'else' clause }# Close two.stage.adjust two.stage<- function(pValues, alpha){ ranks<- rank(pValues) sorted<-sort(pValues) m<- length(sorted) #Stage I- estimating m0 q1<- alpha/(1+alpha) stage.one<- linearStepUp(sorted, q1, adjust=TRUE, m=m) r<- sum(stage.one$Pvals[['rejected']]) #count rejection if (r==0) { #if nothing is rejected, return the results of the linear step up stage.one$Pvals[['adjusted.pvals']]<- 1 return(stage.one) } else if (r==m) { stage.one$Pvals[['adjusted.pvals']]<- stage.one$Pvals[['adjusted.pvals']][1] return(stage.one) } #Stage II- updating alpha using m0 else { m0<- m-r output<- linearStepUp(sorted=sorted,q=q1,m0=m0,m=m) output$Pvals[['adjusted.pvals']]<- two.stage.adjust(sorted, alpha, m=m) output<-output$Pvals[ranks,] output.2<- list( criticalValues=output$criticals, rejected=output$rejected, adjPValues=output$adjusted.pvals, errorControl=new(Class='ErrorControl',type="FDR",alpha=alpha), pi0= m0/m ) return(output.2) } } #pvals<- runif(100,0,0.1) #two.stage(pvals,0.1) mutoss.two.stage<- function() { return(new(Class="MutossMethod", label="B.K.Y. (2006) Two-Stage Step-Up", errorControl="FDR", callFunction="two.stage", output=c("adjPValues", "criticalValues", "rejected", "pi0", "errorControl"), assumptions=c("Independent test statistics"), info="

Benjamini-Krieger-Yekutieli (2006) Two-Stage Step-Up Procedure

\n\n

A p-value procedure which controls the FDR at level α for independent test statistics, in which case it is more powerful then non adaptive procedures such as the Linear Step-Up (BH). On the other hand, when this is not the case, no error control is guaranteed. The linear step-up procedure is used in he first stage to estimate the number of true null hypotheses (mo) which is plugged in a linear step-up procedure at the second stage.

Reference:

  • Benjamini, Y., Krieger, A. and Yekutieli, D. \" Adaptive linear step-up procedures that control the false discovery rate. \" Biometrika, 93(3):491-507, 2006.
  • \n
", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric")) )) } #---------------------Multistage Step-Down-------------------# multiple.down.adjust<- function(sorted, m){ adjusted<- rep(NA,m) temp.max<- sorted[1] max.ind<- rep(0,m) for (i in 1:m) { temp<- min(sorted[i]*(m+1-i)/(i*(1-sorted[i])),1) if ( temp >= temp.max ) { temp.max <- temp max.ind[i] <- 1 } adjusted[i]<- temp.max } return(adjusted) } multiple.down=function(pValues, alpha){ sorted<- sort(pValues) ranks<- rank(pValues) m<- length(pValues) if(alpha>0.5) warning('FDR is not controlled when q>0.5') criticals<- sapply(1:m,function(i) alpha*i/(m-i*(1-alpha)+1)) indicators<- sorted Adaptive linear step-up procedures that control the false discovery rate.
\" Biometrika, 93(3):491-507, 2006. \n ", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric")) )) } mutoss/R/Tukey.R0000644000176200001440000000404714404061507013237 0ustar liggesusers# Tukey HSD Test in parametric factorial designs # # Author: FrankKonietschke ############################################################################### tukey.wrapper <- function(model, alpha,factorC) { model <- aov(model) tukeyObj <- TukeyHSD(model,conf.level=1-alpha, factorC) estimates <- c(tukeyObj)[[1]][,1] confintL <- c(tukeyObj)[[1]][,2] confintU <- c(tukeyObj)[[1]][,3] confi <- cbind(estimates, confintL, confintU) pvalues <- c(tukeyObj)[[1]][,4] rejected1 <- (pvalues < alpha) #confi <- cbind(confint) print(cbind(confi,pvalues)) return(list(adjPValues=pvalues,rejected=rejected1,confIntervals= confi, errorControl = new(Class='ErrorControl',type="FWER",alpha=alpha))) } #tukey.wrapper(aov(breaks~wool*tension,data=warpbreaks),alpha=0.05,"tension") mutoss.tukey<- function() { return(new(Class="MutossMethod", label="Tukey HSD Test", errorControl="FWER", callFunction="tukey.wrapper", output=c("adjPValues", "rejected","confIntervals","errorControl"), info="

Tukey HSD test and simultaneous confidence intervals in parametric factorial designs

'With this function, it is possible to compute all pairs comparisons for expectations and simultaneous confidence intervals in factorial linear models. Hereby, the all-pairs comparisons can be performed for user given effects. The overall variance is estimated by the linear model as well as the degree of freedom used by the studentized range distribution.

Reference:

  • Tukey, J.W. \"The problem of multiple comparisons. Unpublished manuscript reprinted in: The Collected Works of John W. Tukey (1953).\" Volume 8 (1994),Braun, H.I. (ed.), Chapman and Hall, New York.
", parameters=list(model=list(type="ANY"), alpha=list(type="numeric"), factorC=list(type="character", label="Factor for Comparison", fromR="FactorVar") ) )) } mutoss/R/Augmentation.R0000644000176200001440000000625714404061507014576 0ustar liggesusers augmentation <- function(adjPValues, newErrorControl, newK, newQ, silent=FALSE) { if (newErrorControl == "gFWER") { out = fwer2gfwer(adjPValues, k = newK) if(!silent) cat('\n\n\t\tGeneralized Family-Wise Error Rate\n\n') return(list(adjPValues=as.numeric(out), rejected=NULL, errorControl = new(Class='ErrorControl',type="gFWER"))) } else if (newErrorControl == "FDX") { out = fwer2tppfp(adjPValues, q = newQ) if(!silent) cat('\n\n\t\tTail Probability of the Proportion of False Positives\n\n') return(list(adjPValues=as.numeric(out), rejected=NULL, errorControl = new(Class='ErrorControl',type="FDX"))) } else if (newErrorControl == "FDR") { out = fwer2fdr(adjPValues, method = "restricted") if(!silent) cat('\n\n\t\tFalse Discovery Rate\n\n') return(list(adjPValues=as.numeric(out$adjp), rejected=NULL, errorControl = new(Class='ErrorControl',type="FDR"))) } else{ if(!silent)cat('\n\n\t\tUnknown newErrorControl method') } } mutoss.augmentation <- function() { return(new(Class="MutossMethod", label="Augmentation MTP adjusted p-values", errorControl=c("FWER"), callFunction="augmentation", output=c("adjPValues", "rejected", "errorControl"), info="

Augmentation MTP adjusted p-values

Wrapper function to the augmentation methods of the multtest package.

The augmentation method turns a vector of p-values which are already adjusted for FWER control into p-values that are adjusted for gFWER, FDX or FDR. The underlying idea (for gFWER and FDX) is that the set of hypotheses rejected at a given level alpha under FWER can be 'augmented' by rejecting some additional hypotheses while still ensuring (strong) control of the desired weaker type I criterion. For FDR, it uses the fact that FDX control for q=alpha=1-sqrt(1-beta) entails FDR control at level beta.

Use of these augmentation methods is recommended only in the situation where FWER-controlled p-values are directly available from the data (using some specific method). When only marginal p-values are available, it is generally prerefable to use other adjustment methods directly aimed at the intended criterion (as opposed to first adjust for FWER, then augment)

Note: In the multtest package, two methods ('restricted' and 'conservative') are available for FDR augmentation. Here the 'restricted' method is forced for FDR augmentation since it is in fact always valid and better than 'conservative' (M. van der Laan, personal communication) with respect to power.

Reference:

  • S. Dudoit, M.J. van der Laan. \" Multiple Testing Procedures with Applications to Genomics\", Springer, 2008. (chapter 6)
  • \n\
", # TODO: <- Add the possibility of filling the rejected slot? (need additional input alpha) parameters=list(adjPValues=list(type="numeric"), newErrorControl=list(type="character", label="New error control", choices=c("FDR","FDX","gFWER")), newK=list(type="numeric", optional=TRUE, label="For gFWER set k"), newQ=list(type="numeric", optional=TRUE, label="For FDX set q") ))) } mutoss/R/marginal.R0000644000176200001440000003175314404061507013734 0ustar liggesusers# TODO: Add comment # # Author: wiebke ############################################################################### #### one sample model #### onesamp.model <- function() { return(list(model=list(typ="onesamp"))) } mutoss.onesamp.model <- function() { return(new(Class="MutossMethod", label="One-sample test", callFunction="onesamp.model", output=c("model"), info="

One sample model

The input for this one sample model is a data matrix whose columns represent the samples and the rows represent the multiple endpoints. E.g. for genomics this would be a gene matrix, where each row gives the expression for a single gene.

For the next steps you have the following choices:

Either marginal hypotheses tests (if robust Wilcoxon otherwise t-test) could be performed on each row of the data matrix to obtain raw p-values which then need to be adjusted for multiplicity to control a chosen error rate.

Or resampling based methods could be performed based on Dudoit and van der Laan (2007) to obtain adjusted p-values which control the FWER. Afterwards it is possible to use augmentation procedures to get adjusted p-values for control of FDR, FDX or gFWER.

Reference:

  • Dudoit, S. and van der Laan, M.J. (2007). Mulitple Testing Procedures and Applications to Genomics. Springer Series in Statistics.
", parameters=list( ) )) } onesamp.marginal <- function(data, robust, alternative, psi0) { result <- NULL if (robust) { result <- apply(data, 1, function(x) {wilcox.test(x, alternative=alternative, mu=psi0)$p.value} ) } else { result <- apply(data, 1, function(x) {t.test(x ,alternative=alternative, mu=psi0)$p.value} ) } return(list(pValues=result)) } mutoss.onesamp.marginal.model <- function(model) { return("typ" %in% names(model) && model$typ == "onesamp") } mutoss.onesamp.marginal <- function() { return(new(Class="MutossMethod", label="One-sample test", callFunction="onesamp.marginal", output=c("pValues"), info="

Marginal one sample test.

The robust version uses the Wilcoxon-Mann-Whitney test, otherwise a t-test will be performed.

Reference:

  • Wilcoxon, F. (1945). Individual Comparisons by Ranking Methods. Biometrics Bulletin 1:80-83.
  • \n\
  • Mann, H. and Whitney, D. (1947). On a test of whether one of two random variables is stochastically larger than the other. Annals of Mathematical Statistics 18:50-60
  • \n\
  • Student (1908).The probable error of a mean. Biometrika, 6(1):1-25.
  • \n
", parameters=list( data=list(type="ANY"), robust=list(type="logical", label="Robust statistic"), alternative=list(type="character", label="Alternative", choices=c("two.sided", "less", "greater")), psi0=list(type="numeric", label="Hypothesized null value", default=0) ) )) } #### two sample model #### twosamp.model <- function(classlabel) { classlabel <- as.vector(classlabel) return(list(model=list(typ="twosamp", classlabel=classlabel))) } mutoss.twosamp.model <- function() { return(new(Class="MutossMethod", label="Two sample test", callFunction="twosamp.model", output=c("model"), info="

Two sample model

The input for this one sample model is a data matrix whose columns represent the samples and the rows represent the multiple endpoints. E.g. for genomics this would be a gene matrix, where each row gives the expression for a single gene.

Furthermore, a classlabel needs to be provided to distinguish the two sample groups.

For the next steps you have the following choices:

Either marginal hypotheses tests (if robust Wilcoxon otherwise t-test) could be performed on each row of the data matrix to obtain raw p-values which then need to be adjusted for multiplicity to control a chosen error rate.

Or resampling based methods could be performed based on Dudoit and van der Laan (2007) to obtain adjusted p-values which control the FWER. Afterwards it is possible to use augmentation procedures to get adjusted p-values for control of FDR, FDX or gFWER.

Reference:

  • Dudoit, S. and van der Laan, M.J. (2007). Mulitple Testing Procedures and Applications to Genomics. Springer Series in Statistics.
", parameters=list( classlabel=list(type="RObject", label="classlabel") ) )) } twosamp.marginal <- function(data, model, robust, alternative, psi0, equalvar) { label <- as.numeric(as.factor(model$classlabel)) result <- NULL if (robust) { result <- apply(data, 1, function(x) {wilcox.test(x=x[ ,label==1], y=x[label==2], alternative=alternative, mu=psi0)$p.value} ) } else { result <- apply(data, 1, function(x) {t.test(x=x[ ,label==1], y=x[label==2], alternative=alternative, mu=psi0, equal.var=equalvar)$p.value} ) } return(list(pValues=result)) } mutoss.twosamp.marginal.model <- function(model) { return("typ" %in% names(model) && model$typ == "twosamp") } mutoss.twosamp.marginal <- function() { return(new(Class="MutossMethod", label="Two sample test", callFunction="twosamp.marginal", output=c("pValues"), info="

The robust version uses the Wilcoxon-Mann-Whitney test, otherwise a two-sample t-test will be performed.

Reference:

  • Wilcoxon, F. (1945). Individual Comparisons by Ranking Methods. Biometrics Bulletin 1:80-83.
  • \n\
  • Mann, H. and Whitney, D. (1947). On a test of whether one of two random variables is stochastically larger than the other. Annals of Mathematical Statistics 18:50-60
  • \n
", parameters=list( data=list(type="ANY"), model=list(type="ANY"), robust=list(type="logical", label="Robust statistic"), alternative=list(type="character", label="Alternative", choices=c("two.sided", "less", "greater")), psi0=list(type="numeric", label="Hypothesized null value", default=0), equalvar=list(type="logical", label="Equal variance") ) )) } ### paired sample model ### paired.model <- function(classlabel) { classlabel <- as.vector(classlabel) return(list(model=list(typ="pairedsamp", classlabel=classlabel))) } mutoss.paired.model <- function() { return(new(Class="MutossMethod", label="Paired sample test", callFunction="paired.model", output=c("model"), info="

Paired sample test

The robust version uses the Wilcoxon signed rank test, otherwise a paired t-test will be performed.

The input for this paired sample model is a data matrix whose columns represent the samples and the rows represent the multiple endpoints. E.g. for genomics this would be a gene matrix, where each row gives the expression for a single gene.

Furthermore, a classlabel needs to be provided to distinguish the two paired groups. The arrangement of group indices does not matter, as long as the columns are arranged in the same corresponding order between groups. For example, if group 1 is code as 0 and group 2 is coded as 1, for 3 pairs of data, it does not matter if the classlabel is coded as (0,0,0,1,1,1) or (1,1,1,0,0,0) or (0,1,0,1,0,1) or (1,0,1,0,1,0), the paired differences between groups will be calculated as group2 - group1.

For the next steps you have the following choices:

Either marginal hypotheses tests (if robust Wilcoxon otherwise t-test) could be performed on each row of the data matrix to obtain raw p-values which then need to be adjusted for multiplicity to control a chosen error rate.

Or resampling based methods could be performed based on Dudoit and van der Laan (2007) to obtain adjusted p-values which control the FWER. Afterwards it is possible to use augmentation procedures to get adjusted p-values for control of FDR, FDX or gFWER.

Reference:

  • Dudoit, S. and van der Laan, M.J. (2007). Mulitple Testing Procedures and Applications to Genomics. Springer Series in Statistics.
", parameters=list( classlabel=list(type="RObject", label="classlabel") ) )) } paired.marginal <- function(data, model, robust, alternative, psi0, equalvar) { label <- as.numeric(as.factor(model$classlabel)) result <- NULL if (robust) { result <- apply(data, 1, function(x) {wilcox.test(x=x[label==1], y=x[label==2], alternative=alternative, mu=psi0, paired=TRUE, var.equal=equalvar)$p.value} ) } else { result <- apply(data, 1, function(x) {t.test(x=x[label==1], y=x[label==2], alternative=alternative, mu=psi0, paired=TRUE, var.equal=equalvar)$p.value} ) } return(list(pValues=result)) } mutoss.paired.marginal <- function() { return(new(Class="MutossMethod", label="Paired sample test", callFunction="paired.marginal", output=c("pValues"), info="

The robust version uses the Wilcoxon test, otherwise a paired t-test will be performed.

A vector of classlabels needs to be provided to distinguish the two paired groups. The arrangement of group indices does not matter, as long as the columns are arranged in the same corresponding order between groups. For example, if group 1 is code as 0 and group 2 is coded as 1, for 3 pairs of data, it does not matter if the classlabel is coded as (0,0,0,1,1,1) or (1,1,1,0,0,0) or (0,1,0,1,0,1) or (1,0,1,0,1,0), the paired differences between groups will be calculated as group2 - group1.

You could either choose a valid R object to load as classlabels or you could provide it manually by inserting e.g. c(0,1,0,1,0,1) or rep(c(0,1), each=5) or rep(c(0,1), 5).

", parameters=list( data=list(type="ANY"), model=list(type="ANY"), robust=list(type="logical", label="Robust statistic"), alternative=list(type="character", label="Alternative", choices=c("two.sided", "less", "greater")), psi0=list(type="numeric", label="Hypothesized null value", default=0), equalvar=list(type="logical", label="Equal variance") ) )) } mutoss.paired.marginal.model <- function(model) { return("typ" %in% names(model) && model$typ == "pairedsamp") } ### f test model ### ftest.model <- function(classlabel) { classlabel <- as.vector(classlabel) return(list(model=list(typ="ftest", classlabel=classlabel))) } mutoss.ftest.model <- function() { return(new(Class="MutossMethod", label="F test", callFunction="ftest.model", output=c("model"), info="

F test

The input for this F test model is a data matrix whose columns represent the samples and the rows represent the multiple endpoints. E.g. for genomics this would be a gene matrix, where each row gives the expression for a single gene.

Furthermore, a classlabel needs to be provided to distinguish k sample groups.

For the next steps you have the following choices:

Either marginal hypotheses tests (if robust Kruskal-Wallis test, otherwise F-test) could be performed on each row of the data matrix to obtain raw p-values which then need to be adjusted for multiplicity to control a chosen error rate.

Or resampling based methods could be performed based on Dudoit and van der Laan (2007) to obtain adjusted p-values which control the FWER. Afterwards it is possible to use augmentation procedures to get adjusted p-values for control of FDR, FDX or gFWER.

Reference:

  • Dudoit, S. and van der Laan, M.J. (2007). Mulitple Testing Procedures and Applications to Genomics. Springer Series in Statistics.
", parameters=list( classlabel=list(type="RObject", label="classlabel") ) )) } ftest.marginal <- function(data, model, robust) { label <- as.numeric(as.factor(model$classlabel)) result <- NULL if (robust) { result <- apply(data, 1, function(x) {kruskal.test(x=x, g=label)$p.value} ) } else { result <- apply(data, 1, function(x) { out=x anova(lm( out ~ label ))$'Pr(>F)'[1]} ) } return(list(pValues=result)) } mutoss.ftest.marginal <- function() { return(new(Class="MutossMethod", label="F test", callFunction="ftest.marginal", output=c("pValues"), info="

Robust = Kruskal-Wallis test. Otherwise F-test.

Reference:

  • Kruskal, W.H. und Wallis, W.A. (1952). Use of ranks in one-criterion variance analysis. JASA, 47:583-621
", parameters=list( data=list(type="ANY"), model=list(type="ANY"), robust=list(type="logical", label="Robust statistic") ) )) } mutoss.ftest.marginal.model <- function(model) { return("typ" %in% names(model) && model$typ == "ftest") } mutoss/R/mutoss.plotCI.R0000644000176200001440000000070014404061507014651 0ustar liggesusers############################################ # mutoss.plotCI mutoss.plotCI<-function(mat){ diff<-max(mat[,1])-min(mat[,1]) if(any(is.na(mat[,2]))) mat[,2]<-min(mat[,1])-diff*2 if(any(is.na(mat[,3]))) mat[,3]<-max(mat[,1])+diff*2 k<-nrow(mat) plotCI(1:k,mat[,1],abs(mat[,3]-mat[,1]),abs(mat[,2]-mat[,1]),lwd=2,col="red",scol="blue", main="CI plot",xaxt="n",xlab="Parameters", ylab="Values") axis(1, at=c(1:k), labels=rownames(mat)) } mutoss/R/simulationList.R0000644000176200001440000003375514404061507015166 0ustar liggesusers# Generates a list of lists. Every of these lists, denoted for now # by L, can be evaluated as a function call by eval(as.call(L)) # listFunAndParameter MUST have the following form: # list( # funName = "UnifRandom", # Description/Label of the function to be used # fun = runif, # A real function, not only the name # n = 1 # "n" is integer # ) # Example for the argument: # Arguments of runif are: n, min, max. # listFunAndParameter = list(funName="UnifRandomVariable", fun=runif, n=2, min=c(1:2), max=c(1.1, 2.1)) # sapply(generateFunctionStack(listFunAndParameter), function(fc) eval(as.call(fc))) # is same as # runif(2, 1, 1.1); runif(2, 2, 1.1); runif(2, 1, 2.1); runif(2, 2, 2.1) # Of course the second and third call do not make sense. generateFunctionStack <- function(listFunAndParameter) { # special case: the procedure does not need any further parameter if (length(listFunAndParameter) == 2) return(list(noParameters=list(fun=listFunAndParameter$fun))) # listFunAndParameter[[3]] is the first real parameter. The first 2 are the function to # to be called and a description. outerPar <- 1:length(listFunAndParameter[[3]]) # Actually I want to build the outerproduct of the parameters, # but instead of this I use index numbers indicating the position # of the used parameter. If n=c("a", "b"), n0=c(1:5), alpha=c(0.1, 0.2) # then 2, 3, 2 stands for n="b", n0=3, alpha=0.2 for(par in listFunAndParameter[-3:-1]) outerPar <- outer(outerPar, 1:length(par), paste) # special case of only ONE parameter if (length(listFunAndParameter) == 3) outerPar <- outer(outerPar, "", paste) # build now for every parameter constellation # a list that can be casted into a function call. fcStack <- list() for (parIDX in outerPar) { idx <- as.numeric(unlist(strsplit(parIDX, " "))) parameter <- list() for(i in 1:length(listFunAndParameter[-2:-1])) # listFunAndParameter[-2:-1][[i]] is the i-th parameter in the list. # from the 1st parameter we want the idx[1]-th entry from the 2nd parameter # we want the idx[2]-th entry and so on. parameter <- c(parameter, listFunAndParameter[-2:-1][[i]][idx[i]]) stackPosName <- paste(listFunAndParameter$funName, parIDX) fcStack[[stackPosName]] <- c(listFunAndParameter$fun, parameter) names(fcStack[[stackPosName]]) <- names(listFunAndParameter[-1]) } return(fcStack) } gatherParameters <- function(simObject) { #+++++++++++++++++++ Subfunctions +++++++++++++++++++++++ # extract from resultVecotr ( = simObject$results ) all values of the # parameter with the name paraName. getParamWithName <- function(resultVector, paraName) { unlist( lapply(resultVector, function(mts) { val <- mts$parameters[[paraName]] if (is.null(val)) return("") val } ) ) } #------------------- Subfunctions ----------------------- # gathering all parameters used in the simObject$results parNames <- unique(unlist(lapply(simObject$results, function(obj) names(obj$parameters)))) return(data.frame(sapply(parNames, function(pN) getParamWithName(simObject$results, pN)))) # # calling data.frame(sapply(parNames, function(pN) getParamWithName(simObject$results, pN))) # # is not good, because numeric parameters can be converted to characters and then to factors # # and it is possible that the original order is lost. For example the order of c(64, 128) # # will be 128 < 64. # ret = data.frame(getParamWithName(simObject$results, parNames[1])) # # for (pN in parNames[2:length(parNames)]) # {"funName", "method"} subset of parNames; that is length(parName) >= 2 # ret = data.frame(ret, factor(getParamWithName(simObject$results, pN))) # # names(ret) <- parNames # return(ret) } gatherStatistics <- function(simObject, listOfStatisticFunctions, listOfAvgFunctions) { #+++++++++++++++++++++++++++ Subfunctions ++++++++++++++++++++++++++ # calculates the intersection of all elements given in aList listIntersect <- function(aList) { nn <- length(aList) if(nn == 1) return(aList[[1]]) intersect(aList[[1]], listIntersect(aList[-1])) } # actually the whole work is done by this subfunction. gatherStatisticsOneAvgFun <- function(simObject, listOfStatisticFunctions, avgFun, avgFunName = deparse(substitute(avgFun))) { # extract the parameter constellations form the obejct returned by simulation() paraNameDF <- gatherParameters(simObject) unqParaNameDF <- unique(paraNameDF) rownames(unqParaNameDF) <- 1:length(rownames(unqParaNameDF)) # this will be the data.frame containing the parameter constellation and the calculated (averaged) statistics statDF <- data.frame() data.set.numbers <- sapply(simObject$results, function(res) res$data.set.number) for (i in rownames(unqParaNameDF)) { # search which objects in simObject$results belong to # parameter configuration in unqParaNameDF[i, ] idxs <- listIntersect( lapply(names(paraNameDF), function(pN) which(unqParaNameDF[i, pN] == paraNameDF[ , pN]) ) ) # applying any given statistic to the objects with the same # parameter constellation if (missing(avgFun)) { # no avgFun, thus the resulting data.frame will have one row for every simObject$results tmp <- sapply(listOfStatisticFunctions, function(fun) sapply(idxs, function(idx) fun(simObject$data[[data.set.numbers[idx]]], simObject$results[[idx]])) ) statDF <- rbind(statDF, cbind(paraNameDF[idxs,], tmp)) }else { # avgFun supplied, thus the resulting data.frame will have only one row for # every parameter constellation statDF <- rbind(statDF, sapply(listOfStatisticFunctions, function(fun) avgFun(sapply(idxs, function(idx) fun(simObject$data[[data.set.numbers[idx]]], simObject$results[[idx]]) ) ) ) ) } } if (missing(avgFun)) { # number the rows consecutively rownames(statDF) <- 1:length(rownames(statDF)) return( list( statisticDF = statDF, name.parameters = names(paraNameDF), name.statistics = names(listOfStatisticFunctions), name.avgFun = "" ) ) } # label the columns of the resulting data.frame names(statDF) <- paste(names(listOfStatisticFunctions), avgFunName, sep=".") statDF <- cbind(unqParaNameDF, statDF) list( statisticDF = statDF, name.parameters = names(paraNameDF), name.statistics = paste(names(listOfStatisticFunctions), avgFunName, sep="."), name.avgFun = avgFunName ) } #--------------------------- Subfunctions -------------------------- # if no average function is given # the resulting data.frame will have one row # for every object in simObject$results if (missing(listOfAvgFunctions)) return(gatherStatisticsOneAvgFun(simObject, listOfStatisticFunctions)) # the average function is a function, pass this directly to # gatherStatisticsOneAvgFun if (is.function(listOfAvgFunctions)) { return(gatherStatisticsOneAvgFun( simObject, listOfStatisticFunctions, listOfAvgFunctions, deparse(substitute(listOfAvgFunctions)) ) ) } # call gatherStatisticsOneAvgFun for every function in # listOfAvgFunctions if (length(listOfAvgFunctions) > 0) { if (sum(names(listOfAvgFunctions) != "") != length(listOfAvgFunctions)) warning("The functions in listOfAvgFunctions should have a name!") tmp <- list() # cnt is needed to determine the name of "fun" cnt <- 0 for (fun in listOfAvgFunctions) { cnt <- cnt + 1 tmp[[cnt]] <- gatherStatisticsOneAvgFun( simObject, listOfStatisticFunctions, fun, names(listOfAvgFunctions)[cnt] ) } # We have gathered many statistics, now join the information ret <- tmp[[1]] ret$statisticDF <- ret$statisticDF[ret$name.parameters] for (i in seq(along.with = listOfAvgFunctions)) { ret$statisticDF <- cbind(ret$statisticDF, tmp[[i]]$statisticDF[tmp[[i]]$name.statistics]) ret$name.statistics <- c(ret$name.statistics, tmp[[i]]$name.statistics) ret$name.avgFun <- c(ret$name.avgFun, tmp[[i]]$name.avgFun) } ret$name.statistics <- unique(ret$name.statistics) ret$name.avgFun <- unique(ret$name.avgFun) return(ret) } } simulation <- function(replications, DataGen, listOfProcedures, discardProcInput=FALSE) { paraNameDataGen <- names(DataGen) if (length(paraNameDataGen) != length(unique(paraNameDataGen))) { cat("Parameter of data generating function:\n\t", paraNameDataGen, "\n") stop("Parameternames of the data generating function are not unique") } # check if parameter of the procedures are unique nameProblems <- FALSE for( i in seq(along.with = listOfProcedures) ) { paraNameProc <- names(listOfProcedures[[i]]) if (length(paraNameProc) != length(unique(paraNameProc))) { nameProblems <- TRUE cat("Parameters of procedure", listOfProcedures[[i]]$funName, "are not unique:\n\t", paraNameProc, "\n") } } if (nameProblems) stop("Parameters of some procedures are not unique.\n") # no intersection between parameters of the data generating function and the # procedures are allowed. nameProblems <- FALSE for( i in seq(along.with = listOfProcedures) ) { paraNameProc <- names(listOfProcedures[[i]]) equalNames = sort(intersect(paraNameDataGen, paraNameProc)) if (length(equalNames)!= 2 || !all(equalNames == c("fun", "funName"))) { nameProblems <- TRUE cat("Common names of the data generating function and multiple test procedure", listOfProcedures[[i]]$funName, "are:\n\t", equalNames, "\n") } } if (nameProblems) stop("The only common name of data generating function and multiple test procedure should be 'fun' and 'funName'.\n") # TODO: MS print progress of the simulation on the console! # generating all data generating functions dataGenStack <- generateFunctionStack(DataGen) # a bunch of stacks full of procedures # for example for every method (bonferroni and holm) there # is a stack for bonferroni with the different parameter configurations # and a stack for holm with the different parameter configurations procedureStacks <- lapply(listOfProcedures, function(procs) generateFunctionStack(procs)) names(procedureStacks) <- sapply(listOfProcedures, function(procs) procs$funName) ret = list() # cnt is used as an identifier. So every list with # the same $data.set.number is based on the same generated data cnt <- 0 for( dataGenCall in dataGenStack ) { # This is probably the right place for gridComputation # It calls ONE time # dataGenCall. Every procedure in procedureStacks is applied # to this one "dataSet". returns $data and $results genOneDataSetAndApplyProcedures <- function(dummy) { # generating data data <- eval(as.call(dataGenCall)) # cnt is a global variable that has to be increased # each time a new "dataSet" is generated. assign("cnt", get("cnt", envir=sys.frame(-2)) + 1, envir = sys.frame(-2)) # every procedure will be applied to the generated Dataset and the results # will be stored in the following list procs.results <- vector("list", sum(sapply(procedureStacks, function(stack) length(stack)))) procs.results.idx <- 0 for (pS in seq(along.with=procedureStacks)) { # procedureStacks consists of stacks, go through one by one # this means applying every procedure to the given dataset procStack <- procedureStacks[[pS]] for (proc in procStack) { procs.results.idx <- procs.results.idx + 1 result <- list() # every dataset get a unique number result$data.set.number <- get("cnt", envir = sys.frame(-2)) # saving the parameter constellation of the used data generating function paramDataGen <- c(DataGen$funName, dataGenCall[-1]) names(paramDataGen)[1] <- "funName" # saving the parameter constallation of the used procedure paramProc <- names(procedureStacks)[pS] # if (length(proc) == 1) # #proc uses only the parameter from the output of the data generating function # paramProc <- c(paramProc)#, dummy="") # else if(length(proc)>1) paramProc <- c(paramProc, proc[-1]) names(paramProc)[1] <- "method" # saving the parameter constallation of the data generating function and the procedure result$parameters <- c(paramDataGen, paramProc) # next step is to assign the inputdata for the procedure parameters that was generated by # the data generating function. But at first I check if this will overwrite # other parameters already specified for the procedure. inter <- intersect(names(data$procInput), names(proc)) if (length(inter) != 0) warning("\n\n\tSome of the parameter of one procedure are already specified,\n\t", "and the data generating function now provides new values for these", "parameters :\n\n\t", "Affected procedure : ", listOfProcedures[[pS]]$funName, "\n\t", "Affected parameters: ", paste(inter, collapse=" "), "\n") # assign inputdata generated by the data generating function to the procedure parameters. for(paraInputName in names(data$procInput)) proc[[paraInputName]] <- data$procInput[[paraInputName]] # calling the procedure procOutput <- eval(as.call(proc)) # writing the output of the procedure into the result for(name in names(procOutput)) result[[name]] <- procOutput[[name]] # append the new result procs.results[[procs.results.idx]] <- result } } if (discardProcInput) data$procInput = NULL # return the used dataset, the output of the procedure with the used # parameter constellation return(list(data=data, results=procs.results)) } ret <- c(ret, lapply(1:replications, genOneDataSetAndApplyProcedures)) } # I want to have $data for data and $results for the output of # the procedures and parameter constellations. only.results <- sapply(ret, function(obj) obj$results) dim(only.results) <- NULL return( list(data=lapply(ret, function(obj) obj$data), results=only.results ) ) } mutoss/R/SUD.R0000644000176200001440000000530614404061507012570 0ustar liggesusers# Implements the elementary functions for a general # step-up-down test. # Step-Up and step-down are derived from that. # # Author: MarselScheer ############################################################################### SUD <- function(pValues, criticalValues, startIDX_SUD) { len <- length(criticalValues) # +++++++++++++++++ Plausis ++++++++++++++ if (len == 1) stop("SUD(): There is only 1 critical Value. Use the function SS()!") if (len != length(pValues)) stop("SUD(): Length of critical Values and pValues need to be of the same length!") if (startIDX_SUD < 1 || len < startIDX_SUD ) stop("SUD(): startIDX out of bound. criticalValues[startIDX] will not exist.") # ----------------- Plausis --------------- rejected <- rep(FALSE, times = len) # need to work with orderd pValues sortedPV <- sort(pValues, index.return = TRUE) suspiciousPV <- (sortedPV$x <= criticalValues) if (suspiciousPV[startIDX_SUD]) {# Suspicious pValue. # Actually doing now a StepDown on startIDX:len. # Additionally reject anything before startIDX nonSuspAboveStartIDX <- which(!suspiciousPV[startIDX_SUD:len]) # ! looking only at the subset startIDX:len probably gives a shift of the index ! # ! gonna correct this soon ! # perhaps any pValue from startIDX to the end is suspicious, thus reject all! if (length(nonSuspAboveStartIDX) == 0) return(rep(TRUE, times = len)) # Correcting the shift nonSuspAboveStartIDX <- nonSuspAboveStartIDX + startIDX_SUD - 1 # There must be some pValue between startIDX and the end that is not suspicious # Searching the first one. Anything immediately BEFORE that pValue will be rejected. minIDX <- min(nonSuspAboveStartIDX) - 1 rejected[sortedPV$ix[1:minIDX]] <- TRUE } else {# not suspicious pValue # Actually doing now a StepUp on 1:startIDX # The rejected are only the one rejected by this StepUp suspiciousIDX <- which(suspiciousPV[1:startIDX_SUD]) # perhaps no pValue is suspicious, thus we do not reject anything if (length(suspiciousIDX) == 0) return(rep(FALSE, times = len)) # There must be some pValue between 1 and startIDX that is suspicious # Searching the last one. Anything before (including the maximum) will be rejected. maxIDX <- max(suspiciousIDX) rejected[sortedPV$ix[1:maxIDX]] <- TRUE } return(rejected) } SD <- function(pValues, criticalValues) { SUD(criticalValues = criticalValues, pValues = pValues, startIDX_SUD = 1) } SU <- function(pValues, criticalValues) { SUD(criticalValues = criticalValues, pValues = pValues, startIDX_SUD = length(criticalValues)) } mutoss/R/Hommel.R0000644000176200001440000002066114404061507013357 0ustar liggesusershommel <- function(pValues, alpha,silent=FALSE) { m <- length(pValues) adjPValues <- p.adjust(pValues, "hommel") rejected <- adjPValues<=alpha if (! silent) { cat("\n\n\t\tHommel's (1988) step-up Procedure\n\n") printRejected(rejected, pValues, NULL) } return(list(adjPValues=adjPValues, rejected=rejected, errorControl = new(Class='ErrorControl',type="FWER",alpha=alpha))) } mutoss.hommel <- function() { return(new(Class="MutossMethod", label="Hommel (1988) adjustment", errorControl="FWER", callFunction="hommel", output=c("adjPValues", "criticalValues", "rejected", "errorControl"), assumptions=c("any dependency structure"), info="

Hommel (1988) adjustment

\n\n\

Reference:

\
    \
  • Hommel, Gerhard. \" A stagewise rejective multiple test procedure based on a modified Bonferroni test. \" Biometrika 75, pp. 383-386, 1988.
  • \n\

The method is applied to pValues. It controls \ the FWER in the strong sense when the hypothesis tests are independent \ or when they are non-negatively associated. \ The method base upon the closure principle to assure the FWER alpha and \ the critical Values of this procedure are given by alpha/n, \ alpha/(n-1), ..., alpha/2, alpha/1.

\n", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric")) )) } oracleBH <- function(pValues, alpha, pi0, silent=FALSE) { m <- length(pValues) adjPValues <- p.adjust(pValues,"BH")*pi0 rejected <- (adjPValues <= alpha) criticalValues <- sapply(1:m, function(i) (i*alpha)/(pi0*m)) if (! silent) { cat("\n\n\t\tBenjamini-Hochberg's (1995) oracle linear-step-up Procedure\n\n") printRejected(rejected, pValues, adjPValues) } return(list(adjPValues=adjPValues, criticalValues=criticalValues, rejected=rejected, errorControl = new(Class='ErrorControl',type="FDR",alpha=alpha))) } mutoss.oracleBH <- function() { return(new(Class="MutossMethod", label="Benjamini-Hochberg (1995) oracle linear-step-up", errorControl="FDR", callFunction="oracleBH", output=c("adjPValues", "criticalValues", "rejected", "errorControl"), assumptions=c("test independence or positive regression dependency"), info="

Benjamini-Hochberg (1995) oracle linear step-up Procedure

\n\n\

Reference:

\
    \
  • Bejamini, Yoav and Hochberg, Josef. \" Controlling the false discovery rate: a practical and powerful approach to multiple testing. \" J. Roy. Statist. Soc. Ser. B 57 289-300, 1995.
  • \n\

Knowledge of the number of true null hypotheses (m0) can be very useful to improve upon the performance of the FDR controlling procedure. \ For the oracle linear step-up procedure we assume that m0 were given to us by an `oracle', the linear step-up procedure with q0 = q*m/m0 \ would control the FDR at precisely the desired level q in the independent and continuous case, and \ would then be more powerful in rejecting hypotheses for which the alternative holds.

\n", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric"), pi0=list(type="numeric")) )) } Qvalue <- function(pValues, lambda=seq(0,.90,.05), pi0.method="smoother", fdr.level=NULL, robust=FALSE, smooth.df=3, smooth.log.pi0=FALSE, silent=FALSE) { requireLibrary("qvalue") qvalue <- get("qvalue", envir=asNamespace("qvalue")) out <- qvalue(pValues, lambda=lambda, pi0.method=pi0.method, fdr.level=fdr.level, robust=robust, smooth.df=smooth.df, smooth.log.pi0=smooth.log.pi0) qValues<-out$qvalues pi0<-out$pi0 if (! silent) { cat("\n\n\t\tStorey's (2001) q-value Procedure\n\n") cat("Number of hyp.:\t", length(pValues), "\n") cat("Estimate of the prop. of null hypotheses:\t", pi0, "\n") } return(list(qValues=qValues, pi0=pi0, errorControl = new(Class='ErrorControl', type="pFDR"))) } mutoss.Qvalue <- function() { return(new(Class="MutossMethod", label="Storey's (2001) q-value Procedure", errorControl="pFDR", callFunction="Qvalue", output=c("qValues", "pi0", "errorControl"), info="

Storey (2001) qvalue Procedure

\n\n\

Reference:

\
    \
  • Storey, John \" The Positive False Discovery Rate: A Baysian Interpretation and the Q-Value. \" The Annals of Statistics 2001, Vol. 31, No. 6, 2013-2035, 2001.
  • \n\

The Qvalue procedure estimates the q-values for a given set of p-values. The q-value of a test measures the \ proportion of false positive incurred when that particular test is called sigificant. \ It gives the scientist a hypothesis testing error measure for each observed statistic with respect to the pFDR. \ Note: If no options are selected, then the method used to estimate pi0 is the smoother method desribed in Storey and Tibshirani (2003). \ The bootstrap method is described in Storey, Taylor and Siegmund (2004).

\n", parameters=list(pValues=list(type="numeric"), lambda=list(type="numeric",optional=TRUE,label="Tuning parameter lambda"), pi0.method=list(type="character",optional=TRUE,choices=c("smoother","bootstrap"),label="Tuning parameter for the estimation of pi_0"), fdr.level=list(type="numeric",optional=TRUE,label="Level at which to control the FDR"),robust=list(type="logical",optional=TRUE,label="Robust estimate"), smooth.df=list(type="integer",optional=TRUE,label="Number of degrees-of-freedom"),smooth.log.pi0=list(type="logical",optional=TRUE)) )) } BlaRoq<-function(pValues, alpha, pii, silent=FALSE){ k <- length(pValues) if (missing(pii)) { pii = sapply( 1:k, function(i) exp(-i/(0.15*k)) ) # a default choice different from BY, exponential decreasing prior } if (any(pii<0)) { stop("BlaRoq(): Prior pii can only have positive elements") } if ( length(pii) != k) { stop("BlaRoq(): Prior pii must have the same length as pValues") } pii <- pii / sum(pii) precriticalValues <- cumsum(sapply(1:k, function(i) (i*pii[i])/k)) # The following code is inspired from p.adjust i <- k:1 o <- order(pValues, decreasing = TRUE) ro <- order(o) adjPValues <- pmin(1, cummin( pValues[o] / precriticalValues[i] ))[ro] rejected <- (adjPValues <= alpha) if (! silent) { cat("\n\n\t\t Blanchard-Roquain/Sarkar (2008) step-up for arbitrary dependence\n\n") printRejected(rejected, pValues, adjPValues) } return(list(adjPValues=adjPValues, criticalValues=alpha*precriticalValues, rejected=rejected, errorControl = new(Class='ErrorControl',type="FDR",alpha=alpha))) } mutoss.BlaRoq <- function() { return(new(Class="MutossMethod", label="Blanchard-Roquain/Sarkar (2008) step-up", errorControl="FDR", callFunction="BlaRoq", output=c("adjPValues", "criticalValues", "rejected", "errorControl"), info="

Blanchard-Roquain (2008) step-up Procedure for arbitrary dependent p-Values.

\n\ (Also proposed independently by Sarkar (2008))\n\

References:

\
    \
  • Blanchard, G. and Roquain, E. (2008).\" Two simple sufficient conditions for FDR control.\ \" Electronic Journal of Statistics, 2:963-992.
  • \n\
  • Sarkar, S. K. (2008) \"On methods controlling the false discovery rate.\"\ Sankhya, Series A, 70:135-168
  • \n\
\

A generalization of the Benjamini-Yekutieli procedure, taking as an additional parameter a distribution pi on [1..k] (k is the number of hypotheses) representing prior belief on the number of hypotheses that will be rejected.

The procedure is a step-up with critical values C_i defined as alpha/k times the sum for j in [1..i] of j*pi[j]. For any fixed prior pii, the FDR is controlled at level alpha for arbitrary dependence structure of the p-Values. The particular case of the Benjamini-Yekutieli step-up is recovered by taking pii[i] proportional to 1/i. If pii is missing, a default prior distribution proportional to exp( -i/(0.15*k) ) is taken. It should perform better than the BY procedure if more than about 5% to 10% of hypotheses are rejected, and worse otherwise.

Note: the procedure automatically normalizes the prior pii to sum to one if this is not the case.

\n", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric"), pii=list(type="RObject",label="Prior pi",optional=TRUE)) )) } mutoss/R/mutossApply.R0000644000176200001440000000225414404061507014474 0ustar liggesusersmutoss.apply <- function(mutossObj, f, label = deparse(substitute(f)), recordHistory = TRUE, ...) { params <- list() for (param in names(formals(f))) { #runs over all parameters of f if (param %in% slotNames(mutossObj)) { #checks if parameter name corresponds to a mutoss slot paramTail <- list(slot(mutossObj, param)) #extracts values from appropriate slot names(paramTail) <- param #attaches names for parameter values params <- c(params, paramTail) #concatenates parameters with and without data from objects } } result <- eval(as.call(c(f,params,...))) #evaluates function call with extracted parameters for (param in names(result)) { if (param %in% slotNames(mutossObj)) { value <- result[param][[1]] attr(value, "method.name") <- label #attaches attributes to slot(mutossObj, param) <- value #writes result in corresponding mutoss slots } } if ( recordHistory ) { mutossObj@commandHistory = c( mutossObj@commandHistory, paste(format( match.call( call = sys.call( sys.parent(1) ))), collapse='')) #write command into history } return(mutossObj) } mutoss/R/multcomp.R0000644000176200001440000000411414404061507013771 0ustar liggesusers# Simultaneous confidence intervals for linear contrasts # # Author: FrankKonietschke ############################################################################### multcomp.wrapper <- function(model, hypotheses, alternative, rhs=0, alpha, factorC ) { type<-"" if (any(factorC== c("Tukey", "Dunnett", "Sequen", "Williams", "Changepoint", "AVE", "McDermott", "Marcus", "UmbrellaWilliams"))) { eval(parse(text=paste("type <- mcp(",factorC,"=hypotheses)"))) } else { eval(parse(text=paste("type <- mcp(",factorC,"=hypotheses)"))) } glhtObj <- glht(model, linfct = type, rhs=rhs, alternative=alternative) summaryGLHT <- summary(glhtObj) pvalues <- summaryGLHT$test$pvalues estimates <- summaryGLHT$test$coefficients confint <- confint(glhtObj,level=(1-alpha))$confint rejected1 <- (pvalues < alpha) confi <- cbind(confint) print(cbind(confi,pvalues)) return(list(adjPValues=pvalues,rejected=rejected1,confIntervals= confi, errorControl = new(Class='ErrorControl',type="FWER",alpha=alpha))) } mutoss.multcomp<- function() { return(new(Class="MutossMethod", label="Multiple Contrast Tests", errorControl="FWER", callFunction="multcomp.wrapper", output=c("adjPValues", "rejected","confIntervals","errorControl"), info="

Parametric multiple contrast tests and simultaneous confidence intervals

With this function, it is possible to compute simultaneous tests and confidence intervals for general linear hypotheses in parametric models

Reference:

  • Frank Bretz, Alan Genz and Ludwig A. Hothorn \"On the numerical availability of multiple comparison procedures.\" Biometrical Journal, 43(5), 645-656. , 2001.
", parameters=list(model=list(type="ANY"), hypotheses=list(type="ANY"), alpha=list(type="numeric"), alternative=list(type="character", label="Alternative", choices=c("two.sided", "less", "greater")), factorC=list(type="character", label="Factor for Comparison", fromR="FactorVar") ) )) } mutoss/R/CompareObjects.R0000644000176200001440000001736514404061507015045 0ustar liggesusers# # Author: JonathanRosenblatt ############################################################################### #----------- Validating input of compare procedure------------# mu.test.class<- function(classes){ if (any(classes!='Mutoss')) stop('Input is not a "Motoss" class object') ##TODO: will this cause prolems for inherited class objects? } mu.test.type<- function(types){ if( any(types != types[1]) ){ message(' Notice:You are comparing methods for different error types. \n These should not be compared! \n Output will be generated nevertheless. \n') } } mu.test.rates<-function(rates){ if( any(rates != rates[1]) ){ message(' Notice:You are comparing methods with different error rates. \n These should not be compared! \n Output will be generated nevertheless. \n') } } mu.test.same.data<- function(pvals){ pvals.different<- any( apply(pvals,1, function(x) any(x!=x[1]))) if(pvals.different) stop('Different data was used for suppied procedures.') } mu.test.name<- function(hyp.names){ names.different<- any( apply(hyp.names,1, function(x) any(x!=x[1]))) if(names.different) message('Notice: Hypotheses have different names. Can they be compared?') } #-------- Create comparison list for Mutoss objects--------------# compareMutoss<-function(...){ objects<-list(...) classes<- sapply(objects, function(x) class(x) )#getting object classes mu.test.class(classes) #testing for compatible object classes types<- sapply(objects, function(x) x@errorControl@type)#getting error control types mu.test.type(types) #testing for compatible error control types rates<-sapply(objects, function(x) x@errorControl@alpha)#extracting error rates pi.nulls<- as.numeric(lapply(objects, function(x) x@pi0))#extracting pi0 estimates pvalues<- sapply(objects, function(x) x@pValues )# getting adjusted pvals mu.test.same.data(pvalues) m<- nrow(pvalues) raw.hyp.names<- lapply(objects, function(x) x@hypNames )# getting hypothesis names if(all(sapply(raw.hyp.names, function(x) identical(x, character(0))))){ hyp.names<- paste('hyp', 1:m, sep='') } else if(all(sapply(raw.hyp.names, function(x) length(x)==m))) { mu.test.name(raw.hyp.names) hyp.names<- raw.hyp.names[,1] } ##TODO: [JR] Deal with mising hyp names only in a subset of objects # Preparing Raw Pvalues raw.pvals<- pvalues[,1] pval.order<- order(raw.pvals) pval.ranks<- rank(raw.pvals) raw.pvals.frame<-data.frame( pValue=raw.pvals, order=pval.order, ranks=pval.ranks) row.names(raw.pvals.frame)<-hyp.names #Preparing adjusted pvalues adj.pvals<- lapply(objects, function(x) x@adjPValues ) method.names<- unlist(lapply(adj.pvals, function(x) attributes(x)[1])) adj.pvals.frame<- data.frame(adj.pvals) colnames(adj.pvals.frame)<- method.names row.names(adj.pvals.frame)<- hyp.names #Preparing critical values critical<- lapply(objects, function(x) x@criticalValues ) method.names<- unlist(lapply(critical, function(x) attributes(x)[1])) critical.frame<- data.frame(critical) colnames(critical.frame)<- method.names row.names(critical.frame)<- hyp.names #Preparing decisions rejections<- lapply(objects, function(x) x@rejected ) method.names<- unlist(lapply(rejections, function(x) attributes(x)[1])) rejections.frame<- data.frame(rejections) colnames(rejections.frame)<- method.names row.names(rejections.frame)<- hyp.names ##TODO: [JR] Add groud truth to comparison method comparing<- list( types=types, rates=rates, pi.nulls=pi.nulls, raw.pValues=raw.pvals.frame, adjusted.pvals=adj.pvals.frame, criticalValue=critical.frame, rejections=rejections.frame ) return(comparing) } #For testing purposes #source('~/workspace/mutoss/src/BasicFunctions/DummyBigObjects.R') #test<- list(mu.test.obj.1, mu.test.obj.2) #-------------- Comparison of adjusted p values -----------------# mu.compare.adjusted<- function(comparison.list, identify.check=F){ adjPValues<- comparison.list[['adjusted.pvals']] hyp.num<- nrow(adjPValues) method.num<- ncol(adjPValues) method.names<- factor(colnames(adjPValues)) method.index<- as.numeric(method.names) raw.pValues<-comparison.list[['raw.pValues']] pvalue.ranks<-raw.pValues$ranks method.type<-comparison.list[['types']] stacked.adjPValues<- unlist(adjPValues, use.names=F) x<- rep(pvalue.ranks, method.num) method.labels<- rep(method.names, each=hyp.num) hyp.labels<- rep(row.names(adjPValues), method.num) point.charachters<- rep(method.index, each=hyp.num) #for plotting purposes only point.size<- hyp.num^(-0.1) plot(stacked.adjPValues~x, pch=point.charachters, ylim=c(0,1), cex=point.size, xlab='') the.title<- paste('Adjusted p-values for ',unique(method.type),' controlling procedures') title(the.title) par(xpd=T) legend(x=0, y=-0.15, horiz=T, legend=method.names, pch=method.index, cex=method.num ^ (-1/4) ) par(xpd=F) #reset par to default value if(identify.check) { identify(stacked.adjPValues~x, labels=hyp.labels ) } ##TODO: [JR] Plotting method using colors? } #For testing purposes #source('~/workspace/mutoss/src/BasicFunctions/DummyBigObjects.R') #----------- Comparison of critical vales---------- # mu.compare.critical<- function(comparison.list, identify.check=F){ method.type<-comparison.list[['types']] #extracting method type criticalValues<- comparison.list[['criticalValue']]#extracting critical values hyp.num<- nrow(criticalValues) method.num<- ncol(criticalValues) method.names<- factor(colnames(criticalValues)) method.index<- as.numeric(method.names) raw.pValues<-comparison.list[['raw.pValues']] #extracting raw palues pvalue.ranks<-raw.pValues$ranks stacked.criticalValues<- unlist(criticalValues, use.names=F) x<- rep(pvalue.ranks, method.num) method.labels<- rep(method.names, each=hyp.num) hyp.labels<- rep(row.names(criticalValues), method.num) point.charachters<- rep(method.index, each=hyp.num) #for plotting purposes only point.size<- hyp.num^(-0.1) plot(stacked.criticalValues~x, pch=point.charachters, ylim=c(0,1), xlab='', cex=point.size) the.title<- paste('Critical Values for ',unique(method.type),' controlling procedures') title(the.title) par(xpd=T) legend( x=0, y=-0.15, horiz=T, legend=method.names, pch=method.index, cex=method.num ^ (-1/4) ) par(xpd=F) #reset par to default value if(identify.check) { identify(stacked.criticalValues~x, labels=hyp.labels ) } } #For testing purposes: #source('~/workspace/mutoss/src/BasicFunctions/DummyBigObjects.R') #mu.compare.critical(1) #mu.compare.critical(compare.3, T) #----- Sumary of comparison-----------# mu.compare.summary<- function(comparison.list){ method.type<-comparison.list[['types']] #extracting method type error.rates<-comparison.list[['rates']] #extracting error rates pi.nulls<-comparison.list[['pi.nulls']] #extracting pi0 rejections<-comparison.list[['rejections']] hyp.num<- nrow(rejections) method.num<- ncol(rejections) method.names<- factor(colnames(rejections)) method.index<- as.numeric(method.names) count.rejections<-apply(rejections, 2, sum) seperate<- rep('|', method.num) summary<-data.frame( method.type, seperate, error.rates, seperate, count.rejections, seperate, pi.nulls) colnames(summary) <-c( 'Error Type'," ", 'Error Rate'," ", 'Rejections Count', " ", 'pi_0') cat('\n Comparing multipe hypothesis procedures.\n', hyp.num, 'hypotheses tested.\n\n') print(summary) } #For testing purposes : #source('~/workspace/mutoss/src/BasicFunctions/DummyBigObjects.R') #mu.compare.summary(1) #mu.compare.summary(compare.3)mutoss/R/helperfunctions.R0000644000176200001440000000061614404061507015344 0ustar liggesusers requireLibrary <- function(package) { if(!require(package, character.only=TRUE)) { answer <- readline(paste("Package ",package," is required - should we install it?",sep="")) if (substr(answer, 1, 1) %in% c("y","Y")) { install.packages(package) require(package, character.only=TRUE) } else { stop(paste("Required package",package,"should not be installed")) } } } mutoss/R/pi0Est.R0000644000176200001440000001435414404061507013304 0ustar liggesusers# Collection of elementary functions calculating an estimate # of the number m0 resp. the proportion pi0 of true null hypotheses # in a finite family of hypotheses. # # Author: MarselScheer and WiebkeWerft ############################################################################### storey_pi0_est = function(pValues, lambda) { pi0 = (sum(pValues > lambda) + 1) / (1 - lambda) / length(pValues) return(list(pi0 = pi0, lambda = lambda)) } mutoss.storey_pi0_est <- function() { return(new(Class="MutossMethod", label="Storey-Taylor-Siegmund (2004) Procedure", callFunction="storey_pi0_est", output=c("pi0", "lambda"), info="

Storey-Taylor-Siegmund procedure

\n\n\

The Storey-Taylor-Siegmund procedure for estimating pi0 is applied to pValues.\ The formula is equivalent to that in Schweder and Spjotvoll (1982),\ page 497, except the additional '+1' in the nominator that\ introduces a conservative bias which is proven to be sufficiently large\ for FDR control in finite families of hypotheses if the estimation\ is used for adjusting the nominal level of a linear step-up test.

\n\

Reference:

\
    \
  • Storey, J. D., Taylor, J. E. and Siegmund, D. (2004). \" Plots of P-values to evaluate many tests simultaneously. \" Biometrika 69, 3, 493-502.
  • \n\
  • Huang, Y. and Hsu, J. (2007). \" Strong control, conservative point estimation and simultaneous conservative consistency of false discovery rates: a unified approach.\" JRSS B 66, 1, 187-205.
", parameters=list(pValues=list(type="numeric"), lambda=list(type="numeric")) )) } ABH_pi0_est <- function(pValues) { m <- length(pValues) index <- order(pValues) spval <- pValues[index] m0.m <- rep(0, m) for (k in 1:m) { m0.m[k] <- (m + 1 - k)/(1 - spval[k]) } idx <- which(diff(m0.m, na.rm = TRUE) > 0) if (length(idx) == 0) grab <- 2 else grab <- min(idx, na.rm = TRUE)+1 pi0.ABH <- (ceiling(min(m0.m[grab], m))/m) return(list(pi0 = pi0.ABH)) } mutoss.ABH_pi0_est <- function() { return(new(Class="MutossMethod", label="Hochberg-Benjamini (1990) lowest slope line method", callFunction="ABH_pi0_est", output=c("pi0"), info="

Hochberg-Benjamini lowest slope line method

\n\n\

The Lowest Slope Line (LSL) method of Hochberg and Benjamini for estimating pi0 is applied to pValues.\ This method for estimating pi0 is motivated by the graphical approach proposed\ by Schweder and Spjotvoll (1982), as developed and presented in Hochberg and Benjamini (1990).

\n\

Reference:

\
    \
  • Hochberg, Y. and Benjamini, Y. (1990). \" More powerful procedures for multiple significance testing. \" Statistics in Medicine 9, 811-818.
  • \n\
  • Schweder, T. and Spjotvoll, E. (1982). \" Plots of P-values to evaluate many tests simultaneously.\" Biometrika 69, 3, 493-502.
", parameters=list(pValues=list(type="numeric")) )) } TSBKY_pi0_est <- function(pValues, alpha) { m <- length(pValues) adjp <- p.adjust(pValues,"BH") pi0.TSBKY <- ((m - sum(adjp < alpha/(1 + alpha), na.rm = TRUE)) / m) return(list(pi0=pi0.TSBKY)) } mutoss.TSBKY_pi0_est <- function() { return(new(Class="MutossMethod", label="Benjamini, Krieger and Yekutieli (2006) two-step estimation method", callFunction="TSBKY_pi0_est", output=c("pi0"), info="

Hochberg-Benjamini lowest slope line method

\n\n\

The two-step estimation method of Benjamini, Krieger and Yekutieli for estimating pi0 is applied to pValues. It consists of the following two steps:

\

Step 1. Use the linear step-up procedure at level alpha' =alpha/(1+alpha). Let r1 be the number of\ rejected hypotheses. If r1=0 do not reject any hypothesis and stop; if r1=m reject all m\ hypotheses and stop; otherwise continue.

\n\

Reference:

\
    \
  • Benjamini, Y., Krieger, A. and Yekutieli, D. (2006). \" Adaptive linear step-up procedures that control the false discovery rate. \" Biometrika 93, 3, page 495.
  • \n\
", parameters=list(pValues=list(type="numeric"),alpha=list(type="numeric")) )) } # TODO: GB (MS) This will help will look terrible! BR_pi0_est <- function(pValues, alpha, lambda=1, truncate = TRUE) { if ( lambda <= 0 || lambda >= 1/alpha) { stop('BR_pi0_est() : lambda should belong to (0, 1/alpha)') } m <- length(pValues) stage1 <- indepBR( pValues, alpha, lambda, silent = TRUE) pi0 <- ( m + 1 - sum(stage1$rejected) ) / ( m * ( 1 - lambda*alpha ) ) if (truncate) { pi0 = min(1,pi0) } return(list(pi0=pi0)) } mutoss.BR_pi0_est <- function() { return(new(Class="MutossMethod", label="Blanchard-Roquain (2009) estimation method", callFunction="BR_pi0_est", output=c("pi0"), info="

Blanchard-Roquain estimation under independence

\n\n\

Reference:

\
    \
  • Blanchard, G. and Roquain, E. \" Adaptive False Discovery Rate Control under Independence and Dependence.\" Journal of Machine Learning Research 10:2837-2871, 2009. .
  • \n\
\

The proportion of true\ nulls is estimated using the Blanchard-Roquain 1-stage procedure with parameter lambda,\ via the formula\n\ estimated pi0 = ( m - R(alpha,lambda) + 1) / ( m*( 1 - lambda * alpha ) )\n\ where R(alpha,lambda) is the number of hypotheses rejected by the BR 1-stage procedure, alpha is FDR level control for this procedure and lambda a parameter belonging to (0, 1/alpha) with default value 1. Independence of p-values is assumed. This estimate may in some cases be larger than 1; it is truncated to 1 if the parameter truncated=TRUE. The estimate is used in the Blanchard-Roquain 2-stage step-up (with the non-truncated version)

", parameters=list(pValues=list(type="numeric"),alpha=list(type="numeric"), lambda=list(type="numeric", default=1), truncate=list(type="logical", default=TRUE)) )) } mutoss/R/gao.R0000644000176200001440000001132014404061507012674 0ustar liggesusers# # # Author: FrankKonietschke ############################################################################### gao<-function(formula, data, alpha = 0.05, control = NULL , silent = FALSE){ dat <- model.frame(formula, data) if (ncol(dat) != 2) { stop("Specify one response and only one class variable in the formula !") } if (is.numeric(dat[, 1]) == FALSE) { stop("Response variable must be numeric !") } response <- dat[, 1] group <- as.factor(dat[, 2]) fl <- levels(group) a <- nlevels(group) N <- length(response) n <- aggregate(response,list(group),FUN="length")$x if (any(n <= 2)) { warn <- paste("The factor level", fl[n <= 2], "has got less than two observations!") stop(warn) } if (is.null(control)) { cont <- 1 } if(! is.null(control)){ if (!any(fl == control)) { stop("The dataset doesn't contain this control group!") } cont <- which(fl == control) } C<-contrMat(1:a,"Dunnett",base=cont) # ------------- Compute the pseudo-ranks------------------ # #browser() rx <- c() for (i in 1:N){ help <- expand.grid(response[i],response) help1 <- (help[,1]>help[,2])+1/2*(help[,1]== help[,2]) help2 <- data.frame(h1=help1,h2=group) samples2 <- split(help2$h1, help2$h2) pseudo <- sapply(1:a, function(arg) { mean(samples2[[arg]]) }) rx[i] <-N*mean(pseudo) } new.data <-data.frame(res=rx,group=group) # ------------------ Point estimators ---------------------# pd <- 1/N*aggregate(new.data$res,list(group), FUN="mean")$x Cpd <- C%*%pd # ------------ Compute the variance estimators ----------- # v1 <- 1/N^2*aggregate(new.data$res,list(group),FUN="var")$x lambda <- N/n v11 <-c(v1*lambda) v2 <- diag(v1*lambda) Cv <- C%*%v2%*%t(C) # ------------------ Test Statistics ----------------------# T <-sqrt(N)*Cpd / sqrt(c(diag(Cv))) # ------------------ Degrees of freedom--------------------# ncont <-which((1:a)!= cont) numerator <- c(diag(Cv))^2 denu1<-v1[cont]^2/(n[cont]^2*(n[cont]-1)) denu2 <- v1[ncont]^2 /(n[ncont]^2*(n[ncont]-1)) denu <- N^2*(denu1 + denu2) df <- numerator / denu #-------------------------p-Values ------------------------# pv<- c() for (h in 1:(a-1)){ pv[h]<- min(2*pt(T[h],df[h]),2-2*pt(T[h],df[h])) } adj.p <- p.adjust(pv,"hochberg") Rejected <- (adj.p<=alpha) #------------------- Build the output ---------------------# vj <- which((1:a) != cont) vi <- rep(cont, a - 1) cmpid <- sapply(1:(a-1), function(arg) { i <- vi[arg] j <- vj[arg] paste("F", "(", fl[j], ")", "-","F","(" ,fl[i],")", sep = "") }) result <- data.frame(Comparison=cmpid, Estimator = Cpd, df=df, Statistic = T, P.Raw=pv,P.Adj=adj.p,Rejected = Rejected ) rownames(result)<-1:(a-1) output = list(Info=data.frame(Sample=fl, Size=n, Single.Effects=pd), Analysis=result) if (! silent) { cat("#----Xin Gao's (2008) Non-Parametric Multiple Test Procedure","\n") cat("#----Type of Adjustment: Hochberg", "\n") cat("#----Level of significance", "=", alpha ,"\n") cat("#----The procedure compares if the distribution functions F() are equal. The FWER is strongly controlled", "\n") print(result) } return(output) } gao.wrapper <- function(model, data, alpha, control) { control <- NULL result <- gao(formula=formula(model), data=data, alpha = alpha,control) pvalues <- result$Analysis$P.Adj estimates <- result$Analysis$Estimator confint <- cbind(estimates, rep(NA, length(estimates)),rep(NA,length(estimates))) rownames(confint)<-result$Analysis$Comparison rejected1 <- result$Analysis$Rejected return(list(adjPValues=pvalues,rejected=rejected1,confIntervals= confint, errorControl = new(Class='ErrorControl',type="FWER",alpha=alpha))) } mutoss.gao <- function() { return(new(Class="MutossMethod", label="Nonparametric Multiple contrast tests", errorControl="FWER", callFunction="gao.wrapper", output=c("adjPValues", "rejected","confIntervals","errorControl"), info="

Nonparametric multiple contrast tests

This function computes Xin Gao's nonparametric multiple test procedures in an unbalanced one way layout.

Reference:

  • Gao, X. et al. \"Nonparametric multiple comparison procedures for unbalanced one-way factorial designs.\" Journal of Statistical Planning and Inference, 77, 2574-2591, 2008.
", parameters=list(model=list(type="ANY"), hypotheses=list(type="ANY"), alpha=list(type="numeric") ) )) } mutoss/R/onLoad.R0000755000176200001440000000103614404061507013350 0ustar liggesusers.onLoad <- function(libname, pkgname) { # if(!require("multtest", character.only=TRUE)) { # if (interactive()) { # answer <- readline("Multtest is missing - do you want to install it (y/N)? ") # if (substr(answer, 1, 1) %in% c("y","Y")) { # source("http://bioconductor.org/biocLite.R") # biocLite("multtest") # require("multtest") # } else { # warning("Package multtest is not avaible - please install it!") # } # } else { # warning("Package multtest is not avaible - please install it!") # } # } } mutoss/R/MuTossObject.R0000644000176200001440000000357214404061507014521 0ustar liggesuserssetClass("ErrorControl", representation = representation( type = "character", # Type of error rate controlled for (FWER, FWER.weak, FDR, FDX, gFWER, perComparison (?)) alpha = "numeric", # Error rate of the procedure k = "numeric", # Additional parameter for generalized FWE control q = "numeric" # Additional paramter for FDX control ) ) ##TODO: add slots for "model": formula, link, family ##TODO: write some header, it is the main object that comes out after four weeks of hard work!! setClass("Mutoss", representation = representation( data = "ANY", # Raw data used in model model = "ANY", # link function,error family and design description = "character", statistic = "numeric", # For Z, T or F statistics (maybe different slots?) hypotheses = "ANY", hypNames = "character", # Identifiers for the hypotheses tested criticalValues = "numeric", # Procedure-specific critical values pValues = "numeric", # Raw p-values. Either imported or calculated with data and model adjPValues = "numeric", # Procedure-specific adjusted p-values errorControl = "ErrorControl", # Details of the multiplicity control procedure used. rejected = "logical", # Logical vector of the output of a procedure at a given error rate qValues = "numeric", # Storey's estimates of the supremum of the pFDR locFDR = "numeric", # Efron's local fdr estimates (by which method?) pi0 = "numeric", # Estimate of the proportion of null hypotheses (by which method?) confIntervals = "matrix", # Confidence intervals for selected parameters (of which kind? selected how?) commandHistory = "character" ) ) mutoss/R/wrapperFunctions.R0000644000176200001440000000763614404061507015516 0ustar liggesusers setClass("MutossMethod", representation = representation( label = "character", # this label will be shown in the menus errorControl = "character", # FWER, FWER.weak, FDR, FDX, gFWER, perComparison (?) callFunction = "character", # the function to call output = "character", # this is the character vector of the _possible_ output of the function info = "character", # info text, should contain small description, author, reference etc. assumptions = "character", # assumptions for this method parameters = "list", # optional description of parameters - see MuToss developer handbook misc = "list" # a list where you can put all your miscellaneous stuff ) ) bonferroni <- function(pValues, alpha, silent=FALSE) { adjPValues=sapply(pValues*length(pValues),function(x){min(x,1)}) if (missing(alpha)) { return(list(adjPValues=adjPValues)) } else { rejected <- (adjPValues<=alpha) if (! silent) { cat("\n\n\t\tBonferroni correction\n\n") printRejected(rejected, pValues, adjPValues) } return(list(adjPValues=adjPValues, rejected=rejected, errorControl = new(Class='ErrorControl', type="FWER", alpha=alpha))) } } mutoss.bonferroni <- function() { return(new(Class="MutossMethod", label="Bonferroni correction", errorControl="FWER", callFunction="bonferroni", output=c("adjPValues", "rejected", "errorControl"), info="

Bonferroni correction

\n\n\

The classical Bonferroni correction outputs adjusted p-values, ensuring strong FWER control under arbitrary dependence of the input p-values. It simply multiplies each input p-value by the total number of hypotheses (and ceils at value 1).

It is recommended to use Holm's step-down instead, which is valid under the exact same assumptions and more powerful.

Reference:

  • Bonferroni, C. E. \"Il calcolo delle assicurazioni su gruppi di teste.\" In Studi in Onore del Professore Salvatore Ortu Carboni. Rome: Italy, pp. 13-60, 1935.
  • \n
  • Bonferroni, C. E. \"Teoria statistica delle classi e calcolo delle probabilita.\" Pubblicazioni del R Istituto Superiore di Scienze Economiche e Commerciali di Firenze 8, 3-62, 1936.
", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric", optional=TRUE)) )) } sidak <- function(pValues, alpha, silent=FALSE) { adjPValues <- sapply(1-(1-pValues)^length(pValues), function(x){min(x,1)}) if (missing(alpha)) { return(list(adjPValues=adjPValues)) } else { rejected <- (adjPValues <= alpha) if (! silent) { cat("\n\n\t\tSidak correction\n\n") printRejected(rejected, pValues, adjPValues) } return(list(adjPValues=adjPValues, rejected=rejected, errorControl = new(Class='ErrorControl',type="FWER",alpha=alpha))) } } mutoss.sidak <- function() { return(new(Class="MutossMethod", label="Sidak correction", errorControl="FWER", callFunction="sidak", output=c("adjPValues", "rejected", "errorControl"), assumptions=c("test independence"), info="

Sidak correction

\n\n\

The classical Sidak correction returns adjusted p-values, ensuring strong FWER control under the assumption of independence of the input p-values. It only uses the fact that the probability of no incorrect rejection is the product over true nulls of those marginal probabilities (using the assumed independence of p-values). The procedure is more generally valid for positive orthant dependent test statistics.

It is recommended to use the step-down version of the Sidak correction instead, which is valid under the exact same assumptions and more powerful.

Reference:

  • Sidak, Z. (1967). Rectangular confidence regions for the means of multivariate normal distributions. Journal of the American Statistical Association, 62:626-633.
\n", parameters=list(pValues=list(type="numeric"), alpha=list(type="numeric", optional=TRUE)) )) } mutoss/R/testFunctionsForTheGUI.R0000644000176200001440000000100114404061507016446 0ustar liggesusers# A File for temporarily functions to test the GUI. # # Author: MarselScheer ############################################################################### pValuesPlot = function(pValues) { plot(ecdf(pValues), do.points=FALSE, verticals = TRUE, main="ecdf", ylim=c(0,1)) abline(0,1, col=2) } adjPValuesPlot = function(adjPValues, alpha) { plot(sort(adjPValues), main="Adjusted p-values", ylab="adjusted p-values", xlab="ordered index", ylim=c(0,1)) if (!missing(alpha)) { abline(alpha,0, col=2) } } mutoss/R/localfdr.R0000644000176200001440000000604014404061507013717 0ustar liggesusers# # Author: JonathanRosenblatt ############################################################################### pval2qval<- function(pValues, cutoff){ requireLibrary('fdrtool') fdrtool <- get("fdrtool", envir=asNamespace("fdrtool")) qvals<-fdrtool( pValues, statistic= 'pvalue', plot=FALSE,verbose=FALSE)$qval if (missing(cutoff)) { return(list(qValues=qvals)) } return(list(qValues=qvals, rejected= qvals<=cutoff )) } pval2locfdr<- function(pValues, cutoff){ requireLibrary('fdrtool') fdrtool <- get("fdrtool", envir=asNamespace("fdrtool")) locfdr<-fdrtool( pValues, statistic= 'pvalue', plot=FALSE,verbose=FALSE)$lfdr if (missing(cutoff)) { return(list(locFDR=locfdr)) } return(list(locFDR=locfdr, rejected= locfdr<=cutoff )) } mutoss.locfdr <- function() { return(new(Class="MutossMethod", label="Local FDR (fdr)", callFunction="pval2locfdr", output=c("locFDR", "rejected"), info= "

Name:

Local fdr.\n

Also known as:

fdr, empirical posterior probability of the null. \n

Error Type:

Motivated by Bayesian considerations. Does not guarantee control of frequentist error types like FWER or FDR.\n

Recommended Usage:

Typically used when a massive amount of hypotheses is being tested as in microarray analyses.\n

Related procedures:

See FDR methods for similar procedures for frequentist error control.\n

References:

\n
  • Efron B., Tibshirani R., Storey J. D. and Tusher, V. (2001). Empirical Bayes Analysis of a Microarray Experiment. \n Journal of the American Statistical Association 96(456):1151-1160.
", parameters=list( pValues=list(type="numeric"), cutoff=list(type="numeric", label="Local fdr cutoff for rejection", optional=TRUE)))) } mutoss.qvalues <- function() { return(new(Class="MutossMethod", label="q Values (Fdr)", callFunction="pval2qval", output=c("qValues", "rejected"), info= "

Name:

q-Values.\n

Also known as:

\n