eRm/0000755000175100001440000000000014505226141011013 5ustar hornikuserseRm/NAMESPACE0000755000175100001440000000555314473401250012245 0ustar hornikusersuseDynLib("eRm", .registration = TRUE) import("stats", "graphics", "methods", "lattice", "grDevices", "colorspace") importFrom("splines", "interpSpline") importFrom("MASS", "mvrnorm") importFrom("Matrix", "bdiag") importFrom("psych", "smc") export(RM) export(LLTM) export(RSM) export(LRSM) export(PCM) export(LPCM) export(LRtest) export(MLoef) export(itemfit) export(person.parameter) export(personfit) export(plotDIF) export(plotGOF) export(plotICC) export(plotjointICC) export(plotPImap) export(plotPWmap) export(pmat) export(Waldtest) export(IC) export(thresholds) export(sim.2pl) export(sim.rasch) export(sim.xdim) export(sim.locdep) export(stepwiseIt) export(gofIRT) export(NPtest) export(llra.datprep) export(build_W) export(collapse_W) export(LLRA) export(plotGR) export(plotTR) export(plotINFO) export(item_info) export(test_info) export(i_info) export(SepRel) export(PersonMisfit) S3method(print, eRm) S3method(summary, eRm) S3method(summary, ppar) S3method(summary, LR) S3method(summary, MLoef) S3method(model.matrix, eRm) S3method(coef, eRm) S3method(coef, ppar) S3method(vcov, eRm) S3method(print, LR) S3method(print, MLobj) S3method(print, MLoef) S3method(print, ifit) S3method(print, wald) S3method(print, pfit) S3method(print, ppar) S3method(print, step) S3method(print, MisfittingPersons) S3method(summary, MisfittingPersons) S3method(itemfit, ppar) S3method(PersonMisfit, ppar) S3method(LRtest, Rm) S3method(person.parameter, eRm) S3method(personfit, ppar) S3method(plotGOF, LR) S3method(plotICC, Rm) S3method(plotjointICC, dRm) S3method(plot, ppar) S3method(pmat, ppar) S3method(pmat, default) S3method(residuals, ppar) S3method(Waldtest, Rm) S3method(logLik, eRm) S3method(logLik, ppar) S3method(print, logLik.eRm) S3method(print, logLik.ppar) S3method(print, threshold) S3method(summary, threshold) S3method(thresholds, eRm) S3method(print, ICr) S3method(confint, eRm) S3method(confint, ppar) S3method(confint, threshold) S3method(IC, ppar) S3method(IC, default) S3method(stepwiseIt, eRm) S3method(gofIRT, ppar) S3method(predict, ppar) S3method(summary, gof) S3method(print, gof) S3method("print", Tmdobj) S3method("print", Tpbisobj) S3method("print", T1obj) S3method("print", T1mobj) S3method("print", T1lobj) S3method("print", T2obj) S3method("print", T2mobj) S3method("print", T4obj) S3method("print", T10obj) S3method("print", T11obj) S3method(anova, eRm) S3method(print, eRm_anova) S3method(anova, llra) S3method(print, llra) S3method(print,summary.llra) S3method(summary, llra) S3method(print, eRm_SepRel) S3method(summary, eRm_SepRel) # from RaschSampler export("rsampler") export("rstats") export("rsctrl") export("rsextrobj") export("rsextrmat") export("phi.range") S3method("summary", "RSctr") S3method("summary", "RSmpl") S3method("summary", "RSmplext") eRm/data/0000755000175100001440000000000014375241641011733 5ustar hornikuserseRm/data/lltmdat2.rda0000755000175100001440000000030514375241641014147 0ustar hornikusers r0b```f`f@&kh  9rrJrSKA?0`0qt:BXԁ'd搤~j OXy\OjxS/Oּb Cā 2yYFp1egX 3&LziE@Дs\ 2H#keRm/data/raschdat1.rda0000755000175100001440000000224414375241641014302 0ustar hornikusers]jAmP!wn^܈(d{I> CH8i3RuN\-~S]yd}]JY/}l{Q)k˃QrO{wa]4h<hdNJڗ3Yně/Y=g/.Z?gLe(6IIk<|c +6py^h^{筊IX~]Շ+7.hw+.^ʇ,{Wk6:.{e4jOZOme7YuϪ^^?+WZʪݗ7f׳+ץu'#wadٹ=W+]?x݇7/GZwu]z=hbo<-uN[/y87#T<':O+D%\Aݑ/a~bCGr7vͿjB', +kxY#/$}>o/O7~x4fI+?kcY|-Sak}ZqY~TZcKͧ[B;Zoo՞QQ|Ž+VߡhERy?OIx5Y׳xoy*,GkeW&򓬼3x>:=%|maO\; nh͇ZCph 7nmjym~mamfe*[WٺUul]e*[W=Xslqp.B]ՏA`eRm/data/raschdat3.rda0000755000175100001440000000211214375241641014276 0ustar hornikusers\MkQ }BﰠUqF*.֟uJ89ɝh̝L&{}|tp|Zmw>ek{;ɝtq4=f`կv#D,;5%e]Kd'oO?^=WO^j{(e|RxϥRūOSg<9mke#=_*oUϋIu\nK {RyK_,Oײgq,7YuEQ^#^*vQ|5>X?O/U}:?vQ^٫g^s{Os{qUsU?by{a<'y~u4ϩ*zAyyXXF^<1edųT3kTQUooNou~{~X<{U})?-hߵD7󍵋ٸZU~z%{{ W嗪>~Gˏ:򣪟g*>aվp!//ף}gC~_Q~jgov} #=NTq־:.}4GYK?o8D̋U}DWTy9*^~/g_U!::HXy/eh>Z8z@HJNy#jOtnϬ?H_U?Hv>_UsBQΒaeU~uxzU?gvcןp޺yOg}{TT͡ٸ98۟Y9Z V_gQ x׭sK>z>gq%u[Fvyt$UjɾDYQEK7|TX/*FovTNn |]ŝO6GO7GGg監=ɗ| ^<8.Og3?Lڗ׈?WW?$ ^eRm/data/llraDat1.rda0000755000175100001440000000355114375241641014076 0ustar hornikusersBZh91AY&SYYق=Ȑ P@/߀ j*PB|T?JQɐ@  Oȥ)4MT a4TC&@AhF`=]6-n0ᒲL>Bd"s* <\*DUQ܌Lwe5yDc1aHo^m{LjL&յD)&%vMwab,Ϋ',X+LkemJ@:W=]|'_hJN)nv@a0YiP:L'_?JI=7r3{y๪fffffffffvՆx 1L[t:Rѭd!,ӯ ˎ$/@ 7aJHoh!'_J?-e]C3'jo?xQWRt z4ᦪoI2 jŋs>uرOgagu:8jD=u?IlzC㹥o&ԉ,kc3ߟJikg}bK~ZAYnk7 2Mv2?`iΧ9U_߉/7n)A&`*`&`.`! p߀^:Q*r2ESE3EsE E"p\zS2$cj9?seRm/data/llraDat2.rda0000755000175100001440000000164514375241641014101 0ustar hornikusersBZh91AY&SYê= ʀ T@/߀{{W $'*h4F =IЕ244R@44h ɠ "idM 4hJnaM [ls*@W ,mq )#N&+*T\3 H]*14 ]U!+ W:ۮlq4ptDsi 4hBDhtQ@UrnZ+f#DRx=jLTB-$SKGr'ajm(I+(Aڵ #CAjbhff4&`!rVKm$@IK XGm.2ڊKRt,hLEkix&NƈvVӒ6ʳb+qb.C% Ыm²$9v:wTT|1u[[dYka<ߎ}};67)mmዡu,r0:QMMKHJZ D_`]r!yP[/x} ͧo?}//<^y5Tu_x0\XΚ_{oM<1&o#9y6:&o\~8B,pm?7 khǣ1œwrfw޷(d!k{ C!9(0fX=:w]~Eq gߊ-4b ž/:W[8+0hҝ/'g*u5 @Ab7Uƞ?|GVuM2 =zE#tquM!\1ߎ/:9z1չ?/}F\Vkqjm48Zo+q*^2)ޭ1\>mZ(|V4N`^(|~E(=H~R5$ƚ[8=*fէtעs_Yw$2s{濫=׬{7T?UP{^Nު**]\^GGG~7v5loVT9'swśu 4ҿQGOU @'>!!WUl*έWVY>P+!(Wj^ {X%G*Gr_U#>ӎO_^\SQ4dLuꞎb犪q+TmtRG{_%վ ץj,asz9սbD bL(W _TxZU3xQD=F+G7U*O;Z]=WyuGP}tϰZ7)z޽z}IUE՝JaZ@H@AMrVs?ު'ۢy0r {UZi#ij@%*砕sO1 9\pnuϼZYhnwf ڃV}?֌N]>bV5U3j-<*S{Vr\9^Ctt[ƑKUkFQϟ2[UϻZZϾM0䀪禁<'EY'EVcF=gtsFF9nwμM*rGלoU(V_Tݙ`U[)U|& xvR?ҷ8R(Lׇz*5NUoT<`U:}P1rWDOsܪJWut9BeEjf9w^}ӮǡWrGȟQ Lr[;Ԍi1QkgTQ> 8ǣ<5>q9s_nkν^SWk$œSmU{76ogg/ HU(rOՃPj!?rA'֬fP?Vhj~Hu?sx=rd@U#?C7N"5z(oQxztbbjIƟK'q6d_qj]=>5 rj2]瞋#i2kw_]7=j_ںdkygw?_O_7}/> ^`yu!GE-9ZshёĈĈĈĈĈĈĈĈĈĈĘcN91ĘcN91ĘcN%1XcI%1XcI%1XcM51XcM51XcM-1cK-1cK-1cO=1cO=1cO#18H#18H#18L318L318|xw!nDFnDFnD-D тhA Z-D6m&Lh3fD6m!Bh -D[m!Bh+VD[m%Jh+6mDۈm#Fh6mDۉm'Nh;vDۉ AhD;v Ah'ND;v$Ih $%A. rIK\ $%A. rIK\ $%A. rIK\ $%A. rIK\ $%A. rIK\ $%A. rIK\ $%A. rIK\ $%A. rIK\ $%A. rIK\ $%A. rIK\ $%A. rIK\ $%A. rIK\ $%A.\)?+EЕ"JtR])AW+.RE*H%"\TrJ.RE*H%"\TrJ.RE*H%?M>}^oeRm/data/lltmdat1.rda0000755000175100001440000000225114375241641014150 0ustar hornikusers\jTAm`p:QʍيBU!~_`P:ULT?NUu+ woNNJ)esg=|-޿}zT+[ewx?;:?]^-Uy8|N@q>i$jOMtVy"wgx +Ow>QwܛטּyX)ǎlG*s,|XvJl;z2%?̅˲//\q <%NPzolb6(:WVx8ɺ'﹠*esmou^=P9 XOX~\}2cEKE,q⭗~GBqgTśIPkrV˟_vK2ZO5'6>gqqMO\I[V1̯Eߵusj7f< Cq劲c~ {Qd֊â+EZMl|C}INJ}J|4qaœqא{G~tp.yV9V.ZyT(ޡkVZqΛ$ƙU~o]+b5(^ᆭ~4>J|[#;._y;e oeGYuUO}zV9s/Jr;l5G:ƉUt<{hl,zŠ򰆗8I7y{?y'GkC|m\ɱ{=ɦ7N?8@ J1y멆+iVs[@[gTm?w(>G<+GQZ'G(;nʚ]Su?+V>o#JIRfUMGSSU^ϩ7HH4c^Iy8<2yt FS'Ud}9eRm/data/llradat3.rda0000755000175100001440000000050514375241641014134 0ustar hornikusersUKN@ HG%Z`Œ@ݎRR$sNDzy'z٬"ʔ2x3qv徼T#\pEK zr~x=>)bN䐱5[EƞdxN?3=MC{lÎ-΍u~qכwcj~m^h/w>L_|oJ<ɟPg{~yfAFgO#SyޒeRm/data/raschdat1_RM_plotDIF.RData0000755000175100001440000006432214375241641016513 0ustar hornikusersXG{9{PA wXv5b%@hCQ,!5vۢ{ID{gy;w&r7{w};sޛy}vv:6 Q )P(П U:JEt-o@xXOmz4/ixFႯEmQfqwLo]_V׿7_R_-GNJ>Vr*O9Z~~[~Tom}Nj\Xͫa~xJ>k9[?wVtZ;RON꟥V~Yg-[jsگ䝵_hk+Y.UhʮWkVpNhyV~~`G*Tq2+b_,'_YE7,mWXrVUV'uQZz#R=k??ߴ*.v]]m![H5n3vxS꼞ܖG-ycKhK팵u^"(_j4eoHaa凰#_ǎg9zdXyVqx^G[h*j5|֮؊/Y$-y+[^vVvV{oV׬~o|k.kڼTR+/e[ϰ6X?Zg٫?[/~^>zoRF*yܞwTyyuCEk1Xۣܲ^"id;/^:f~7٘ +,vPn!5aMnf/:,8* ŅJAtz[`m"[kg z?bOKv[o=Uڛ' YUYty[1֯+KFJ`z[uإzC4Ǜ십hN{5[c46d[ kR{oU^l6fַ^Y;Z?B*l(V|jsOIem3VykHq)m7sW6y]QX'[mgqGXeƕ|=Xy<|:ya'~;L>:Z<6/YX; r%ע>GJ>9[ʿgOHZ;Qj#zݗ~cX3yR869=Xkc<OXb#/;s\a@BBouf7`7q"Vtp +I{pf~¢ͨHauA>1*;ܶiAB/ok֥BQؼ:lԠQ!/) saٿvlC iJU|e447tژ~&e甄FN$*x+uE=.2' ><77u,!txKozbS#>m4k9yߕo?Z&[>pͭ7U4-#7,Q#oD\h HQmZ5-5Eiߴ3-|'hx}jYϬ1+kfeY ?~j3fS6Om ?~j3-Om+tj(PQSe6Kpm%q]m[@{=fq6X)zC_.OzZnw*+.N|Q9gp)wWN?;_vÜKSM^ΥԺߙA G%d)~xwbMYObx+bt(ׯ[טuMOSp_k7O_=f_Ybq~!4ί(]/]]]/]/]/]/]]]/]]]/]]/]/]]/]/]/]/]]]/]]]]/^W|+0fPPPPPPPPPPPPPPPPPPPPPPPPPPPP:TfkX'g:Jm34vE\zș S*sѼMS a/QXG\0nesn_Dq/CuZukdܮ-$sULze~w{ lv˘M{z;nw]ovLÉx.=1z-n\w ?l;&|ѫuO{ImNK҅;3xWnGF܄=6N-؏;nߍ'Mr{;O0.}臾6>(; ce\&+tfDl?S1s'SO8~"_>C2>]+wdnh?mu?w nO@69U<{0+,CӪr\U5uY?ϝ (h-.@KB&͟W63~~謷_ Ƣ8*ӈ~>Ԩ¼;E8,sw`D8-T43/$#̚:⸵ ȜLEZ+vRQcm WX|n^ɐjNtGKO>1{@Wǐ[ WƑLlOJo֛[*? (j`UZjR>Xղyw@Uq|*0նr&*M8 ծzZ>ձ?qr{[Jfq}q||翟)>>yJN=sy ;P y[39=s&@ak?-dYXY;Py !댙 ߳_(y#u4FށbfeoY3k%@ko%@r;P3yEށ"@y7k GU*L{ѽ|̀3`QfRXT\y6O\7=οڞRn6nǾ=R] Bk# Cezhqo[Ӟ|Hc'vWgh8f,m^{)d]+u9jBB{z͚6gDTrwqIӍ~ohؿ_}mr^Ч =jx5F ܮAY}ڼعqݏ+1|ƺaxf>_ ߾5IL@$58R*~!wO?; =ujkkڂN0g3z:5˼WƜr}|غe|^'ytkx<&}Tu-?Aor׶?כCGMLvSݿo+hJЏۏ vroI㨑;XmVAFЋ_@9BOg@S\[{~~ȎS.8 /f]v`l NO \ْB{O G]SSQ^ޣ?wB;.Ԅ\sgtj#/ `>#i~x4oQ}at#1_8@z:n p< 롛;BפNo/]QY5|8 Opw1>rz`>@;/ 0>RΥ=ٳy|!3.r[jϜ(үm^I#^?-&Lډ{pK&m)8q߶z􋨇_zA~OQe˦gN͛_`~}:p1Cb={x^.!CwSP6}.Au[\_ 7?d$B0 w'?OhGӬe.UXNrv<-YչN;,=yv:?ռ\*zC ~`!~ڽw`@~v0>6v(kJ JRwG|Mro<(yS{ ;xX_k!8b@k?? ЛWȟ0oiw}w?؅^kG^zhxNwRㇴ{m= }sZ 2g"ľN;yŏ{-~mk,/{:~]qG 琟RoI ~Z? w`@B 0>E)~q~o^t7֮e_"|9 y8! ?0_;zרy"~<?3?v=m?b'}$GA|  5}'}DDj _pσ F~?!?3/A1B~ _H`> Gծ_m'}jWZ[|6ukrdrD%-ߡ=+|KY[⟽·ߊ ?-q۸7[ OB 2B\_A_?B_}=WpS*`<6$?kB/B~ ʐ[ >kx3_)~#y;W|ɧ@~,'ޘ#+>A|[p}>>/ȟ#Gӎsk^H3C#˳Y@g9<ˑY,rdyV ˳Yl Y,Gg<ˑY, dy#˳Y,Gg<+Y, dyV ˳Y^< o ..@jӢiϴ1-jMEiV>4>feY׬gV֘feάl ?~j3fS6Om ?~&Ǖ j@wl/7sJo^[MJo^[!nBs+݂x6Fx::݂D9*݂x9݂qao;݂t "WQݎFt;*R;ˊFtVz-;ӛS oKw^ΫNt\^IaX.&%IפgRҘ&%Τd .j\&MpQ6Em4In `kB gZe~Տ)<[AC#!QrаB 4"&2bp#ic؈w@DllT`cam}icn_Xtt6n@ q84pn 4LNT!OݴW2m}O{[| q5*+XJ8_{Tǽ-tYǪzlZץO.XjEO꯼Z7rkWH}Jԧ-X꿰NߵթjRk:+k?lʏ:^K*g+?IS/XdSXN*:-Ju*8<"JGJ%X ҼIR[Y'Rʎ;`*z(zB*raȫ+="5}RϭW{ [RӬ-lkȬYRE{rjůuʯ)I֏6eg+=mSYY!m:g+fm^! 2lѩ.5JQ-=RCc*5J =RCc*PL-дBRhZ MKi)4-OSh?OSh?OSh: MG(4tBQh: MGPhZ@PhZ@PhM[!/xGy/J^ԦZ{Ql/qXS4~(XÕHc(YR(lG($(lrNWދbټ{QlJe(lT{Q?(#(Yo(]rJ+;&E&(EΟcyſ((l]y/4%riYv}-{Q㯜y;y/4BA9ϝ=pԪQ\'G'nڔ!"K Bqu9[t9e klq[>vi|}ecVHu* h fNzqm1QInsGUƥ/з2wgqǣ={!wL_wxK?$z\zc2]rodJB OkA~JTQbYRR_9I_WlqeU[ p}[(կky޷өߠ~JUY~b`^G ^A~nU._7{E5xګY6x> jwpg̵'q>> gg6g]|hjGj߫ɞe=^dnn<.sFG8WJ4_zOD׃1B?~DӜ:īa{!}xUV@Wy'^ʚjٯ髣yH%Z7}GS;k^`V|Këjw>{ivGr%Kr'W"ni2^Q%Z}l;Pzn̟Y]t}M/xڥijdÖ ?}Q`9\?bC}#x^ͪbt 4trKW6p<wk?;?@+ NU@:*220?_{ 6 z] /yT6757B*̗3vjU#?(C|~w`@~#Ys˄q@]_0/LzXqrXk wG]󪠅W:;M'< 5 'ϻ=Nxަ7 z<~v_Cʏys8BOF{T_[ >k??;??AU\m{~̷"c$FzIofR>߆bz]oOx=c _ /`} Q9CvkcOVb|l? [;2qK+^mG:(^ٻ5_0xP#1~  Wbx?O1^ɦGlr/d~yDYO!n|y1^!~+$>c?~x?@? /?_zeyAX~ZnzIwz)*l<ѡ+߃|ȷ ;ķ|'Пf|+/ڭ?ϖ+C}oɵmsڕ1?_ ?;ķ0A5П_@?nkţ_A{+<-SuM^7#[&.3>!& $ o_H5~/"<Ÿ0>  W _e&~j{wc?  !#3_|a}U{ZKx?vdmU) V|9Bʐ?1O@-A5O/P| G諧ۧQ$-?z}_K"$ OB K$;ķA|W"OW+t~`},`D''1@RB?_ ?;G? m1@O/ @z+H~Gw:3~%bw! Aȟ_D >B+$vR'G1vmR^EEG>4=UЩ@g9<+Y, dy#˳Y@g<ˑY,ϦY, dy#˳Y,Gg9<ˑY,rdyV ˳Y@g<˽~y7".]|]զE_ӢiQcZԚM:"|'hx}jYϬ1+kfeY ?~j3fS6Om ?~j3L+q&d;_#;O#No^[pI^7-䐎N`!nJs#|s c<nA"nAbnF8 ݂7݂ۋnmk+[(ڊnGWj^vtzYӝ[eEwnZs+ҝ)y޷;_tUzDw^U_Y.0,q]:.]qqAm\5.4q߸3.2n&%ڤkR3)iLJZIIgR2Em .j\&MpQ6Em |7ly,#%_f6&w%8oq. 0C">oI Qqp_ߐFDF amQU l,m>Զ/m Φ p;?w.Uڝc IVEG-ntTlɹuG ͇~ F~41C>j,TF3-2) c2 QqC4'# O m/uS?rjy|-[r:ʑէd9]qa5ya[ä:b:'Υ_*9xW|uM#ݯ>l-\nʇVGw[ i+#YR}x?ʏ&z_/XYGoGcY ~,1m}Zz#R=k??ߴ*.ym#l^#ոOVGX[;Cr[)--3GyʗՑP6y/&[Unk}\}OugIIMk?V<,[:7ؚ/Y$-y+[^vVvV{oV׬~o|k.kڼTR+/e[ϰ6X?Zg٫?[/~^>zoRF*᫇mMEE |YKﰊYo-/$82<|V7sю/e=2fGz|cۮ/[kg@g-٣_Yg3WuR˗|uSJK8^/K9YSo#}F[vUL!V1|`|`nۙQfN é8&ǘ9PЀn EZz E^f wX7 CЯqfp5f>S,-܀?/<"9+q_ŖU_Dp',X8Dޮ.=2o-ʂó3[:˜[y֥gcpyĴ~۞O1mV.'OQ oOkZaO7c: ]Km75.`U;4Ot}k>sT> [4Խ{]'l~M|Z! xo~orRCoFąզE_ӢiQcZԚM:"p~YǬ6+֬oV֙S6Om ?~j3fS6λ",^P޳ Fϋ|p..s{Qxx߫k2[g+Y-7Df6qrpevQ]CS}or+FLJ$^vvL':ëv2|4嶵fm1N}GK +Fk7(~ƺ6.;' $ gd~aYbq~2H(////////////////^Wv+f(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(Rr"^Heֱu,PTlxA\+v빌~ʝQ萊]3Cr\ۅV 2zqyl/j qV :}ri7Q'jo? Tޕ;[`kBx\?x/|_s2*O> .7<]ZϽ7Q<5)sՇ,*wʟGqPڹAx .4/?Z9"n:vHcݜ'\t?1<`C|uCo߽;ިʤFߠv!b/pG/{#>^rigM<Q0Q+ǹ S?/Q6D .b\2u;̳Hͥ]ʙ\F` .D"m>/j.=8ӳƳ^hSin\zkd̏T?rboݿ4Qu ̽S!1 D &?0Q_ ZQC^e)J XɔK _0)]GKb(MV+339] kǁT+lRۛ-wTD^CR{ylVmyC͝vT*{[C?]*|:ࡧyb cpSG{YYy0\g`:!iށK7lBRWW.>>'nCI-9N<[|ux˿J__GsCUÇ5NbX+7=dTjjV2n+3333 0ެ$SX~!_ | |L8z"V/KB4vռX; v|i+ cw{/|ǜ?|>)sK'|؊.|6B>U~!_1O lz󷤶/|6vJ~!_Z}%/!WI퓗_ȷ+^I G~!?g]~!_~!_~!?O2yfp6wr$׼+`Qq 5n=58Z<Wwt甊>>U=[-]ՋzI@'\_c] tզcƙgwu] Tm3@T9nS ӣQvrW?^swG߶ګKmu3 /sPIKnVE%+uz 4_A2_knP3"6ģnn *t=DK yB D>\]Gg;xoWpEbΈok,t.s -!YuC+a:Aޡ}05|:]ajw4H |PKgoѥ;Z 'O3(a~D}߻Obϧ_sBW]*t~2ޠcS{?z`/[Hg03zh. ˲!J}x]! G8`WZov};v7R'+r_7>PIWvΚ3%.^1]UL혯c}CoA ^ۅn-6b~a/#UUj oH~ ~jͦӧBq|y0ӷ"[Ÿ9:2ߴc}[ vʧ ӷEV|THnw5vS}ӷv *E5wb_Q~!}ן+TBQZڲ#ճ!t;D,Pɨj?'\]/5/kUTح#:Kfx*,驝W~dڂb{R/m0jEd>D yNOhOk~R$f{V졘{+".7{,a*~5+-.iU$^-i8ns*:=|\Կ3ky6KzœN x$A"&w/z:b}Jz1yg~G.<>\]!}Z͉rۦәt1pؿ$ȍh}~bFtv^ VNx^77ѴH;EW|Ϩ9S~)+,==߅}(~c>!/`>-7hOS?BOu;=*S}>)pHF_!W13pno,ʟǕm Br`_[{\ygDU=% rw !^L}#S# Gp-KE׫v_{Z}U{h c9|?P%'g࿀}'Olȝx$)JG~'1\ğߤ' msn^\l?rk!8.hˇo.tsB:D5W#ў oWH{D~#g/6nkgu#8Ԃ|M~-A;? O/ /y^ɛ0?sא?`.c=y>%6\T|APfpZFE_#!~9Ϡ=w`@~~?yBfWxT+vW4?w &j XS>Y[|=[1_ /}'O/ "#ivW-jĞ.gڜ?ҲյlLmQaiO<@| >23_ < GCs |{Dg\ru6\Z1}7+Pe`#D6[E=^o=~E<M?r[4-I Kbߒ#Q_D >_o[O޳q>jN=ߤ:ZmnðB?} vYߡ "K< 'Oiql=SmFY\BOxN/A;O@ķb{HL_'П_@?}ܛE'MP?}yR߇<R5;?(_zmE#ѿ3ѿ%σ ?Of}WeeWzb6Ũ |_C~M O ySgߘx<5_Sϼ O2@=}*m!A~^ߑ.?!?3x/_~V?|`>@_|O?Bfޕ|^DEG=[Vqdy#˳Y,Gg9<ˑY, dyV ˳YM!˳)dy#˳Y,Gg<ˑY,rdy#˳Y,Gg<+Y,r_7 s_ Ei״gZԘEӢδ+ feڬkV3+kZYYgV6Om ?~j3fS6Om ?J\FRdc{K!V: obț[y[:/obʾWl셼-˛lד7_~7_ImK|JZL|XzVT~ʺ<țOW׬qcc/7_ |+ǴGJ|%oz6_I<"p)eϋ;EIa8O/ntKQn>O'q28' X!6+Cu~Ƽ[iR|cIThf#.k>/qYkBfpnؕ^rigM<Q0Q+ǹ S?/Q6/Qy"KX#9<4LnbN.-/GsiןlrQ/Xhww} Qn>KK,lԸ{Z~^mڢ-6>3#8Տ<[*E%^5sDxA^5Oec^UIMYW5[S=v:mWejWzs.Ɵ} ^ޠSJO^~oe#^ըuxդ%~;՟W Ԡv[Nyk1 E?dRyժ…zĶA߂i-xUj{1xg֭}r _BםA 7 U%WoA߻}e;^Ou@߆WpHDӛpJBusf]cx4U&Z}|M{;/ũ__?Bgx>*iNףn\R),4cOϗ"EF7^ߐW Ax՘~ɫޏW:x*jh>M{E Ux> ذ۾Lx>~zX4ug6zS"ץv r]fɫ:U1'(})UQb|AD$G^5m_#7>cٸԽ:ܦA>Xt 7'~O0|:D>5 {둇A>gd"D#bǻQ>#H4p3nyRznּjs%rs¨[X>3@T!)H[F4<&=M3s!k/\3ZHO RW]=2J-NAi;0\eW^5F~>;Aa~@>Q_Z|6rjC O a3Dy+=T6Ŀ꡶_F}Avn7Hϔ.%peuK0=Ӫ ]U^޾cC:i\|gI\[X:S_bcߞvFRP?Bom ?w9?\}h2zL?П_@?ރ[K4*lna|}!~c;WE(Akqvn pī<9nޕJ?Wjyզoep^n=5kw"::H/,_Μ`|A} >PlrNȮ[ϑ Nخ; $bR L_ Ӹ݅1 v‡`9q G8iZf_#JEM t$osV W˖MzZ=,g_qs\m͸X^\;+o}#*QZsG#~) L?X~S ׯVo`Lg࿀}'?O?B_vgGy՗]xՊo]_+~2 Yfy4IڵܾC|jcn]wZ厼UVHF,ʵ&OO/ 0lWmboT|(e߮!O}̫>]bl^!¡E<( OBt=Ȑ"1'P˯ƟB(k>!~~!MW}v`@܃¸tTۀ zdvXUG_=bCYÿ<ڀoNH=4ɠv^UrVXU;[} ?9/Ov`> G7i;Zu_B~nCW]GpIp>cQ ^ϓG˟A5.= mF![K>gI|~H yד3g;|-S`{bOa|!#3_ '{bs"=!y'秣ަp;̘1e= |_K+cjd7݌U骁o )EƷB|~%_C;O/ 0y(ri޳(X~hy?=.Hp{^<7!>)׊Xy5}APr"7C| G?@;??;??A;슅ku)޼jL(OvG\U7^RCuq N{l5H\ e$#hJ\F3_q?AG\V#±H_T!wȄ˞ p.! 'woG? 'g࿀}'?O?Bwڇ]u&Kwt$@xg`LoDB~ /@  `>|%^!)+y.m/KKR{?0+N4+q_B\3/A[ >k??;??A<jGfO7iY4)'[!ۣV. ?3/C;!#3_9 p7=U~aLs): OB KC| G? 'g࿀}'?O?Bwt)]yJL}Y ~:ǃvyŏ'-f~_ ~=K ˳Y@g<ˑY,rdyV ˳Y@gS,Gg<ˑY, dy#˳Y,Gg<+Y, dy\c<˽~y7".]|]զE_ӢiQcZԚM:"|'hx}jYϬ1+kfeY ?~j3fS6Om ?~j3L+qn;_#ˉO`r~n7-Xrn^7-䐎N`!nJs#|s c<nA"nAbnF8 ݂7݂ۋnmk+[(ڊnGWj^vtzYӝ[eEwnZs+ҝ)y޷;_tUzDw^U_Y.0,q]:.]qqAm\5.4q߸3.2n&%ڤkR3)iLJZIIgR2Em .j\&MpQ6Em |7ly,#%_f6&w%8oq. 0C">oI Qqp_ߐFDF amQU l,m>Զ/m Φ p;?w.Uڝ!A"iar rnC󡟆EC dd̐OKQwLhLJCFƘTܐFly PeRm/data/pcmdat2.rda0000755000175100001440000000140714375241641013762 0ustar hornikusersZMOTAl`W&Ƅф IW?_&V(z-ߟ-N;\"fEيY氀^uV6֤Uߵ~ֶT;t(,qx|8,Os[@:aj|za2{V|qyȮg5S~ xd~2*c7@;Ge}-cGLj͇S|,/=?aqu9xآzgY,?ı8ʏY>UG<3;3A#~kLֵ?MwyZoW1kdKrټ/g;[߳5~1?ˋw-T}w={Pﯢ1m8uo*󥗷j汩֛_~f{Vy3l0{+7j!/Ӻn:և*<үqoqeq?Q ?=3fo몣do|[3,:z(>׻sZ[.`|56^^\KCɛhIξוv.ǛU5ޒW]nA&eRm/data/xmplbig.RData0000755000175100001440000032026314375241641014323 0ustar hornikusersAmےd+2% %D_h-e*)(|BHJc 'w9{5rwr?O___xg;3[~gB?g|?s!ϏqfL|y|s9ޏ/>wY{^dz${9q?yi<=ʽ$gĻi;:? ?m2?Y1_w13q|R3ycn8p4R>ôk[n܅ŗصa05sf'Z /8Ιb}֞1wbׅgا+465ڮΞ/}8sw 7k0\,&(qCWi 1yk-aw^jp.iY/f3{O9Lx"{~\QxMr)yUcrEuWS#@>է2}R|*pnEL;N1Ѩ;xF_>s kt ޚk|މM|}Qd?]w% }e3)nGf`LۋXyi {݃s+=od_EUSb<3 ^r+?NQ١ذI̪>*++<Zؽ(l:tlm_yW1#]g)m][kRkrCZ/"[9ik=${PL*{e^pFj|O2Kkyt?bO6VO3q}b4f)'}fnQA^Ϻݣ7rȕװe.PjPmyAT;{Pl4rvj޵eG&7V=X2Cg߅@ 2oUw'ghCm[)|(?r$3TMS`.L6\i^;3=٘WϏ?n us[LJn]гcH㰩QK}KG[BK"l<0 {ZxCkekp;+G_wo.lVN2_S= &w/D\8WZ֧>lp,Nr gb<_zK/)/bv9m؋Oۋ>2sQ5*;/T-5sTVw=/gzvZU :p5v1ܝ̿m3DN<U=)we rwc~}$Y 8>3Kz1,eV-Xf~U5NC/{ѻZ/b ~)WuNV?֛U?o|ڲϪȘXlA,XhH,>,1xF 33 'b^z3[ފ;ՙgS7:cZFK /3\6J`؞3;φå8!h<˹I2S<2 U4:4][S~{97֌vDM< &u}bpΙG|RIsP,Ok S||W^)mn.7i}*{ O:S`kϻXg\,kko;W@ݻ^1ePt/7s_g45[/D9ljs24'Z4w y` uuɳz&/՘Kq3'>ͽ7P5Lz'-A Ut>i.)5z'A,}/[,DaΩKKHrU/8}"GXnxXESo9.V~ibwN&ĘbʲMifݼ\,GMcՈ7ECU}zŘ`ޏO׽vj=V,ezm;Z3\<C+xs9VۧXf)F楧FZoߓHknԪ9iu+Օg{37m\6_m|\8[nxٯ1ԑEU/9q٠ _W65IʲeG(A_,36XN_ /s+"v]VR4g<^"oG*=LWi39hAcvs./޲p# Xƍ]uV$Q\o6JV*q'|2/}4u밻┇%̶[63O]EmQyEj/_X 7`R;O-oYn>׉;ewK{XfaÉKʹT ibVcrE9m 8qY_wr4W,{Փ^xw 9b/fL9({x^ßc4/+},3Y;#rV>O*'j5x[kX|ͭ7{(9(?qbSLs(|Eo樅7v.S936L__fxg26ɘQ8;ϋz`s̙p[J{Ƈ`,Ͽ>Ubo(n) w#|/ch|%Rgɳ2Y%-q%N/~V;jY67  'Qr+YbF_z} GJnYmg,bbzŴy/;{ZaT1\?̹>͜W]:BsݴwS|/axGL^5R=n{?nׅW(y #9x#>3=N0WXs%X }8NQ73'&nչ:fd1d9ŵ/@kuZL6wWQh.9ۻ֓SԸ&7,Z֕6&U' GUPt->/>Ω^9|uIO5b| 'I|4\lg`$ݠ'GybMek+±zG:Zl3@p_}8j"[;_;|묜Ǫ)Dz@SW>jaS~ŷy/ƋίaZ/3M̢m&\mѵ+3 UzX7ʍYNOտO};_b{u~>YãXcGBQyϧg:Yp'obN}qGIysmѳ;K!u"u>xg%VX8US?V]<&kGrЫfk˨;'ru2Fb}!?X0%iZ>_S= ߿s]6Y-ws np-i^UyUup&wz6NllV/+a,Wv|29;BUdS[NW~‡Y?.'jB佡\X\GYO5(#\х)e3|g OkZ?.s_+Sߟ|Os*}''o'{W4| ?Mv:(! |Bŋ3mx;++Vę 4Tl Qr=n|@|On%5U8xH'݅ybIR VƪS] ^(K-wOcXٻa.sS3ݵ:m8+oP5Y-zOh(\fV Me/'{npEݥbܢb?{V,'흔آ@O܏RP/7YI3 4w+XK[}zVƺNk.|hϡxrs'2[\Rz{}1k5?MMFw:3xˬ AOĖoojٍ(u^RNvŔ_ԈfMù> JLxx[sOĺw{.6/zVox.c> }^'sҿ2*7Є[9ğ1^5щTpJ}`1Ϣqx9 ζU[a[aK5eH$9'-1^ӋO闕yqb#SRLkHg,3S92Sw՟o7<'Mj6d|_Bq;qpdf6ʞTe4̢x$3'։PzkHоDQ4 ^g;h.}ٟ2!1ww<=5Z\/4 /F[}ubƥ./Df|W)؞sq9x-ĕ[1W_4x)άZ//HCcRӓh*3}/˭,ZT4I[OR:+kCdΝ^xx?UzN|&Zz ί=T˄[4EYqŧa g{4^'cYz=XvVWxB+:=uƵ1αuN=2gAc;RhMs.>-g~_9M͙.8Fέ7;PΥrP(-Wd kS|v}A3'ZȿNQz%oz'~L_{yfPR޹S 7;Ke&wU~LӍׅcvȟ)%7#xdՙKd=)'곙aH F_띵̨7~j5h'Ћi[ոdxD-jدy7Y^z%S>u.E[DWf'ĚN޹殒B:&VYv?MjT쬩 NM?դVrK]aR-ڽVCjb;YF(k(w}D~oer[/f*wy1S7RfԠU{}Cr^wgG// j3 `tU;으+¶/Lnnwnun wzF^}3SӚ×RY-ۃy밾nP>};fU.;`'nx ^3lK? =Q}4W_"Zo}+Kϊ_-Eb׊Qݍ _vx]΢}^jL~[=+f2zG E/pg4̴Xҟ.9u^ٷ|l*<'h= g){ٺP Z̋. v4.w7{u_\A0aڟm(/:x Yg-s:pZeܦעѸMv1{\ GU5, %RK/>ҿ1|ժo[#Ư  F^FM/9eyWK=ģKUWN>c*Âޅ`W\sƷc3j۞?ڜkfBPber5V%\f ʼ~23M^ pvrd+9Me1X- v=Odh^wWkz,ζm:z((WH^$h/{Ivkj_g_ȕYM#l-Q/bsʼnX$.p,h]f;ԵF5M[J%|BeU«v.+ˉze~(Ufyչu!cɻze'mK|}%NefRXgOc^ٜI l0$gΜ%f?e^g䆳h1eѧ:^O|= Xv ]P$2z> lO)2ϯ,r3LPؠhf,{אU(\v]:F-Erݕ-}W>&/m*.uVY>+ș,epգWwDYu6սQ1iovQhivh)6;TrCi1gUh],f=,`{s5텐y'x]g ]h~b9M<*uvipá4}v^h|nW osc:@WUR7Y#_L`(}jMN_N1wp /2xYԑ*U' ;̗^eJ8XW],Ͽ˳X.Y{i<Or'b9sVԘ`i g(so-#-uˎ@5wD,{^ن] FxVj{ggyoxX.˽`U#jp};Ϣ3 ~ u+gb)omcZ jjZSF!=(ú>kp69+,(׬h=a>DZn6~U֎' d0_ymnvm]Y"yTbՎ#|t|$G{?վcIM@|/Y\P{*XKfbêkɘy2-jԓq̖f"a]TAl-OZyoaoGc~k(L m2x1W\%U߿ ee7OĚRG޲⽳Z궔KBq^f~,(EA7<ղJpZThZx‘nWp?Ϥ=ܓM߿bT˹=CVy'_ YgMfػK~} L=߆˷El-\濿%riB^ #[`qӠqz}K6-Rc-h P׆2ubѢylY;x &(X[2/flFVr*`1")sܕ2i0 U4r&WsSV_x_./LYn ^CLlg".Y fjoYOp)<2`*R էURxLsO"Kf\9D~rK=nzEb7oƉWս}/-~݇-B^@.GX힕-ylKiڹvOYlN-{:&|v\:{KS|ʎ|;eo-mU4-Zg֫|B1AdG;Rf1&)}/Q1JV{/DAYtM.~זMa:fh祇x!jR<`xԢ;3xY r*sE,ƋW кޗoG%'\`{.V/X͓27qkM\Yv/ K+]@cꡪYϪ7<'9DMwZf^jsT5CgA{+V{RǪcjz+5wZkIJ2;W Vdl+ŷܕ/5wmd8p^r97|E뎐wuœ- T*{U.3_Eו`Zc`G Xp޵W$zٚs _Bc ֡Yg 4y;C iV9oS,qs}x}:v_Y>k1غblݰxcޗ>$峕g^(U5ܵؾnq_|ff[;>ou0\څl1w|w^ (ULYĻ0U B;gW` β|]58ִS9^HUg9#%W[| k~ρP4 _ږ2wM T3&߹4~5ui0 owvvދ;ދ:qfk[|Jx8%J_d;CV9zWε}L~e.r ;{pZ.rU[bP'r? go= ^\O>8c5L3Z|yeچi\vqE 2z<Lmp2/1E/XQ-gujNq[E,sT|U?(n1|7,#n퓘}|s& )_as]m\fhRg UnsiHNJƱZu'QƼR^` j57LZxr*Xfժ 5R5ë\Bif9GϘR$_ Πå3+WlQ wg|bs^C?KՃ9cQGS])xr(;)Xw}g֠>Z4i5eV_5+M$6Yv wT+i5in<.wp\,G;]_|U_֜V˸ĩezf8,\AGi:qK/_'.Y;6=f޲?R Ys%=os_zٶFU_d<{Qnw^hG9>Ԁv.ꟙ8o0xb;er4w}B坋S݋g6?ک{}QO NRX՚7xĽ|tsLo ].{4guSwZJ_h\]_8I{Iw~⽘XJ鵛~K} yzo;U/(ya7#Z;-x»3{qvD9^O?;[x ?Q/ƪsJk-;Skz ZhywՈY+/y.5RMEo=csHlS8̪?Ϥ|sT1=\d5Vb`ZUwhݙp{7+CjÙZ~A˿'|V+wxRL-[cV_9SF,1/=,i|{}v]%gbwƻm:Dvz1Qrwu|/v.^,w|_ylA5؍hӘQv)`|M.(lMK{{/` D\,= &2;h5ٽz)jCզ63S23n9N))+\kMr%yēs3fۅ<T:slFz=4G bٓ2Xa_zw)Hs}־vg+}IKOe]1رq ZVw$(T{΅XRٝ)|HsJOx,7,r>gs-.]"Ӯ4Rh(N< T P|,w| e-Xt*V@ ~EJߟKVxmc9??ૃ^v:}29'Zk Z,Meա3sYY'I5w0UOY.X 3oag6IL7wË_gh.S~'\/ ?f--Y7ϰ ;'~Gl-o<)nzEs,/pek>yX4)ޤ=qyy[&(5/xgelie5aLGhWCTh_"ֶxBse㕭Elk*˥ , J=c B5u?,Wmjr b<},:Z"C_8iݭ<Gįm=[ejyUOZVMQ~wGs],˟ ^ \ɻ'cCK9e{Ln Oe&E_݃rE owCkd(3gye_޹pI|,~}KJV^=E| oi/Ep&v6zF\YhLIyL{Mb9#]u˟zG˞HOOw֝e7h(I -guD:VX|M]ncAe&`R{x"wҧZϰ2LykR[QEMiAKgS};KO[[;WkԞD̢qdYwjm&\ WXz ۝nU~=S;ڎnCW-5޹ksUr[]0\#^x8? w[
*\uv}ٺu^;nj;wG8Z#9 W]r g[;z^q~xz*֧//;;mGM|W$k\5oIwi6SX\l Jk8r?,DnG%5u$0v^p-]<0^/wȖ3[kEYGJ>\(_RWwV_lrufTI/Z[ ωjξ[ī_9`~ /R=NWEo>))M_6@,5rY?ⶏ`g˾事V-ˮv>'>CWIc*qpd.dkhz.)&^'_>e~ќ {^ e_bk3e"' oH=d_`К̙s}!.}OZx;?ZĴO>owxGb/\Pv4klx=Zf mNUcxhް3{s oWZWh8We7m_V;ϭ6K_ɽv.՜`rl`{ZcZ~_x@+|]㩩URZW/kK.eϥ+#ď?_wE\w;yW&TΖ\)ޣ($6,c9Ň`w~YaRKWn7em=WjzeփjymJso֗>_F҉cf"uD8;e5=|/VSK kr/eci-oEr".]m{uWOy__W{Cj6 ʾ g)k4G>{Ó+6VM7lw)3?؞E_hl5l}v4o9xLy]K_Z,|֣`mB/~,-n[ʛվcY꺕2g%.vĻx[niך:|z4vٟ,T=2r0b]gA#:q(^5ÌFG:y'>P^{K]ax:].s6-9bgH̰;#fmmt-:{̒.c`5qJf0 K[EbsGq ^KvFegAǯuw_QNG Aba?[| Tr-5kPЁiN1Ԏ'm0=ov6Y?Pfq n)k:EF&]/"q9#Sfu 7T{D({$;b _b+n֒ջh/=ObQik;1,FUʳbjSK&J.E+?N`RxfT/EKjњֿZ g`CuUr/ʢMcVDܪ^}Z^3k]f4K-{A>m/FÃyWri3ܪG{5bl%j~}f<L}e^ ݁)w%hu9;q3{z4~ﺇl}lti9y*{2/XPoj4Ooо췱 [N½<;1gϸD1:d8eƳD _W<٪ދ#uHf95m2Vkk5eŴ)/(Wok/8 qs ;p/ pe&*X"¿}`ɲ^r Ƕ Xk74Y>'W y-s,/+P~{iYg;*آnuP=`9=Z#I~-K ^*G_ =O/^(lc<E-/XV nꄖ;fxs_F3/\ "`'Kz<sNƴy(bpsLq'XhZWf^/:< k{s&/xo9ۍK-:Rw}ZzBS\5|BM^iÅWjһO whG R< /{u*U3jNY)'Ek`r 弫?!h}kbPfiPxCZ5,ozقSdY\*s&oZ.xO#Mup\2;E#/E+pݟ3ιW n2Er>S߬o=<֫SN.'s^QO밵ƴy{ۿX,sóM>B剜+x0qr/5FQs?i@l8!Wc\j5\Vgߚ:{k.yHZ^U'1ZλPlDx;h*C-{'ci[;X`k_6+u!ں{z7/l}sEWT=h{W`,=y6K0{) oU?7XX(I,&h׼U41)3㔛3|j=<ÕdT9~oϋK m gGc%w?uܧT< [=;X)w&}Vk{k6V!nҚpa- /e^6-c X O>{Vm)^Sߚb3= y'}Buwd;l0Ƒ8\_U3pNd㋚ZwV-{Z^ʯ\|klS5^N~OGkDs'Ih.ghv &'}ULZ_5Nd *wvc#|jv̟_1\ɱ>щG(;e1YlBאpwVb2QAi; "XC=-/N.K}cfpkjy ?U9OÊ}y%_.Z4V&—:[Ϫ o'N#./6]L gfx/'rݽ!Xy&&3lkgbo3 wGyfu˭:mW;+BklgV:o_v[SEblU&Xw5~&V,x9k;2pUuwb6@];wXzo]|=V7' e(~Εh8 h(@ɻzZm,m8 ZK;Ҧ4?giV3b{y\jߝr2)&Xhcۨ}z9yGy҃NZ4w#>wKѳ|͖2by](}ZfWl󆩭jΨ-:u8rlQo٣?{mj;Vof¯YM_<\z 1b3sf^;=zNNzHPռe/YC(XqeY%Ƽh9i(/z ky/L>?]^5ΚZld՞\P1q;b 6|,2UG/H/v0ʬpin _e0TaU_r"EۆlHWdTXm3CWgսXԯwU0, 4yYzuSxKkym S|xw!+e)OW#kv_y݆zx|vC^ԚY5xm^K0\ūQ.{}̒n{x)j z@sj^9_] 7WfLoh3Օy gK)W$.V~A~sƜ~?mOpyX΁R>M}L&ʯBIm|璃GZi[/C2tQE7`o1coEfw-k XPߝ+sW ʣ|H{Ȥ+1$F`;ϣg(xzYhYME?h^bv&hUHv2ۍڇ-;/k?zW*I޶3.K.1(vv. n5(_/jӥj9/̱dg /nG$ ߸8bJZTŻox= ?gG1]iN:_>~GBDŽ)[ щi5ʌzn)VΛ3uW~yu[ԛzyRI[=Ӳwdu [z 6n"0|z H^Wn:X<]LX>\loIT~ӲQ3CR>s)o%V0T'< Oxn8d}>坙XlXf>Zy0ZI9[g\~8:{HYMm,h_/;ϻDž8TwY gd`6.>T _v~s*H'ca}uɮ\$~Y78U]9w~bVbb=-ykDʗI0酸aϿ2B{Q?/ۣPnCOsw9Vck.^'wDi/~&Sw>Hw?u&ƽ) ;os"?{g6,W|!Y.f{5nŃpfW`zel `wMdw[K?ėMv)UӛuM,Uy̺W]=-_!,XNw)mWїq;s~gx,6Tx/f_[=I!M3g^Ijo\]bU83mCM~2f}@h1+ h:SV,_XW4W=.oO|E7oTMVNj4Lg rv*K'ꓮoeOFx)8r/Rt>j^{oyjZKb:ӿ.ڶ5*]QӊhMP>53z{_}! gN%h֋ϰ}_by ټ:wWi}^\qOl;v%)߸Zl1`57yUs^- VɅV_爢 GwR'{[ނރWqÙ-|c/'))fn55M>{NO]ɹ.[gcc = ;O;)?-?,_j9/lvj>͝{8/i(&eƏ{;>喋k{]8F]8Ww;(TYKS#;\7XFf X~[R>3xhgXhsOj]_pRod1%hj^՚q3SfF;%%vgz^Z]yY^WW.sʹdc|s8ʏٺ$w'2;'6.E%'XӫXm9ّTkp[Ӗ\{1PnʜrV``[.s&O-*@Zk$=דy;ZID95.jSԝϢk\w٩6\9ճ楯!9Mi4CߥbI8Fn9]/JjpGi̤õ:#ӵvF</ *ZrkyV 4XI^'6=3*[틢nwO^hfMth:xhrLSNx0[OOsk"[ޣeJ̳ZK1ʾZאsg(c&g/m&YmFʲp-ܰ}DsN񋧖 (\O~VǩTok s_Nʃ\/V.~\50Cw鹭:U#-s`eK^!~L@{ffھ=[ j9 (1ܴz=PS95,)u'z+r~~rli#5?9n$Korr{vU;'/,{?HL4[Omo h9[<c ΟM+Z~-5d|7<2}n[gc.ˉi0Xi,q޴Dc]p(N܆Ȼ\ϏL;S(~n5MmU I!^|(}y/fk}13XrK;eh/_|gVpQO[qeǚeޣrVShsVW$7]f7]\ WQfH^?.uVwsCn4zޘlr;cmQ'{WVk_gւp(Ԓ.a.|IY2c+w4욬ӹK;^Xqݓwzezڼ] ʼS' Exkj0z }o| f~b%=ӳUW{e\m}IS19֐&~2>.s}˻1zؙJ.r~=`x8~h;qg)7q|S|E͞ߥ޴|eM U%^7V&Xe8skxٴ^>' { o s,戢Ah[|=7X>bg:9XB%7¯?Z{Ϸ?9O qyɲ3yuB3vVwk WpחZUl~a\iw.vFpAVԥ|ywl})6NR/z.>bt[9I]j:n_ͻuXmUL'cLGΣՖ5qOb'39_xbw̴.ɵQ؅By 'L'bV=o^Yr'IYV|4ssy&EK+B0ihh,9P`S6NoZ˚~c5幚x ܣ;cRnrfOķ‹WݓzZi =[b@g@}FfXjʋV_ʺDvOֶEp˼@ n0]sxSZV[[rz6Z),zvNpE{\euVD =ui-y4B/Md" gĹq{3efJ 5ňu>̉/FthgVɃu ۋ$'a߹i4:lFSgB}ք(<4.'ωs!۝bvF7jKVD*|2m'cE15:sj^j# Oj{ o(gRj~a4 J>/qލw=hZ->3KB먵BxQO]gl]ؙ@Sx%Ns6h]4.0z쳶5 l[5yuˬt*?S8W=-W Yއ'whxr.*s^F7MOzǫ^8ߕqgXvXafVdtdwg;ϯSe|m"x`\$[p3'ϱN')u x?ܯUk _xy]S_x_x/9u3?xooxC]g TuOl's@_[snW/z v/$; @cx|n[8 ALq] ](`-|cd9oԝB-Asv-Oօck݋9 kz!Sxܹz+z~F~֕5q(™m> /q2Qjќr"Xaw/ݷ)]|gXxڂS; IZݗ0Nurk7|!堌wWD'cq,0|i\{Q/=|8apk=mw(kOU3`G#[.bƵ&1]Eo> Q;KM8jsӫ%d , Jolꎮ}K+b Gkp"'>w,'nꊐ:b5/DmmPg*ZfV_cЪWEk?ֺsgg`Er'vmXFjp4W^%~$KrY/u6kbګn[K[yǢeJ|Zj'ӆXs+rTK]HJZ׼iޙvx3!5O}UEdj[ҟ[A\bNZggwuVkk*cɧ%'g6Euy!.ދxԞ - n%uLWun},NL٫6=c c-戕k-܄.^w^f+e߫{Ew[_bS۳JSΌ{ Xfu%O{Eq_mKkyi^4*hp4XMc j8rwh^j9s YgBha8h_/f(Vn gskͅرgVÖYpS3Fcp< wz \jp)& T| ]{ 1WvFz WRz֠sev3 CǪmvmDj_1|e[;'@ot(͎Չd%sX'~ynӻpmxh~))U3W^xI˥jy9Pl^0_z'c㫽~V9aˌM V7Go֣Qu36DviM-˥U\}!NjzֆYppW;9+Wf9Vy<]8yY4JhAW3Yk9 Ab%ϔFѫzFS z~?4;.o\:_x[zq>/~3a{ qnYy۟_g:y_$Vr4q a+8gJAN愓DN7< ZZ qMʊ&=GGOy:/c*onrWxO؜o5٥WsO_|Z-Q7W_KhO؍xTX|`jR#\8e/bg>몁P|lЫ̩}K0-³eO]'y󯻣 -wBrccwgf;@'75Ι:Qld<.'bA%GWx3kr6 ƩXt_ h\sF4OgFKiwi=w~Ղ.Ao1KX6^,=.|2gQj#:efg#5wj;YM74S~r-XPg0iM_Y6r&e/9xv&Us‚O<;YO<7+:Buޙ2Vbµy۽2d/挢'y{/Ӣ^^=~4/|CSS}#v.t-&v^H7YO_>KmNxuVc[˥cx`Sr?\.sZ'>>􎚜DA uvƾb7(knM@-L}Tc(#z'SnsMQRƨœx~"K߰x:`D[[8Bƪwax܅_  g&Tzg ySp` 6>n_3zUc~&~ wgQNev{h j}V,UU׼\?icuI=Vzeh, J_x#ٙ;֫yZ$6!fdDuY)4sT):xMMyYVg.mu|b<;ց=?&ǔzrKZl9khV|.sv~IMw~m{s6?Yg^0oկ~/)Zm[.~ ʗdå3Xd^9fE#@1\znu`2ij.Y/,7}?5[ ÕbJ75;Cm9Ek[ŋ bz5/xjL`{=ls<^jh׺lU(ʩcKIC״QEʇ^̂])~ 7ĹH3P3iz or|հ_KSfzK7h6M[49r>|C0ɋ0ޝa~}Wԋ5 v13˖GYwn_Trީŗ>KLps0'>#`f}{.?h.'=/J5дg'uzzwU3h3c7:mЯwgEّ\*@Y8> k?jSQg[YcA)]k~%֬>_;n%_,7hݬTB^ h!rU[!ˬᅭY;acɅsp((5Wz*k|VkgK}]riz$W&1bcͲ$YkQLl8#XzVj ֗t//ɍV[lh#/2~\h i nRb5w~,5rW^E:Hk{|H.p GYfU*;ZoR}9rް#_Wx~բԌuWMZ<˱Xt3Y E{[eKŔU?l'/~&%.w&'ٽ ʅLnj-b'`*lIL{ .NF{Er m!fʾQW Q{3fĂY+⑹B\>1=? 6"g,=%{tL?pUfz᭞ h3ؿ^RYe_^R}X)oVۨBs.h.f;R_S|`c]]`+4վ/_E'V_8w#~G;+G-{s[h0 Gh}Ups/{zv[W\˙RlNc&=ϖ3k9xGL=켘gꃘ>զ_t7gB.~F=Wiɫ52Zkz7:e1PlPf&L,=.C)_ܱ1\3V'+-W'VpjՇc=Rw<(j~ם_oSlO>}Y[V_*4=g˼!Ž&'A3Pv oʪ/ڙ+>lt"1,TSV4^ ~:+zK]|sT7AP\]<ԭnٯ_kјm4Q{52~OCr+oj#fc;+.eNXv^Wme_u-ac4.NV*wpW7ruh=n6O`8R9]zQKqvWk v^#tᆏ*fV1ͱX3fUܯ_1:E}ݑsg̗M]-_d{C+bZӏXN ŻGb}g~=Dž׳ɝX ՗ 7K_D0qawOWja[;X56 Z| ]3g!_Ul3Q5lN|=eՅsVfAp*ewn~63jy8Z=׺܃߿}RR{Ep߿F^k/9:XaiL1'q 5f&۶.2 6(+>=*TkiSD髕Z[-W%! F,8k w4|-(Y|^)1?H>Rh#lgpejG ,!+2'bR0]?49[۳bq}|,v5<FƋO]>; d^,n>cg/;_P4<{hk|V1 ?i8"x 2ۃ(G^[LT4KJo0 o[KC0-_!'(vĝK8{=JS~x8jݽsqT.s^z ޔ;Si۟)ۓ/[\Me~GU޽k@[OT^\WSro.|ߢ7h-Zu>b+<φ"q8}Շ+{3C9,H>}р1z3^z~|dkIY7)4)Zq4:R߃IWšPZa+_y8]rbY)/ V?)BorvژW^$oѻ(Kz3E{Vˡr4m*_>4̞QRcڷMtIM bgQL=[{6_$[7вwX CTKezUs \g98mb4ܮy#)DX,_93SLܳ^fNמgs 2h+MY5sמâ?V|z^GޢOآ^'  -L=D~[và HK4\,:U ۾ɘc<ý=,3G`jdç,:DW(םvM|Ɲ ] ~9Z_|LsίE=x(β;@z^iai#1'b RZ;gYsMZZ۹_b/)ߒRϚXKM!8 S_ly2?Y]{{ݥGm{# hjM[gi˓}2>/#udL*8zֽ#XrfGr2&-\;66^xcz.en;MqEׅm9j1M`z7MG]\Kk2q\_w[(1)峖euܗ$}i"x7f_u.D'>ʺmRK] G.s:(ո^w?mwQ5ɹdž(dX![~W_Ӭ=9W6;iv˻#w֩F;[X%O(ݘeR4]?N~.&V=(8v>15ng,z>%GϽFٝ?Z_G/޴;ܳ>aVZ=.ݏ3J^>V偋GŋZ=2J1mo5NU{;^2~4(']VSZ[,i1RoZpe;jj/5QXe<ꜼhosXW~)aםUuΙrO'OۻB3 gR50>8cW&6]csH 0W?v3{bpD0_.0{=ys,*[v mcn-жts2aIm1pKܦ問/>D'c@yonc뎾]#݂q /,n18e_4<Er~yl,}|US-󿋧v=kQiQ_!Pj= ի͗/JNZ5OM^4|?GO>+snHA~u^ 78Ĺ(3W:GMCx߬;k(_{r^mܯZb4^gk3s.3իSgXB?7ڟ`:fvT'Ȣce5 wbp{տXl}S=tN_ϛKuԚ0|^f)h}Nz_rZ3+F;/VOyh$Pfyn{.<^V"fk%ۚy+YkVXrLLv[ 0Ōڃ-'˪XKu|͂_h!3]ٌW=V#E9޳,7Xh7^8%_ Q-eWٗXrXjVްw-,>ZWY'{&,e(_u8~V-To{zH1~gEx;Pjsl[N<[\#شb/4uh& ƙLuk qDh3w\8??SpFGn֝5#?Mio733{R MLy[#- ^<&Qgǧd+.=*O|FGt;,W+~̴Rޏ~;b `W(ghwq{mi>NQ9{2w.tG3j'OhN(z' DcW-|Bs|a?8rG-(pee`L9ghf*O/~?f)9p- _DkL\xenי23l󿍟|Lnr yc垫\弬hK6߹< 53 b_}b2 7U˔r)w-;>=_m̮}ݲ?X4_̍PB3>XpvxV/wa냲eI~ښY8r_v*^eWx}:{F=n4k&ۼHɘl+ @r?OĒʗY;WwL<O[yoUckys5{%)Nw\8GfNz]ޔ5>VWxX\f-e-ͱUӿ5S~:b$ 2^x9|Aq lqz'}_ZKڳ339D49Y,e܉S乡|+|f-/Z=of:fgRٲ(^nm-\4^ ߚ\O@e\~xꬭS/Ż=p3~;k_2Πϖ\{bSߗwighd>#uL~[Nj1Gehl9z9?lѵWp0g=] 4;e}\ 7`Ȓ?-GQleHqӯZ}H-7B㇙IEwi)7ZmwwCut[llܷ\}\kmo'(0U77:)fxtY4Tow>-/Q򻗞(h$Nؾëy+).,DS˪]ΪߐCLG5X<=XsFa1;:fw96\t35{'$߬^uEkx+N>׳)=&m<(^/^$F;Y4Yhϴٵ/~h_3v0֟5qp4gwy7)*wF&qm8_N{DY=jLberEcފV wϷg35R\XxM.担=,ݣyE`غ/B묻cqn-em~4f/uʎ9e~ƭgfs\֋}{wFm@[G,~Ga}~N_aU3;MhOc6K4wrŧ`{LJxFPlRs}× 1s6^8dwNV8ÅYzP{&mV x`ݓϬONu)76Ss{w[p[@yz6h-ax|텣/)= [OહU:N:Gr/mN:c?oť6Fȋ3+V}M7xh[.r||a}|-0x+صdy1-oor' mQ) ^rվ,zJ9.>wFϫ2]yMmCGx}5'Ɣ:g3-7V3 ՛}&q(uF_ .\ߠ]eջ#5ª!iDjSX2/g{*ScY)s06}^ָ}ͬFf~EcxLߠzT}K(VXyƆ#rl_rQس: ErUTo`yQΥj? #:,<>o9厓P2CtNzk6 \Gѥ!gǰ;%ӖK%<<Őu_Êx_{I#_4ZְD>0{FW@M̻wNy3N9'scК旂w j&ה`ꬺOs9ۖuV™5q>Sc1lݼUμo{3qX(3S@s|He>5 2.5~wZc=dφ1a=9u?EXh{sYy;j #.[1/Zc953lj?~cw@Sk Rwhi>`݉#-^I)g ogR/ƾqW=:֠6NçUg5sG|j}_ԟ۪R6SC/]. _8)/5PNĻ1h]-szh-D1_E /5=oe`^ſjT5WX| d ?byUQ\"RRL^hY5Vu'/ĕ gan ]Y-WƥgsT^eb-X-|ǢNq^t_-/1u!uF񕭸o^ysm /ef-MXV!e[ {jV/&Hij뒏<,o=](kb Q4[O2sV%Prŋ&NM o7sk/Um%__)5k߶<^΃b&nşSրȨ;әmM^|yoV[kMxYf,[[s͝.9r/|h`d_9?Pt)gC+G ʝUW\[*kG, Bgrcåb꾻+5F|$I_:  ~;+<_L,.B/W _,ZK>|AH;ZxxF5؞O_b>wX3>|'1&:k^=WERqIN,w0nYO~jηհ5U)svփ3Z.s𮐼kuʳ^_z /z Zi8]U 'JSݻ .$\_[=s[ zS/\Fenr-3t4}gۃ8 F. ?ϭ ]ry_ƹFT,CG:=j W]uڈ ;=k&ZoĻ-<3l蹰\mΧxՅ,T)q_xrY\e+vpn3Z\ Sj智޹_,_Uyl-Zl2[Mx\Kk>eod;2=rEENV3#'-AEsֶk_ϋ5lgZz~+Ә."6k5!Zߐhj Ӽ^-7Zevj{nNx |N? MƇ`BEXe9w7hάzh7Z/]󽷢`\*Nbx8j!EN vDYf8^,ޢMbz׋9 jgxT1Uv/V|}&UTڽ-F_\ <-Z i cho ciS_7K4Ehj=fͳ-@9|wg'Z֚Κܿ_F[[h=dE1s-SNuՓ{ᴖ;j.wf i0%hjlnm?J*KvowΊً ,AHU ~ї?rF`حҳtyO轱:6.W5 ~jU𳦆/W]xʁU Wz{\w_=3dFqrei*@9X}[/^K5 sa2Fj. V2uFUZ{Vk<3_>6 +;EOJoxX}gdwx{A(LvyrF㗜Wq G} \‰wo' ImcEߢKꞦUJ[ޑ9gz߳8%Iyfcf),c7M:^r7狞rn ;MMJxR f-u\B8J7i+sWwl >|ɽ};+YE_8u5S^0 4]ṱ>lU>lVNϚRt;*8C^w;3qyЪI`OA;Dc*$^{l_RNҧ9Qׂi싙/a55nVImE9;-UCMuC,}Vn[lܒz購w6Ce[+o5XrM^ݹ<_?~GESαj[D<Ϸ 5e|emutM F'@8Sh7O[fH+^:48GF˻_-X\Eq<  OAyX~0޳1\xpyfgy3]J}U GCZc,KW@^Ke G-S+V!U|qU?Lk-cL{*sUsp;ܡQ[vn+M;_e{vFh=:UxWzC K/{^|E Xί&Ɯ|ƶ ͭ@CT4 +Zr뷺vaCregxuX2?uN2C1&yl;ݾ~ûr_a{_[}Rih.= Pu(^iV>SWx%[C~\>j[79`/`uli=c䪁BjWOaު!I&N2£ۜ ח}e N4ܒSs|Ų_Q@=cu5l-UtV^2]?,+Gs'\ sg<厙{ayQz 5М`j}QR= oj~j }Qi|/.p} Hlz| 31ϢT<, of.S{Z]+|r"zY&^Ub]9xD`sZky;`5L=~Ok?y]h틔Z.vgE`|$%Nj4/L~|YLojRZ/>݋_X̱]:swTѻo0I.XƥImOTtkWm]sp]Xɿhqxc9;3huwzhe]ܿxsȻ0f֨1_5L؅h ;aqA?n7o%S{aV=gZΉ]i;,oQLܠ[7 B\(s/3un/C\H<^'ثYu⫏!_~o[]EsxUbz'c,6'l군ھ /f\jxf3[kub`Ό~>x^H6q^}&D/> hpłˤtzdS[{svƲ1a2wXx \eqєlik$wZ՜=;/yz8L{&3ZzjFżO4X~7rk,>v68 Z߼XiY[V}ߥa0/|Yz7|#|g=R#;,\?_-1ݣXn՚޵uhs}ghN'bg/-Fˏh:jr|vΛlŷY`+P<=8w0UG©[]<5Yn1ɱ&OY~z?_byfp߳֝A۪wO\a~q$5ѹ#9V[_~޷Ο5(̞[+VkU#4/^' y$ޖEO>oJ]_krYdHO43۵5l8;S$uW9&}y~OĿCj @Y\+B?_1PL huʼRYYY[A- Rֹ› 5]96Լߟ|^i0k~&bxtF_NcC,`ZV8ӖbCsw%9p͵X8w,g{$ a. 6ZEŎ8oEk?X`ϡhYLm8]C^!{,C9W]+߼lokr Fo=qݭqU]ODc\f~HR7\ulB=3zSe޵XV< +ܦͯ.rYB/Xӗ=[,, fφ4yu52Eߢ }C7mIϋqNkOp$nUnzVs7v^ cepCVoq;0'bv({߽ULhcV{74XNbr0fޫj[nh^fQb6K3.{9t;oq,]'1E3#xc'wĜL} #kJrw$-\+rYg@α)/^e3 V^y#V޷ZE}:[iZ-3,5Z `y=,^{Λ9:qlѿWzVs&!]ϑ#H74ng{rŋD,.طԽ˷/9{iERo+Լ)%N,&S7&ne=һZhm_e`OtONlXNY,K-'r!vTM[/z$W/摃Ϥzl3Y ؋[Z;Svkh]=E0NZ SCWhtݲ&:YuwSః<eĢk}-x̨lzsvw|b9;7۽!QX.d;USΜAʱ9h^6HUra8/s+E3mb I*^8Lcyb(,{U㥞65+Rݿ4X4GLngV,^3 5.^-S~v7 ϽHp-|5t ڱ,e6`+FLS>c&W҇+|ɉjs9-OKlMOoj:KDk9xnpԞvNۢ]~X;߳9y$gN}x"V)LύtU XN?epwK~ ܏o7s 3Uę{so=0wr%ex&]\sy?l[t'.=! Ԙ_kRU/kޗ£P~BSo(i#Oe&jŹá[Qۗ!8ފu.' cjT+ 0;jVFh4H.W,:<}J>D0|ZR28c~9;Y~, e>fl+Π}'?խ~[?]Lx+SZf4N֟>lgm_hpZlCȌ=<#6*=Ź\/'z35iݩs>v~x@Ps_'߳пpV\z\\8k]M{ n/랤ǣ1ͳ?qMcw|W@cau4j~C|=P761~oۻYXjn$EvI\^=>Q(T?%VVf~0 GrA>댾9ۅ-3^H,{eiϢ\C &U"U}ZwѺ̴.5_ϣu<1ml'b1ys_NbsDYt>0b ^ؙrY[|[|#N]ޅ/y#ťkw2܀%uH͉v^DcPqXuܻeĝJq<-V0^Ɩ;ϟ|b/3K0/<'3l9jxxEϘƓ;˭xpAZtLL YڃGcݢEk0Z]뼴)3ۯ9 ;Q()YyO)Gmsi11vNԋa]FZu.߹7Iϼ㥇g zvƼۃ1)6$gP_/g#UnΊ;G,sf&ꆼV/fgl6\,3H$_i7={^ɇ_ure^][J.6w[P[?W/ Uj.Ȇ3|K E3:Es63,K}j1Rހ2^x쬳ŮF{̌e8Oƞ>6~)f+5|\\bI)^/zor֘v>|o'rρ@9' Up&|RŊ},4(e?oYzCչYY~Nw"໒\%2y^7)8˅f|6琞juG_|yù\f? O9;}n]%['}xW ,EQg GXF˝>d!cM61m{hbeyWḽ>N˫{'sU}QVZeϵ-Xn8j-e]%+2~ߵ~hy5|r̼7޹^o,9],obwi_|/ڒ(O h Z'$NiDzTfFߝ#.ʇ'b-͙k\Y[uw}C/35TbɱK^9{(5lt]L~5s}VͳuLo?Cա!jiށр3Jӓ/|P}&D-i8kǢeFOt28{lxy_t YJTH}ee9F(;-?Yfe_;} 3)^wpV߾ќJ(S|slFGA&}dz/xom;ʌKr4W}s'.MeAzv6ԄזS}N&U 'a#Ş<ųbEբ1V_:Om 8S$_=$R_ԑ$> /yN i7uSu_ye\-gj_8n1 sZQ[I,72ggND/<#=Alq _W?ܽT&>W8'(9xLSU _Sv[uKk<>r&gfTzvN­Z^roҠ(}K=bmf[mUv ^,U_= E Z/$yj|ֹ/gsm|PftvẌfQ㆓){F.:<ѪaqseY~q%ej "<#x2T]`hT{Gg~7lO<379O;dzwr+3[ľ_trbg?g`v(ިmSŒ-^8[w _e,9Vw2ZvQgm$8eEYRk|ޙ&טfWR~vU&ۏ™_<%Uj9wƲotE?;3,ϐ>" }f=V?;-&Rtl]P{ݩ3תQQ;s^r}'!LZtμ/`|\3枓9b /mVxM=ecyvg|و2d/u8sͣGA9'EP3vCrNzwV;|fr.l_b7?_h^yIZ-/s^B^4NZ3ݕ:m}lÕ-:&Ι3nC3r~~Eǡ=x^iN_ߙo|ia^c?:ld<]ⅺsZ| ^p]\$(r3cѰ-=^,Nԑ?6?3}-<tO`#Ir~LmgbKM_fh=[xٜ8G67\͗>"\l^ -Q' q&_k|^5!-.}u埗ﳼ//TQ9v6Z`Y djz{6;~3dmXk5[} LɳoBZڂfGf›W-) gf:SrBISԿw\0E~%k=Zիpa !q=o톳T|l-nwN ]Y˝"h٩=i. l~?vWYN*厬j=^۾K>.\ӪHy*Xvq[6| D;=:z-u_;N|w ӿ38Ńzǝ<˖1uIZ_" 1ϑT^)ḭFpk41k 5ީǥ!6,\{RWB7Քk/,&ZN;yWmm}Uwl*ǵ9}?;2`nϷc:-M}Yv+_[ZezMҜR,}vu~MBkUr k5k,R*>x g +%9p72ڻjλ_.M^uc]ygPک%c^x_|oNkϲ~N]LW#M|=\ oyu꙽Z5_(QĖ_w}5M9/.vﶺў5*,= ZO)V~Y1!Y M_pI* o<늱(,}2Y݂af勞uMkJ=QÜw/牟k9\5ٽx;}3V֗sMYU?Q~*)?LQXNb-Ė:r{' /vWz)ϡwZC-=Z{ֹ5zN{ʭq[_z#Xqaj6uch{QE㗜oY+߶<0}o 7xmG*xf=0(9d][{'kzOgvnٜLz/œ܋ŃY!Aro/Q;keîڊt ?PZۑ\r\S8x[W-cL4Ƌ5+=w;zl,]֯恺^5$ˮх\u_V7|kr."Lh<7u?g2cg^|MX8$..;gϵ޿w0;|E_u#pX{`V{{xv/+9EMC.P/fH1nsyV&wl4NYoCX_K}Sg̞鋬|49`\ue 1g',z!ՇTMW5N|o{|.rB!LϋCZ|ZzsDf9'̿x,\^[쵿p>~zW}.]ߖ3|[ۭ̯8SIJΠ59#.tͅS}r铘ipL#5Ă.]f m5VѢrc^(svF<wBnwx^|s9l}]g)^l>3}376̳.KEvT߹^1pCA{;er;Z=J n5%/r,;WSXf23/_=--W]~(V_IVU ;ςr̋ǃŰOsjjR=ߝ~IΒɩz̉YqCʞtp4~=U/~W9wZ ZM9yM [ )&6|rh )ZMfnf_r' ߱~WgG:Ūuc}>SR˾i@{e6[,%;~xYSO/by;3<}I \vTf꼛T"~/(ꋦ묗$4ZSƨţ=ebWg jVLe# WW|>Q9+Vo?9>O:q9xkjZa ek(moD\]΅ÊŎK?u_KdswJb^)خ/F,d={L̾~C-:79%3C1`)=FO}%8m-zv6x;-sA<1.1w,^UƉBc,>C9?V5;;}h=S-}D[ےnx5v~㻶siKSw-&0xe>[F/ /XgKWeKMSmpVۨ]xW|Vދ/6\W{\r&,},wFZw3TvտmάZz~\wo0~=_v~x_>?yW:tco IL]4xjg\}5q2fiz b,b{ 1y_θ{D޹0|gf.y͜u{jk;TkD?f5H7| PM9N+W4̹ˎşjҸ^Ty}7@s+ w#ؕ){MVQդgL ,WŔμ<meN`:{W5< G`:kg*gZeI.io[grJhYnɜ`zXtAghWb_dx(mUT b\1E\_y;pϦ|ɏY~康W9U#z5ҢVų|ݫ7Z]v `WLL/ &9p;/sz|ˮhѡu1X ã/-Ͻ'H(͊'u(wSwɋ?#[1RWFYo=yczug Jg[o{)a 7\ X}EWpo"ђCI–ۦgxu' a^y.ě j?$V#]msJs+^|Uaù&9{u'ŘsJ;Wbʢ|xS>b sM^#\ںsX}Pl/Ήݹ\d>(~0gh[_ -;^X4TH?_gj/< s3|S[}JѪc^8gß,3 ~OQi.=+'rm^_v~ F1ZDf<}s[:x"YZLS ;tOcP(>E{`G3gix/}1%v/qE-aj:çWx{hQ3zaT-SuScqݏB̰2dk3m0;,+bU6#jPUe-Ϲ]c(yڳ/UͳY◵}Yu'g5_vWW0XOm+^?i7('K>SjM۝];\W +8C\Lmb= /Wtg=Q0r{fU7R;`Mg"2ܪŶ0NijW5wo(||2^gQ8IY. zZ͔V;)*Yzjsc,y}S̳dvp0z>J ZϗxyXi?*3yw[_oQ6{k*.YbdCh%ŋ*gj0][0߲:׺n)փԟ|6z2F `1Xj:wn?ŷc6|{/+gѸC8ղ:Q>ѫ$Ms7u|9/uu)Gxhp=$V54sg8:?{"NSky5)Ohqd{@T/Ҋҋ`?/{_rwآP|YMb%W/ĹWڨY:KC9P/S2hj‘k-`{1jlh&-?Y-WRIw7ܳɭ7㩾2G/ev=wU=r'_Ej;`{ޔ.:ej^wS8:o[5qB92]Akj-Z.5'ua$[o~?݋].? 6X.~֋yl|q9n~_WZO˖eO[ؽXf\ŻTxr%4z+Zzv~[69NEgK=Eb*~/z{^XBGb9rw'px#Cygw@M;˕m1gO/R @0lфYt^K'bZF uO‰g^g)@w>6۞{E˩-:ʶw>Zr/FQx2e+e{]uVnb)JG/sZ{ٜ 3ck{lOt G|"~ڮjyEE|wp)7C9[%5is=οس3 Zz6vns -;4p guLl4wqVLdVK/wLαXͽ䐿,OJ^)=skVxq-Bo:9]*=ʳzˑNs>VU,izSy𹵷_|v3^> OVkz׾xWi '{'hSkXM?I/S|kxG+"ø|'[5xhƟvщ&:CWg,NR#Jd-{տxOF/NRgd͜@153Q Fi_޿<-]Ug<њϭ\Oh_;o`UId/%Xf:[ =xO-BGu־pEv/34uǶvrşS*mo۪f=/ &.U9k3^P疍q_K-_o>?sd8Xj^waqz36vwڵ8Uy0ĥt1=V3Y hlZ~;/ʣ`ʢgq׭RholɻDy>=z<)\_ң0| w \.C+ pac|{ik$=H/yޓe9/W}y1G1Y<ǫF QEŜγZhYjy(~1<{WƳ4c;z_lk8xN_hBbM׾<,-pW*kcg(~_6̬X7˭8'Wu uĝx\Si/|e?c5pҔ_Y wc뽕s*Qxccfsö&[,z&אX]u `YKC/#ӋĕR~&==Tcg~)2;kgrL]t)7zn;Rv_Zieor*e֭Ԝ1P82d _nF[O>/6ǛsŪl|{Ӽc6y|݅ %ǝ|ehQԢgb-~?~eo12Y̹Yt̝xo5{x|.9U9GZ3Hۛ59jDUhkxjjau~2d[P-eZZԬW#1ΈTo wN teoԲwm}5 wkuchUf-Okvn8pv8gz_^;ꌰ7;6:DyjuzϜ>Ǻ a^8./;i̳\V;' i8 >SvK[gj߼",w7Hzqr{է*މOrSe/R/rnLu.Cr4Pb(nu*z8ł9C떇Cw/~>L 1rlisV[kGYJz+,<.ܒݯ : kp7ep&/t2;O> u9&zUZC/yGs!*-W1I}3__Õk>g(Oo;U ΡZ?3͜<&-뜲Q;k NV/p.A<達79By/oaw_?o?e*G!S{Շo5.g+|wыsii]|_ ό̓|OP' JjLk+B7ү[=l3sjV匭/I~1;/a[!(Eϖ/W̝;xHQ|+(Պ65lԚylJoEv T+Y{} x9+H\i;^xN\&olKmWNW4^mU7z~q_eNg,<:GXM˰p'bآͼ]^ 0w?Nΐщs_.$_x:3mzKOk-NyAo(V{7U3Wz҄1D]j_E)w5,_WyUyWn& e.!íYosW!/7bf3ԝ3Z>lj3ap uNK1^Eb2;bphnsʮ(9K[zw24_`/~3jkgMSC8w0\9{Od|Ժ+fjƋgsj$϶8?`LV;wXzt]'ㄩoU=ŅߘgDRgfV6 I [v .}fM, C\ѹ.y9hb5WT<o*1ȪCUٶs/{P4|ϙ[ };/a8q]H]v(f6ņHW}=)WRyezEa?^tSe2wp>X p*I+}Lʹ[_\C ZyEKo馵Yװu|{1Ewև}Qbf(SҾ[֑EܾSbpuh̥R^9? WQN,Br'Sf($y/]^É`sZ˩CVιz՝+)%|۾#+֬zHvO) â)fP#S83֚e导a-KūNhâhX޵y3]xiMڙ5>S`o/*m0vm{cXw2܀)ŸTbF)1/ey5h~.bN;Py Wx_x YwUPhh8wF8Yc@S7Oh]}Y([1PzvP.[}2g[= hv#;VOX,{QEiݧf" Fsn݁,D(`Q^wWn6 MΤϤx`Oec0x}^xawml31u壭V7<gP[HoKy b2Psyt땇&v݁:Qn ?[ukW~7,k^Lmi/ԛWR9XxTi,OzΚkʼ={V7|%|Q1͝2uk^xR.]_+h]vؖ>4Jgg=_rF-N"xgTү¹buN:,_Xم0gⱲ{yQx 5jؙouF2Jy!˓^8v=%?,-Ub~u0a> ,z/l~G{-@F/]zlN36CϹsŇw=R|@Z[.`Ps@9qSO] Tzk"g`ӪXq} YNzaȅX^9Z7A^Y(x ];i]4O;\>cScSrȪMbL|K_`pOŬ/tI5=87&>-`.3J1hjv>jTOˇK0{gcz/f)=xodž8%]rL|IٝeNX~;kʋ7'χʺ_ iϥyޥ1r%v V?U]grnil\6 huLΰ<`ghgSy%)gs^vޙ%Wۙqp,Z4)!WBrur$'M/LZgwD9R.3R+u)L/h){YYfHL1IUZ[M_<= fYw&7 ~,yF/Pt3[͇w[?r6-u#\8nnzԙZRN;3VtG(dW?K,Y8YNnp1c'^82(`8Ll)|մ,ضYYM[.˂%Y3fg>yYjn嫿c<)wgkI0loؗR]jw[TOgM/䝿pL[ AlMe+..'zix}RjwM?jִRU|ZCwR'L4΀ĥm9 A wgS!;=6X|sb6[}_1Q|`R:Wl9{_j9SzhfY -}^zWBw ~z:cKa]tC^ GU댪wy ZͿ`yf/+eO _4[/7cgkDʵZlH[嬵u\g^h~:iz g^|>-woDM>YKl ϳ};> \rāö_ը$3os^5Uh?U_Wh*~}s4V}ΊQ Y0ٔߠ qȼ/KIJ_w/tN֝㳭>r_ "gU߱Z$K;yVk>?e`W{/.y3YS0w\ʟ+z݅j}59[X5kimˬel+]_߫zex^M\j [~pnF̾qUXj5S5w{Esk/zwojy`Zc=ib&7wN8O[;}=U'wz9nzL*qW\+yy׹zk'p_Ed?^:ZWTgmna~څ/GyE%~!ig-ƶqN*Wž8{{qjZ_1脛s\b'UZe oZX ~O'bX^Ij\uߦF.{6W}Cin=H^x[༪IRSnL;bxaUUb&,qz,?Of#6qG]U#No{'⛝2~ljxWk#;^<:U-y{="Wͻ.dJQ;B̟aZ쪶]W|Y8|!Yvރ/^_'X|H*`̶>,1ikQZwZLN<m\zB'&zg|2Fզ.3Iƿl٫عxI\egޕ͞8V?++Vp;Uw̙)3ugBL|yͽ,\&x#~C^l7`>#U4RZCTi/ĐGZ |Rb(Z2wvWeVG}ٸbeKOvs-XkN1>pvUlM'>she5Ioc2;ln%zfUv-|qr6=R-՚y ,N7%kZ]N@|;V5Mor_ɑ.}[|rn ˾Lp1F.~Mh:˅o1Uߡl0qjf)Uw8X(M0)h=M_8Uzvݧ{lSR>u.Y2VN9!z lc+9%Ζy&~T]g{ϫwoV⑪Y=:mj/>RfVs}V3^:-^4e{|WS;exR?P壗kCZil(Nw;ly܅'1zϲC`g.bui=Y`Puj^7I/4U~7Qz^Ta˕3Ufnj,.3j>@K(|['Φѽ2gTfw/7r37^ܙ¡Y|ËD0H.6VDl50 &.yhښ`i ƕݢu6Neu}ѪaS$ْ CΆ ށ'z.T<[g|/03C[ՙu/pfM%'WOʽپ, 9yHL5&B9_pgQje`Cggu ݹ˃,ŧOνnΣڡݶgQwga}l UxW nM%480y'`h5_J!w9z٫ڮucmyyyf(EvGx* YxOi82bu (o\5ãg:xg+_fOw; fږLY/uڻ}x?/^/3޽dZ/^Z\vV}mCܹI3Tooh\g AcsE?zrJkr'UאWe$㝹Ce_C!shfVF{l]xȽk9 -_lMK\Ε/)ipuA*ax ꭛k0!//~`ᤜS.mB{?Uc-WNJw911EˣVSX]l 5?MW2w&)g.ƱqfMTVUԅ~oэ*zS,Ȅw<ʾW^|2ã=e]osynKmpS~oF`8%zmŜIi QWnd E#zթ)_疞'fGٳ(\L3[ڗm,/g7?$[e|Xz]w@+n0x` Oc=4 So+zsa{1/o|fv}z'?3 ~'5KEw:yV5礿w3*;:Lmlu^sPT5Lŗ侯{_弘 W9_|'eƫ&gk,zpvR_{mzH6hMWkcAk0y]0ܵK[Vgj,հ;1]8/oxV~o͓)q%eoF{ޱܖwb ‚[i]hi'c~<纏geCg^k6s +e{ v序f 1CS}_9r-ot9/oZ5 `0 lN%mU,}/my'd Oeuf3OkfC}Ss\Alưn|F9 ]f;69 3Tԇ<>Ş&ξR=(ę"|e q".X^:jW58X&}a9iM~3& q`yVt9֙#1_Gy>Xz+7vՔ9a!b<^?WWM>ϴD@Ԗ@,|4xES`S'҃1j-L<1 ]iz/Fu,~#+!T΍m+0+e}L6o]9ʃk-Ic=;2 !N<^4XY3<헝e~b}ۘbe+/Z h4Ij}-&عEgO%9wyascs4Ȣ WmSYQS? u~_h\gľN/8j%|2vlZ~L'Z3[U/ yܝgbtd,0'say|o8?¯໠8:ଊ)ggS^p'ol>P߭^jEO%;?7u5]/Ɠ 1[3'c8gu~OK bb;)Aٹ]둃qgYp9CGneX޴DK-~}K\<+>06Z͋ҋ0ϖ}\ 8y ii}efշuM=x,,P ifMmk/EP,A>BZ{#^xʽO~{M\3[\O2CM(yBk\{ß}ջzm_Q{ޛɡ>vyoLJo.;'ϣԫޙ|Ym6~fM=sY}yq789:z>њ?=Z-s|v-f+gXejq81jI£sy>w+/zfޤu̞qnq/;wò߃Y~Ym»6s.KŕٌWbr>)Xhi~ p,y .؞ SZxX=umܵ_@^Ձp'Aw詔҃6u~A][wg=G'y޳/hUw4, 9ӑ\Sv.=8Uʞ`a2]j/RgFbu̙߷ukHȴVܷmo59B]E0DXY%C>u/1r''5k3O,.ξu6EZǛsP2{Vl_~.>+|GsI>:[~X?{ngz/ F7= imW#`uSf|{+]4iItxW_poAQzy!X](6u+,v75r[FM?h}SH1fV+pwV=GS;6ٙޤXs){N`Lb=vǭjSy낉p-5,\Z{SqjW;7!-UD.o=,u?kf8 Srz DkxεOMto{Oμ{v}✚W~[92gs'ճg蝖Mk:{T8j3c~]_r?G|!/pi\k~}Y޻\(/<;V`+qw o3SgzOz&_GBٽlv//19ey"Ox;Lyr ^tgϝɕVEu"R.މ]u//ֳ ƻg)3Sju|D$ֹ+[y;gzkolsޒNR7C5 䯸Op ܲ_^p)>:6lKi.|)W}Wl|`Bl]7u-y2Whbm}dWEp3?KUؓߵjwFZloxa/|_RYNbaXrI%wsa9Lo9cc=/pv]sŵj_AۆSuŗו^DXQ}{2^ZljE/iʏ-EOUet618/f~Ng-,OeđmuhˌYmI}v4ܵǕ+8TG9Y)34Y==RKp7Gkq@L.潚=pmOXϠX4haemW1=+b2T|E LޫxA/qGY~eNGUӪ jkCOE>u|Օy]T^O){%ѸP wQ4%WJnd"ߩq^߅<%{MhްZ;fqpU/3ϊe^􊫎n-~={]e^GPaQ'` F򋹓Yu&ZS>3vZW=zo[~7zhIc]:-&.}/X1o#^7|TcK5KWausk`%; fU׫jn~r6)?;n&$>`[H_ӻp\9sZڼ[ GZL\2BѴzs6} OdcݑY:B|9[lksYZʼ{ Y{$~sWr(4[U3`{URZI-w0&~Kq ?-lQN_:~[)ezܯ3uYas&5 Q5Mu&d3sLVr&oPjyr4ZԮ&o~څ`5D^W?K71y⮗m}ޘx^uެM]].ުh5_7 .ܓy]&^/. GXv ~] Occ}^ظo~=8G{y`mRF<&8zT2yP Nr4H͋U/S'GV7ɒLvos3XZfpw]N+ z0~ԝx=\=Ճ? ։`smOjY|[婌w߉_tmkߗ'c ΰo.t㝫>ɋ?[KwV](XZX2{YX2v[L[N/}c oPGy<[⢹l>僬=%N x2<~&\|kU|:l)'1g˔:zw ~2^Cካ_zuN%ʧ:]% _ OO'Qf4H/`/JSڇ`fd Wf5Qnhfj=`kυ7ej/Ztpf~#X=yU ֵ^)2l%[?V[.s֧֧&xڶ|me.xQjϜ8gs7J%GG.0gu!nA)Q038L/bBR? =$í8CkJ1^`xG/ǺbkMᐟMk*sN,f銗cd̵~u}<ۯ]P9rnwRZ4u7zK`!I|.r9+i{\цC5~~\~OJ>7Wrs3yz \_=*NwgY'J}$6ʋW8\ʫ]S & o5"1!m{V܍S lpg Vp |FEor׆3wƑWwp1Vgй  y6nʥ؞b YkB“,ΟXD1p)]yB;вiN$Xbez'Pܸ?(w[}qLM{7]>Ag|ĻUݓ8yguDcno muw]ev:UgXkc\v*M,\?VGg %-g){fW(s~-9gū&X_zҶWLϹpz\v)!5?q g{;eo9%Cw[s`s%H85a !81̞%^mYиs ZPkNEZ5uً /g.;_:_W. ,ZKX-W^vX1ķs%kݵotv/Ď)S'hPb"ɻꬱ i0Ry^oIFW2(\#qr;gree+-[rf gkw [N~;ayZ/ȓ=u,RG(7{l{68 DYz4S%qusc/`7!S;w/<'yX7)[ ajآKX9rV";g5.x^O۰Oo`p6M|j/:,:_] ,;0;`x p,f>jۚp_f>)VE:ΏZ4_8ǫknו-uaǪYhmuFVJfj-zG/t ~KsWk{jZ_LA:rUzq[5y[M*:kӴx~:ؚg_`LPief.YZwJo\=[UCT -eZezy%/r^~Y57|!fsk_RCl#>96׹ we5v.b 1Ӗ1}񜔸yjj̄^/hMbfV'_ĭ ϸ`r{9^lԣ5YRә:D(xz'yW{llp,a{ɫlQ1ug l*?hv @/eJ,fvV\t i*MJn:;`2^bR^Vwŕ^OOeyƒ6⿭s펦(|Cl~'c7ķg;]Nyc\wuν:.E+b47 -O֝H{&/W~?_ 4Gzss\nh᪗^<7eQsw}ضwAIbUO{ /lds:&Vl@(WYj9ks)raj>x w`eE-/m@4:郱x~>9:M=J {"3:R'ϱeqyO炟 #}$WC '{1ؽ2m(]W^{! ˯XVMOʥn$s):q8G\ˉŸNIҸM坯\qLwA/5ݧ/\e<ϖY}loT^l^L|7ˡPlKxZ4(yEb Q9?q=%Ógzoex)7<}u.Ic ^>s1rg$%|Y.BH'Ev۾pL%ŪGWZEߙ%XsKgK}1~> 'lE}ѓ9c˼X|\0"US)DQNrF,/hh- | jpwt"|ߛntt^=$roէr>#!k-WxQcLd ͵\,:'Yn3eǪ3QnO&;%.|_ΝX{¿-(EsYUI)wlv㬟3=/TORե=CL>6wƤӴ,sD(< HVhe [_uK=f݋3~C_LMb |ٽWZW}-!uw>wk|gfmA"jލZ-fgBl:MꜪSJ >?c9xAQ6BY'(_]1u-W!5Hű| 6 xfK‚I,eytS;guX (>^}gOƢE& 6: &Ǯp_3gлYw\ ưe,zeӬsG&^,;m3?wxvBk+s'rNMvQ9;={]XMu&&py3_|= rb?zOg|N3UIk}>C3ZM{=<ӫN'r$61ne~%xp啻Zĉ(|ZK|`ktwV+Xn[~w+ȳ'ŝR2`*{k_x?u6޿gŷ;⥯SeM]S,>Фajex󜶽+лeE\tЋN wƥ1;3M׺ dg<א/UTLktyG9wjM"xDL{/^7Pb'}V)Ӊn{ azVj޵yn0p'̅KOol3ۯ0%yQTZ8Gѫt!&,y'U>RY·b%/;/zV/3.yg VtB.œO=K P{ E 6?|SaCy'lj SLn; &Sb|'^U {Q2 ~5QyU;-G}}[mr#-Su٨c'y};q(Rp/r.3h^_49Wn(o/+/keX-zИԆ'ڔrփz`e.}Kы+-uR ?ՑQ`wML:K?6X= [yCBp̂ /hu`/>B/k<2p\Lѣ}ie gjӋU pĐ gr3Vp{/e/]gUSY8V#ԣU CZo~DG۬:obϠwևE#pB~U?y7H~=wozWƄUßbakӔZ Nܗі۱߲P}W} 8fhknؠYh/p6}ʷ~&xS^ [lkJ%i찚]$g<Ǣ%Gk;.#GsK#gǯsjE^?fj;s-E t;y7Wbw0>} 1֙R.i/F޲!j = 9H5ލ'ZO;jp;/+V/8+г4&-Z\'cK>L;'IuK[5t-ke)URwc_jqQMmNuzXi1{+sTzJ? ;r$v~bhL~I7LD袋avHγ;/(EWZO/@s^Nsdu2}?Vߓఢǘezٻ({{,-shAKBRL wAs+f)ӻL;o͒oYP_u>1D,:ϖ8b_.~,FC}wy֪ړK+sƻ4(J4 >1~3*55wt[.T[l?9'^H)'\u'kbC5iT|ŊE״f4WZKr#U=U՟8'Xi]fN_onk/96iXpֺؽ3n^œ'zna_m/h=G{D$wc8W)_B]50՞9y)Zso/FW((\^z<7}OG(}0bb[UUڧ(R69rzz '+koXKmƫG!1=hp;M9ԀsU}Pl+mpbv^y5Ҟ;5XeJ[uuE'A^yӢv2aV wOwd4ߔcjoxq)qgo*og_{zD>(؍lUO =e693XOp@ճgհqߵE?uΦ0uNm23>Pi˖yNFw*%qtS]͊B̅/oXp;4N.^bE3ZVD.8k=+_gq93ݖ+pjF Bjm85_ӫ/hDW;3bq.e}7'Lާ\ů%b kٴ5z&w[]ej7YY_;{ϸG1]˲C#-,_]=nKYeɸW>&~޷qrk^\U56Zgl^ţݳ|+9 ϴ1玾[kMZgVh^.uʵҼbˌe9q\Bѧ67g |,ZV7䠃׮*d8 n'׼[SZEs?V?L[<߶QgV_:/|Gw[A1sjSv6}/XA3U۷o_Q)hѢVt; A PjR,9rUvj_U?h (y,igfGs=S/fYg9m)>; }LA뙑'8őȕVf4j>(5GjXn][cZ'ڕJ_N-uP8:5S]vTK5-XTOᪿCL[^Z! Wb0ckӢtT]A+$QNp ajJ/XKS5d2"/?q-ɴNwUb{MgpwpΖk+zwJ^:-[\ލyl`&\=(u;0gz \9j!E9rMNj^K\Z]BKUr/7=JπkW;zmvUWQ'b{]3dnc5hSզ%?u7g{l2)޲58YlU뙱X![P vw0[ZSA_3{B^Q{XCy-q\ϩ;5YmO䦅\=SfZţwH0E>Sk|i)ݦpʫ_Z/@k _5fAb\5g9\mߞF啌O_3UA䮕.N UW{>sGX:mb~w9Yjicj!>ͽg9uj=ަ 'ɳZKY3<0DYa{xJ!?> Rs7C=;\Vܸ`KLRPb3b_{'ZX]66>*xvZdXL B̷|\v /0 1vGr9?uvњ/95#hglr+|᝗r": <7˲R;{={n+NdTҼuG`--q3=Ԓ_=}R'] W[oLͽ][OcwRjb9m /`cj4<+-qb?}c<+~w־v}-wi{1oxG\gj~ŝIԯwX o>puNꊿxU\u|Wu i?2_oszu/ul7~},/ZL IgLV 7Wr/2q>3t@y`{1_Pxc~O]0+egջ28E/h7,@j~rMB٣*Xu)}m/ ^i-<w*{U#⋗gJóxduNԨ][bꥂ*odқd1MJYIrObezm^hٽsu͗3v+=^,mjGF-[?ժS}"6R< T|ƒ˜[}m.'xWVRvV Ef/O=G,swWcc=/ϦԿ:gwygu7{,br˝&wfϲ< `ke NY2^ŘxsV(ˡͫ%GQ:K}{B.zxdyBYâeGcU^h^2g0k*ow53"ú'g n6&,K_`1S9Zt/ N*EuŞr6Ew 'gɳV8#7]x[W?LmjbS>-ޱ_'w;R %[/{i'?K^XzOjEVmm ol/%XIb=?^ŕneEh5-/n9;1w wj?p+o}g*\Z,~k{n{NK rUh'w©F1;ouVlpdEdѳ8Zz[ȭ^'ⷍ/EA6uu1jg9ڏhϰmq 4G-<ԯ\c8 t.g[|n߷߽v<]I)<2ew~3&Mj S`~'iM}N΀]=[o}+m<{/pGf`<m{Gk@ɥ&4QupHaP(kuHLX _<eFB|5Z-:f5hyo]w:SLZs&,cOۥGkt-̭DT9Pgˢa qÙ(5'5>lqYVOQ? X|Sl0ٔtsY-B.=e&r,!w5/ulewyJh8MW W Aj-du~{{@A e Q1yQ=9HQS-΢R~N*轫o ^܋Ѱ0su!.U` ?yh9X~I['̎>ae;WngMr8pK` ߧp\c9~agtL<; [%Fob1̲,]Y\h0]q§-0O\~/= 5Ņ$qߪT:lo٤9v~W羽~0۳{C̩V/s\}ueʹCYU2gb5OѢ+=v{,娫Ģ'g8m`z}w~Qqp6T7@KGci5FyqwDo:Ky~V ]w$&/?ͳ^xbEУ}sQZpfjOH\ r)^1{pv!f/bv^{ brဿ8R;Mx ZWر|jwVΊ{2eU8.5Uea9̥ƴ2U5L˅[5(|k1+~G} ,j6&#y2yzS]5Z<8e`;yg(7&lӝX5/W7酻ijl[G|>N{,GXK Gdzgز]oW ZcGO}h}msM2Sjk3acECZ~;h.[v<8Kk)nkv3aWS낃=u&9gt:MZvqV/>+^-˩=*M}RpT%g~"՜gp N3g})GZCgwK W_a#7jLQMw}30X^BFYzS=5CT={g9xm\,yĜS[q'uOmVc߯4yΖse(%OR|?hcw k=)U1w4?JljBRg.EDL6hP=z<3u/}֜Ybw{9y򥵎qv+Z=*>k! g .(>m,?QL~\?J4U?w33SgדּʉM1*/)|8_5?ϝ/XI{'Av˭.@˼3U\_}rml n8/;pr&ޑl$nͪVx9o)v.A^VǨj[=wRnཬ8|:pen|۶wY>\x7[Y+/8)wWN9OzQnp.^JyJŜ;.ٱXՌѺb ˮ5T<hre36w^vrH@oge= W5IJWy-ŔCb?3P~s/@%oh:se_u" 6'{E]9{cKG[vw!,o (:%<'%U`>Dܷ=݊+J{O[bZ7|es,93&;T3c/jz3{,8iհ(ݾ ҳ߃XL4ͳu~Ws^*n%c/ևq¦&ľ/~r.62u,mK1KOxRzQTyY=`uo.Y)17ǯjlz,L Nܘ\|x*G2=ʲX4 L᥇}Ϭ9Er}eB%'V=~=c0YkuGO[|]XE{p)g&Vuo_~ ųvOfэ[ϡ FtNjmU jt%#|?q/H3Cx̧.z<_GWϻYsŝys;]0f¦"kΨA'bXyU'Eo2|me,~̮Xzo.[7ᥫN\!p/[vo/}R/W5g֘BKw_[U1-EPD{e^gk *=igW/W̉t"&ڟaW3F ogV.녾Ԣw k.>Φz$kpu?xF y{C\/uu&Z8>sCvڪOX8c y_1bwJ~.ꫛSIo)+djs`u V TbѰwp%[^i};XtBW=wr$KmbץlfOhU]'fu7~RsYFkv8I=R|lW&˱:lz:^-͜eQ߇VgI2k5b-z+OXn'"s;M oK+_o'ϋDyփO3T"E{ټT/ν_+F_>w׹ڪi7N_ UN:ESSjF8x&(/q"='`F0X_5}N;3`_%/b}4ᖬV?>zc,viCՖ18ECip%Rކ溗s 0z꣗לa]_4n&7)la|Xz 9^%NB/=#/)+H9n{*e .ew /:G=1Z-$w.ߙ-Dp q;yq_i^MUr\Mim_pjeiU}-_4{^4E _ n=z|wW[Xl18=Kpz_;lmE `5s&NghW :g5?,ׄYT)^Y?\Z[T9{dw䫢cb ,{h!ZeW2ˎqcvkݷYg+;O~.b3= c_x)yƉd ByࢍI9SbLYNHx!gU'7 x[mCӫZg"ϛԋwAkO~H|q 9q?+{79WV jye.U]O+{=jScSRuUqcU\ 3rNīi;mNE_}nHgNp_bpǘk ĜCrzwW4§X.=~iՙ_r\j^3w<׵Gj9^-Ks,;۴|4MW<&(AjBߵ^ʋXb碽fg]hW5rU]GkgM⡋qD>0{>j>c7՛"ϲ07(޶ZL;R%bVͲ;;[g"؞@#g?W<wxbdMl]cxQ$M/ z +cEbj0yrͦ>ܒ}0 /?_.3D|R|nQu]0XbC iD gy kk~zozgl0%y WSqW)9y5|/|e ^̢.3Vv>~p&<ˮyZv!9z|CkV[^q߽^UZry~ų/f1ߤ_j}o9+C1 }O>W[Ϫzl>B[kfoZ {I~oeMmy\Z&>PNrp56z1SNqYyR#:Wջ!ڣ̹a5-wܲ ZdG<.־\|5WMls3;g =ۺBsY3s/v~5/`4ѴVY0l]}O=UbWs է#&{-o,@ 7:$Wմ{f8#mӢ+XspdRWXھgegh^o_V+ tfQ3ޣ8O1gXoB;#T{!uߟ3.UxF]NT_Ő|{2V[5鯟EF{>:_]j\Eb/69c?V3ڞm[M+[LyiEhՙ6{NvqڿqU إ,S<kqUbM<7MN u18O=a nQbjse~+ǰz8ۣbkXjk/ٖ܅97{o_8RLϣp jo@i=sNRi)DE^xDcXg3E b#LmQ42'G I;,4י^@3w|ǰm}lg6碸GP.Ů89]_|֯t{֙GaՍ49d ^%ޒّ[NgCm^9lIa[O~R˛O~NϾמer~96ںx} /i%w<¹`4OM>s\2[<9K SLѽzI2} yRbs|Xe)^Z4_vSz>j-xbn{w7&yvNũ$rVi|gx1l IEOϒGm_}m[˙x#W4 |O8nRT.tݡ'3,sL\}iԌ3Vpbkq9wml=[b.ƪ;c{z]SP}U5'Lދ_w/hE'c[5-Ƨծ4ĔCrb⍍y'Zչix.wlTϿx*Jk"K]r,' ulOۯqoxeƥ-[gy_K˜[_v?MσODp^ܾ1NaXvh}só}^;g2||$I K_ٻ\b։a .zVbi_|f>k 3m8x=/EΉ"WtgOTU3Zb0{j l.]{Um}zU)wo SEOTN@'P=-3煳x^{:q__fe+r|[<g5gܜ[ni. 3{+׾]='6Y|_rG ~,bͧEۻ߯u衿I>?yV Ŭώ59QF߶M{#{ Kc_V|m_d9cwn,sZ4\s{U^p覾<](Mz˜H.E{4qךxhlsJ{܆W&ՙ+-Yzd-9pUߋ[<(obb^!s 7R5?`iS] 8)Xii/^̯ /;e֬xW ;;s>[K39l\W]a.]ٻ =ˎ]fQ9`Zl[ OI RxDjY T[CyIm1݅xX4FZ ~[7գμ#Z-3w߸5X}|_ޗ|kF8)2~0[R46ާծC>m}#@ L! m:sVU7~3p>NX-%J7/-W50= oIL( ŷ`DZggnpmgĕǐs㔷EéԣXtJgG61$U:gh) `wVVY}ֵ3pU?snۉ[2VgTVkZbkyJ5(1XςVZg6~j)\^j5fl;^&(rhܑ:wMr%ma1ݫ׹3_6QN8Z|a_nI~~U3EO֢'cnь%|xNehdC1CkS5-k`/.HKDg|S&?;f8Z-WtRl1ΐn kMFyQ~469l_zr,[4NT}#8,S7Y+PrRʻwp WEן=3˼~\5u&lmFϦ=_k3? F:j hWY&5wP{<[8s g+x >TNE)uJ̒U}Z˚^Ǻ RfփVتMV yw~o3lLc%Y|xXjzO_|o7i{_<~ĉigwmM_X7غazO<ϢH9Jo&ֽ;/\vInnzѝ炊?/Ѻj~2v[nռ%Ep5ōvwg>xKAlN1 H-,z}2v.\-f^ډh_k93ܴ73sg`+[M%wƭUv{?9x_^z?-Gy?_OyB{.ZVOeifrXXjKrs6,OHbg}Ml O͹0ݓT5Oܓsly$9;w)ct k3?ɘGעajz}]U]炝\gRmӘ=vxWN(V/2NЪig/5v>OUC{be [vF ݃%X4 k} zY|vVlipqxmIfޞCQf-.}$?};l 刊^P5غ /I˞e{f'лP;ӏ5VV~ ˼=w&s8/}x<&ê0y-7 X%wfp{lf02mum X2i"J}+ܚ1]e=3.3d{M3k~v~B? E#a9}Xt'>;}Q=(wM\DOKٽFQ̕^KeB(U5R0{\j֓gvTyS~]{apީUcZt)ܹuUr6Q^kSOY4˜lM_wJoBXd9[&64-ކEKs[+gb1/:RV\|iIA ~%;[UIXupss{MĂjc[O/ĎSg >_&FًP;M9en_qXhSg4nxKߵSK[2-xYhzduQ9,zGE۪3&_=a%&t:L 1>;o!nnF7\<)'ϿWX A ov-y,js݃p,|Rf wfLX~dхbz @xSO=nSQi~?OYc~^}pF1@w,ޅ禹b}F4pg^vߡ6URW-{^i?D>X(.1\z4Xxjj;CşφXU>‘'K~e|,#pU|f,&\iiHN5:CjꉹڄIȋڡ#қ-rer Ӻ+BrN>KsjA݉8mI)>YU!V[p6zk=W@$^kih8En'ͳ`(>E;4/t_ԉa .̒*Opiog NꅐڛMJ,/7ϭx~w45l)>B A0 =˼Ɓ>K9z xAXeP NКp#R)~+_b'ڎk?߿m !] eRm/data/lpcmdat.rda0000755000175100001440000000043714375241641014056 0ustar hornikusersT @ j-(ś=U@~۱m6ifoHA %:g2"ż9)JE}9V蠠 fz%m&ox<Ǻof2쩓/f<BLwO&fVG<3~v,' ̓ Ax ?dj_X3sଣbWrwAذH52IO_T+7ꪺ'$IrVwٛ eRm/data/rsmdat.rda0000755000175100001440000000043514375241641013722 0ustar hornikusersTˊ@lX74xd(x >NF!/1;)S0鞞NUu|'"55h(rݛԫH]qm“tn;.h&ox1L[S <*2ߝUKv- >>};͛;gMLXe2Y@??'\V ]g$J {xjzzRR&=ު'*{wjyQ{Xu_쫵(Uv_E婢ϏoG_b qV>կ{ɇ^q`-ڻϬƝSQֿ܊.+lwkcEۭ,yg:ڟXv~%b[֯~5neWԏ۟g:{퟊'/VEExVVu\dk~%/geO_e%bmW,;"6߳#XìM{Xr[|Xz<+jm7;jy7n+jY%**_Ŗ;k\XyVV~8B,Ul{(~ػ_l]'ú=Ďë+?ڋ>~}GVyXV᳞'u>^|ɪ?l'?n=zQ { {sĒ7V|zY_{݊{k.[ּXb+۪_Xޟakj+?^?Z+Ϫ}}nRF,+rg)i2ev"mQ U~7 ?wb4 5 3R4_Zp@oH0B*P3TџjSCjO MI))4%ДBSRhJ MI))P -B B)P -B B)P -B (0 -B (0 -B (4TBSQh* ME(4BSShj MM)45BPh MCi(4 4BPh MKi)4-дBRhZ MKi)p -B )p -B )p -ɑt] 3Q茺Dg%:.uΨKtF]3ҦDGu%:KtT.Q]DGu%:KtT.Q]DGu%PܑwY$V\:?w aUKg0uErb/vQƋUN9ՊMnk_3\Ma69!+/}?_8Tb~IKtZ:~ͦIǶo;n?7o61gImo1?7g?7M>of={e _oiO9srgD[ҞўJiϘu/I.׎wE\605q/G xdWrWgBoN\o+;ڀ˟.{LJ#2}PbyQe^T5EyčlQ(+-ʡ0ʢ(k,Z~J )-SZ৴Oi?~J [o]*=|P2H1qwNUNdpln=yV+%o'/k-\Wzrg.N+(\)½τ&W6$UQ5صpN'YK $={2/?L8 Sk|wM]/wSBS䚎݇;j?F,n6i0U^QQQQQQQQQQQx5;bXܱwbßr%wgl Z&r%ø_}}g ͟~r9K\3oN흇'{f w Bg J͗j7=}fF>\IKz+ |, Lۅ~)#qgV8 ]1WjR 縃OL&K7]Sg7_>%FOl ][pi;w0ksa\k~ǕLM|MwJ;>>[^cwo'}HgdKJu::+]Y0ѳM;DgeQ\O cqkѳJ򹢲߽]gc }wȧ8.C} npź2#xqq.̸添r-g}R5dj`|xvXĬ"&~OI>|z'ŏ!{[bW 䋫R2* r҂ʕʊ+Wb >H +ߥ҂|iA~\C 3g[iI:Fb@q6EW&<u8ZЂ_8}tM s*@א~AW^Ax#7\t" ]۩k~գxtuӻ]G5Gr *8vNs /3WO{2OW A _҂:-Qd_OgA[7Oa|siaO5W5*G;GG{7]5LW]C 9&Bxh;^n1<ϻ*0isN_T/Ku͞P}N}I]^`o[5=7+~;tW pt}jF{2 {xI&Ʊ{EWwZT%N?[-PBݦUr.z؅vʜFGЧzҒ ]A |y <_Мwm 櫠w+JA]W<\;++Խ3ˠ3 nִiw דCr,o; V3ܯ1m?'om9`=a]F؇Ÿ0~>=2'ؕ^;]!z1.fWLnx['k!vT9qI!O7Vy^c݀o_>7DqMߏ8 矃w`}1e~}Q'znWsnQX~H~ݧ:mo iYj/2֨?A-O/(;c}9v[9ҷu?|/uS\}mR;r 'ר?A|xkYt#) Udn˽9Bi~r{7g ޏs^u#LŸe}yz$,wƒ0[@“ڭ:t&rD}'a?A }Ö̽y?d sy?,kkͥv?5Z闒]r^/w5.fU,E,8Itj#hX4 K:. [pH ׽0u?x~t)N!:,}Dw C^ҭ&)63利"0 ?1w`=_@I ˸;?u_p͋c9o}~x_恢d_anlK=>R[ fp;9V~~/ğ܅8|wK}B_I_}"ۨߠ>?OBܮ|ۜ->`"ƖDwJfNΈ1/%_|1Q|vY% e_ `1ٹス֍kQ~s 3my@?c}ПDWO2~@_Xg=租'EVqovhe,F~'1iY/p;36`9}ȷJy|dgxه+>On?ϘY?Ȋ~-A=? O/ .y_#!-ȟ_>]n:=#?y?ݷzk+"'Qzr"1 %xU_#!~=Ϡ>w`@~v?}Bjݴ9<*k?O:6,1}?DJڠ ˧*=<}4ss0~@~woG?O1wb>gO2~>ՎzZx<[$}H2B-_GXR"dw"|hO<@| >2P3_  GC333WQo#x6 ف!6KKF\ލzߖ_K5}r}-nؿDv/o!?Hg_2_NA- >2?OF}v}0Ə߆ﳮPޯS!~5\͞܊sq[x, @_xw(C+g% 'P8ӈox_;^1)/$A% (X#?m?f_g?AB\[4''7:'??Am9}!nț#Z9=FH4oyjț@<5k婉}_M u5C'1G =ȿ [c? Ř# GSM<'+'?57h5lYL dzV ӳ,Gg92=+YLrdzv'Ig92=+YLrdzV ӳ,Gg92=ˑYLrdzV ӳ,YX)PsDRfq)*͋0ʼ6/j̋Z"|4-!eE9ԢfQVYeEYkQOi?~J )-SZ৴Oi?co$/٭ȴlyP[ lbEt 6nnV7 QĿ-؈wU[`oU[`--- G[3MPI+nt "WQݎFt;*bˊFtWUz[Q Jwu议>Nt7]-3L?Cq:/]ӂҴjZ3-L jӂƴ5-2fҬjV 3+JjƬ5+4Ei .J3\f(pQ4 R|{X2wbM -:g$dd}l@ 6xĤT@&ulrjʋ$3.>~d&: cǼ4&!Ʉ Z5#)9?TiݚZi0LOM-'Ƥ; ~HB? h`ٰJU곀"'dB{%6}꽈uԣzapX}&7:fH,:~Z/~(kۭ,x1k:Z?/q[.u\톭vV++S]=9wʒKV?jwjޱŒ'+{oΪlE[`zd[S+nn.b٬Hk:q!k?qb_Ŋs[wV~X|m+ެ<[kĎ:ty kXmsbjV{nkTG#V1VWV~ejyV8ޱ?//1g*{+;*nvu ?YZ]5*fŎsXqo=?hhk\m/J,쀭VYy>nk~#zs.5J` *z*ڮǽ(4BSShj MM)45BPh MCi(4 4BPhZ MKi)4-дBRhZ MKShZ8NShZ8NShM7$8X&dSiUu^XMfJqYmɫ+mYuJ_i`_|rCYkimkA|6_Ʒ+|/v_|}iUI i[6_''mbӎ+i=(mi<1-iʱy~imy3iq6_HcY{i=*:_ mbc/{WiX]iJ|m2t9b<,Ι0-o'?&ʷpɼAʎ˄ w꿮+w"sg3w37=R_)~;9YmozoS8squJ\YGJe}Ɲg57!߭p}Ǯx'YK ĝ={V2/?; Sk|wM"\/wS\S䚎݇;jgyI h Ns;mmw\ @t::Ū= Y1&|fxЧ[_䊎:;pF־>m^Jҕ=۴J?EqE?/LmUF*ʎJn6Wt៭gJtBC!ۧR4=7,l>ŭ;2㚚I[ אnN RCoX0 )6xAHy'^-,o+}'Wzힽ?4;>MړǼ_K 'j^G}>˝B߆?v,x\f`os0֗w\ϟҗ~W+vT+>ܰ'Xq+z/*7Om=樾X3-}w^Q~MW> s/ez42A!/iZ;VߍW;wI}`+zMt}!)o@Ιӻ JJѵNNb|a}?V$zSVGϗ@iz0757:uwޗWL=^s>W Q {W W}hw,4MẺ~_e =π?EzS}|:aC5:7Z/Ͻz ':/'/`E:_[q0w]P:ҷCe/aM |1(^X=0]N5#8A'ΖSxx"Kpa2=s\o`WM.W2b>]_ʑR8R6,哌/xüE[w~|]|IRfۇ46gk{A>_u ?lO"77-WsIL;L>:@| i3$`?1ӕeM]$? y_{޺& ޗ.'k?ݑ#[:G,oN æFɑi"v'IE]od|^=`<6MܠGz`DyŏvEN V=vu.^Yzd).|~>OxCmgAܪ/#顧2=Uy[ 'ܧFzs^1tq nn쾃Wx Qlg}}<>#9׋sql^i^yH]p][~[Y 7R|r \HDfRft~ py'?O?/x_qMs.Ȯ|G󵘕f =92+gÕչخ/`8k /`} Ə{9I 5C㱶T2,Kb|żߺCTi/Q}(R^_2wu粎q_r|8%Kk Əx@B4n0=ynhjh]'5vt1s>:y wsJzE'CzvM S cWI<?]&+C=@A?_ =]@mx`j9Eg;t2;|mAgƏ z(~+ZPFk3r/L6 '?O?B__߁_ ߱_L ~dS%587 wx{Kpp'/^ޫv|Z;C?K ~OϠw`@~#Gw-`o'n;K{qvۄ {]_+Zs,O}v ~;`|7/ķA| w`@~#o籤+3.l GkȆ>\In;+>Q+w]IgyG[ڭG Gi|߾G}e$.0e$#w_\F3_2b@~̿8wt6_f:/]f˒0e'3R~c%1_ ?;ķGF%5П_@?a}ZGK?}Lgj  s  x-ԃ `> G XO}0{0bÇ?ESe!<#LNIYy4?q+  P? ~OŸx}ME~͚g~i嵵!^iX^oWz31g_ 'ķA| w`@~#TgeG//z3zý?z)o];@~g_9zC| G? 'g࿀}r}O?B_pjn񊰂_8\Bb|ȫ@?ԃB_ /`} ƏpN㳷(ڇb|OxP/$7f}P?'lj w@~b.< OH| G? 'g࿀}gw  'q Ë#_֔ysEH ӳ@g2=ˑYLrdzV ӳ@gwYL dz#ӳ,Gg92=ˑYL dzV ӳ, dz{,9")3Ǹ\PbyQe^T5Eyf>ҢjQ(,jƢ([৴Oi?~J )-SZ৴Oi7w"`[@̅lypYʼn'0^_t V.έV7 QĿ-؈wU[`oU[`--- G[3MPI+nt "WQݎFt;*bˊFtWUz[Q Jwu议>Nt7]-3L?q:/]ӂҴjZ3-L jӂƴ5-2fҬjV 3+JjƬ5+4Ei .J3\f(pQ4 R|Ly\kCѽzXZl˴I&ulrjʋ-1wJf0vIIcL]3 QI)cL֭ꎠr:\~bLs Fy?8uhzTJTkM))gcWH>%n#ǎg*Y&4/>3+K LN7 ddJ-zra9(eRm/data/raschdat4.rda0000755000175100001440000000251114375241641014302 0ustar hornikusers\jUA<>$~Fŝ܊BFppDmʪ93]ӯ9!e9.;O<~oYΟ]g}9|U:/Wo.`ψ1y 'v/׭8n}QGoqVedTD97ٍT^Xm+o9Uj?W1]zև+_#sώ/S吝.?/]~WdF;qc雕G.yƏ%#eOu+˧_S?W$/DuU_Y\zUyn?y5]#_Y;.DtCgdǵPЬWyΏyׯjDKwĬ>yUT:Y}+lQ]Lo5H_֎WVg.gƣo~sZxgS!94FF}s:ꍭ82sZ|ڭ[q#NU(}g|<к;?q5yjET?֗f姛whٍ,_|O|Q^Y@U}cc$•`~E9 Du =fWG5>Sw吼=KߧGn/fEOw>cG՞/]63%$ǬgF]qSȫˮڧ>վCq@FY9f_}"=++HGzxR~T']1&F|v~bvU>H>/|޷ݮ~GTGd g̎cW}-=#Tǽ]׾\>./]W[H.{#'`pUd,qE}.B.I3t7U>q摛 }]sytjzQ_Dy~qg4v!dR=GW~?1yWQ=W֟.Tvnu}uV_4Pq]~@zٕ5ټCpE }L?Y>֟K'ⅠcPBW;~zPo7|T}-gUxއjDc5]Hν1g.u6Pukg~;o7o^/W?k죛۷[۷۝ݨP<&o>ln|ӿxcp|ߏ/G~t^eRm/data/raschdat1_RM_fitted.RData0000755000175100001440000001514614375241641016471 0ustar hornikusers] \T]w72l>2ST\ -wr+-k&24r/SKML;s/3~o>w߼w={}3gF^:MVC7C z<(>=]^8HsFU@w[t}?oz:*+%Wa7Gƿ=_^}8_ ;βNwEy;/9S~r8nզK>h|,,ݢw޸^j5gJ^oڸkUi;.,VJqypvޣ~v6>U+O_ꁣR΋7Աxr^U^vUXj7yMg8rUŭ>ƍ|6+7ծ9;)nuR7v4n:+v4(/Wj۝y.oVW=G_ՎǮ\u=9x ϩT}t|q𾫍:,[y*]q^).u+g^vᬸ=8G-{g5u}[qZʥԎ֝ZgU;_u^ፗ yR}o.jUT_}Z}ܤZZ}6AV麄ϕΣ*őjUo'jՍԖUGE*OW4nJڿv*񃗝~]-}RrQ8ysUPy%j.h>z~^wT+nj^Z3/4q;w\mYR9zW{z>+JQ*' JwrS\GQWɓԮ5n~XxםyO?W?wx۝OJt_%ai؛\WzmnC鑑ѣpzA"Q=2ѣh\f0a; g0FC;d܌q32nFȸ7#fd܌q c0-q c0-q cp-q gp-q gp-q`"-q`"-q`"H-qd"H-qd"H-qbܢ(-qbܢ(-qbܢ7fbLq31n&ĸ7fbܢh-qfܢh-qfܢh恬%`fKԗ/1S_bL}3%f*3%fK̗/13_bf|3%fK̗/13_bf|3%fK̗@i{tRZ9GDiMUSZPVZiMZ-jفG:ny֎=:\C=:vG:5|G| ?k{t'ꁶGGѡ,j{t8'h{t8Q2FIi{t([=:wIۣOhQ=:cw|mⅳ=:Mi{thz 8YxCۣñ8YX:Km>yGYri{t|V\JHiIۣ||QۣCxv=:wmq^)^%Gk muqGsL|LۣCG:yGG7JqJmu_meh>0gPeGG:Pw|R<;?(xKۣop-pn|䅛=:km>yGv7p{ˍ9ym#m#m#m#m#܈:[.|fgVʭ^ 8UTv:9;SqF'|%^9Ɖ Cj|+;Nǫw_$V}g~ć!;𫤻udmS96x挝 6{_N]&yN#'<ؗ|; zk_V:[}R!FQ!p^{݇b:-Od9X/ /\?* NU ѪGb'!6_ngx 1ٯjax(dRCGlK%;ZH\+9tQRrotK_ج׫j'|2tW)?*6EiC|~p`r+>ҧ{׷7+>cs`m:{|*?@z=7ێۍYjUReIM2J™%md아In_J/+/|&7yd ˾I8'Vᶗg(5[~m$Zo(5ʨj׭ec$[Yz|}ދA7pZ&V@ܱ36|4d\v yƙN O3 :?0!:g2g:?8~ew|tڣd;de&S˖7o˘aޒǖ9!4-edhm2pd|_/Zii<]Wss(=qGp~[++Lϗ 1W֟Yky_~%hnA׷dAt*mlݷL腎>O?gGWԖ}C|ǭʣF[=߅~f!JW%SV||]eQTI~$9$M?T>??g[tIÅIaήd ֟[PмϾ# v2 yT#>A[,8 vϡ煓lu͞N??^,'4D/-]ƢAki'}s5M5_ft.NkϦna>5c+bz_.@?a߸ ~kXcx^k6l/`p|_`;m^hCU&2i}ojs=45rMVu>>'6@W?s6rr8(},S0}u?~}u >trޒ 7_8X+6Ɠm%C]Ӎ_V PmW06ɻV,_/a?"vZ_QՐoQJΝOa9|&U1`:#O_@?Z CWZ?QwOVcX?'>+ٯڈql>xsCV$x#f^ISgM_ zi׳S_1~qyhß}O/~+XA}D //re_2\j"9, 6__?У |]}C5Dž걜Mrb;CI]#?ФŁMqu>_:pB|~XGݸkX.A~D7R|w > Gk|;3$m:O46Mqy1MɾoK⍓!pNߞZI7wuͨ?h~K5;?P| x/!A| 䓶w\ Ϫ.nv\-[ë{y%煓zJ)17_Ϯ謏 V-?wI)' w!> xw"{yp|#{p'VqfTf.zW>q?v B|  > G?&0AN=?d~FtBF=qppuc 8_@}wo!׀?߀_ C '/.n\·ڈl)|}WlAtƞc:MeX}ϬZ5 ԗhm~-[3_3~? Kvzwb} >WqUo}dDxXzKԗh$-$?k@|'/@?a|VVA{!:Bl$巗՚|;'=*Ɵa ꃤ~y_h}woIk@|O/`d@>)kzF=vls_?ǵm3Vc]0_.{?i}ϠC~K?ȏ |  >P -Q Dt3XOG1m/VF8MKo.?i}g' ?ȏ | $Q>?Ik17N'zuX0!k<ꃤ~FKP! }A~kNĿP# +6]k[>_yPAH} GR8䷐A~k>;?jD?ʗOnx/?q ?<ԯK럀+~FK@}4%G?v@}wpO_~|qhK6]qGhGe{w 1, there are effects for each treatment or covariate group as well as trend effects for every item. Therefore overall there are items x (groups-1) x (time points-1) covariate effect parameters and items x (time points-1) trend parameters specified. For polytomous items there also are parameters for each category with the first and second category being equated for each item. They need not be equidistant. The number of parameters therefore increase quite rapidly for any additional time point, item or covariate group. } \references{ Hatzinger, R. and Rusch, T. (2009) IRT models with relaxed assumptions in eRm: A manual-like instruction. \emph{Psychology Science Quarterly}, \bold{51}, pp. 87--120. } \author{Thomas Rusch} \section{Warning }{A warning is printed that the first two categories for polytomous items are equated.} \seealso{ This function is used for automatic generation of the design matrix in \code{\link{LLRA}}. } \examples{ ##An LLRA with 2 treatment groups and 1 baseline group, 5 items and 4 ##time points. Item 1 is dichotomous, all others have 3, 4, 5, 6 ##categories respectively. llraDat2a <- matrix(unlist(llraDat2[1:20]),ncol=4) groupvec <-rep(1:3*5,each=20) W <- build_W(llraDat2a,nitems=5,mpoints=4,grp_n=c(10,20,40),groupvec=groupvec,itmgrps=1:5) #There are 55 parameters dim(W) \dontrun{ #Estimating LLRA by specifiying W ex2W <- LLRA(llraDat2[1:20],W=W,mpoints=4,groups=llraDat2[21])} }eRm/man/Waldtest.Rd0000755000175100001440000000473314375241641013665 0ustar hornikusers\encoding{UTF-8} \name{Waldtest} \alias{Waldtest} \alias{Waldtest.Rm} \alias{print.wald} %- Also NEED an '\alias' for EACH other topic documented here. \title{Item-Specific Wald Test} \description{Performs a Wald test on item-level by splitting subjects into subgroups. } \usage{ \method{Waldtest}{Rm}(object, splitcr = "median") \method{print}{wald}(x,...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{Object of class \code{RM}.} \item{splitcr}{Split criterion for subject raw score splitting. \code{median} uses the median as split criterion, \code{mean} performs a mean-split. Optionally \code{splitcr} can also be a dichotomous vector which assigns each person to a certain subgroup (e.g., following an external criterion). This vector can be numeric, character or a factor. } \item{x}{Object of class \code{wald}.} \item{...}{Further arguments passed to or from other methods. They are ignored in this function.} } \details{Items are eliminated if they not have the same number of categories in each subgroup. To avoid this problem, for RSM and PCM it is considered to use a random or another user-defined split. If the data set contains missing values and \code{mean} or \code{median} is specified as splitcriterion, means or medians are calculated for each missing value subgroup and consequently used for raw score splitting.} \value{ Returns an object of class \code{wald} containing: \item{coef.table}{Data frame with test statistics, z- and p-values.} \item{betapar1}{Beta parameters for first subgroup} \item{se.beta1}{Standard errors for first subgroup} \item{betapar2}{Beta parameters for second subgroup} \item{se.beta2}{Standard errors for second subgroup} \item{se.beta2}{Standard errors for second subgroup} \item{spl.gr}{Names and levels for \code{splitcr}.} \item{call}{The matched call.} } \references{ Fischer, G. H., and Molenaar, I. (1995). Rasch Models - Foundations, Recent Developements, and Applications. Springer. Fischer, G. H., and Scheiblechner, H. (1970). Algorithmen und Programme fuer das probabilistische Testmodell von Rasch [Algorithms and programs for Rasch's probabilistic test model]. Psychologische Beitraege, 12, 23-51. } \author{Patrick Mair, Reinhold Hatzinger} %\note{} \seealso{\code{\link{LRtest}}, \code{\link{MLoef}}} \examples{ #Wald test for Rasch model with user-defined subject split res <- RM(raschdat2) splitvec <- sample(1:2,25,replace=TRUE) Waldtest(res, splitcr = splitvec) } \keyword{models} eRm/man/sim.locdep.Rd0000755000175100001440000000477014375241641014134 0ustar hornikusers\encoding{UTF-8} \name{sim.locdep} \alias{sim.locdep} \title{Simulation locally dependent items} \description{This utility function returns a 0-1 matrix violating the local independence assumption. } \usage{ sim.locdep(persons, items, it.cor = 0.25, seed = NULL, cutpoint = "randomized") } \arguments{ \item{persons}{Either a vector of person parameters or an integer indicating the number of persons (see details).} \item{items}{Either a vector of item parameters or an integer indicating the number of items (see details).} \item{it.cor}{Either a single correlation value between 0 and 1 or a positive semi-definite VC matrix.} \item{seed}{A seed for the random number generated can be set.} \item{cutpoint}{Either \code{"randomized"} for a randomized tranformation of the model probability matrix into the model 0-1 matrix or an integer value between 0 and 1 (see details).} } \details{If \code{persons} or \code{items} is an integer value, the corresponding parameter vector is drawn from N(0,1). The \code{cutpoint} argument refers to the transformation of the theoretical probabilities into a 0-1 data matrix. A randomized assingment implies that for each cell an additional random number is drawn. If the model probability is larger than this value, the person gets 1 on this particular item, if smaller, 0 is assigned. Alternatively, a numeric probability cutpoint can be assigned and the 0-1 scoring is carried out according to the same rule. The argument \code{it.cor} reflects the pair-wise inter-item correlation. If this should be constant across the items, a single value between 0 (i.e. Rasch model) and 1 (strong violation) can be specified. Alternatively, a symmetric VC-matrix of dimension number of items can be defined. } \references{ Jannarone, R. J. (1986). Conjunctive item response theory kernels. Psychometrika, 51, 357-373. Su\'arez-Falc\'on, J. C., & Glas, C. A. W. (2003). Evaluation of global testing procedures for item fit to the Rasch model. British Journal of Mathematical and Statistical Society, 56, 127-143. } \seealso{\code{\link{sim.rasch}}, \code{\link{sim.2pl}}, \code{\link{sim.xdim}}} \examples{ #simulating locally-dependent data #500 persons, 10 items, inter-item correlation of 0.5 X <- sim.locdep(500, 10, it.cor = 0.5) #500 persons, 4 items, correlation matrix specified sigma <- matrix(c(1,0.2,0.2,0.3,0.2,1,0.4,0.1,0.2,0.4,1,0.8,0.3,0.1,0.8,1), ncol = 4) X <- sim.locdep(500, 4, it.cor = sigma) } \keyword{models} eRm/man/test_info.Rd0000755000175100001440000000201614375241641014060 0ustar hornikusers\encoding{UTF-8} \name{test_info} \alias{test_info} \title{Calculate Test Information For \code{eRm} objects } \description{ Calculates the information of a test or a scale as the sum of Samejima's (1969) information for all items. } \usage{ test_info(ermobject, theta=seq(-5,5,0.01)) } \arguments{ \item{ermobject}{An object of class \code{'eRm'}. } \item{theta}{Supporting or sampling points on the latent trait. } } \details{The function \code{test_info} calculates the test or scale information of the whole set of items in the \code{'eRm'} object. } \value{ Returns the vector of test information for all values of theta. } \references{ Samejima, F. (1969) Estimation of latent ability using a response pattern of graded scores. \emph{Psychometric Monographs}, \bold{17}. } \author{Thomas Rusch} \seealso{ The function to calculate the item information, \code{\link{item_info}} and the plot function \code{\link{plotINFO}}. } \examples{ res <- PCM(pcmdat) tinfo <- test_info(res) plotINFO(res, type="test") } eRm/man/MLoef.Rd0000755000175100001440000000567214375241641013103 0ustar hornikusers\encoding{UTF-8} \name{MLoef} \alias{MLoef} \alias{print.MLoef} \alias{summary.MLoef} \title{Martin-Löf's Likelihood-Ratio-Test} \description{This Likelihood-Ratio-Test is based on item subgroup splitting.} \usage{MLoef(robj, splitcr = "median")} \arguments{ \item{robj}{ An object of class \code{'Rm'}. } \item{splitcr}{ Split criterion to define the item groups. \code{"median"} and \code{"mean"} split items in two groups based on their items' raw scores.\cr% \code{splitcr} can also be a vector of length \eqn{k}{k} (where \eqn{k}{k} denotes the number of items) that takes two or more distinct values to define groups used for the Martin-Löf Test. } } \details{ This function implements a generalization of the Martin-Löf test for polytomous items as proposed by Christensen, Bjørner, Kreiner & Petersen (2002), but does currently not allow for missing values. If the split criterion is \code{"median"} or \code{"mean"} and one or more items' raw scores are equal the median resp. mean, \code{MLoef} will assign those items to the lower raw score group. \code{summary.MLoef} gives detailed information about the allocation of all items. \code{summary} and \code{print} methods are available for objects of class \code{'MLoef'}. An \sQuote{exact} version of the Martin-Löf test for binary items is implemented in the \code{\link[eRm:NPtest]{NPtest}} function. } \value{ \code{MLoef} returns an object of class \code{MLoef} containing: \item{LR}{LR-value} \item{df}{degrees of freedom} \item{p.value}{\emph{p}-value of the test} \item{fullModel}{the overall Rasch model} \item{subModels}{a list containing the submodels} \item{Lf}{log-likelihood of the full model} \item{Ls}{list of the sub models' log-likelihoods} \item{i.groups}{a list of the item groups} \item{splitcr}{submitted split criterion} \item{split.vector}{binary allocation of items to groups} \item{warning}{items equalling median or mean for the respective split criteria} \item{call}{the matched call} } \references{ Christensen, K. B., Bjørner, J. B., Kreiner S. & Petersen J. H. (2002). Testing unidimensionality in polytomous Rasch models. \emph{Psychometrika, (67)}4, 563--574. Fischer, G. H., and Molenaar, I. (1995). \emph{Rasch Models -- Foundations, Recent Developements, and Applications.} Springer. Rost, J. (2004). \emph{Lehrbuch Testtheorie -- Testkonstruktion.} Bern: Huber. } \author{Marco J. Maier, Reinhold Hatzinger} \seealso{\code{\link{LRtest}}, \code{\link{Waldtest}}} \examples{ # Martin-Löf-test on dichotomous Rasch model using "median" and a user-defined # split vector. Note that group indicators can be of character and/or numeric. splitvec <- c(1, 1, 1, "x", "x", "x", 0, 0, 1, 0) res <- RM(raschdat1[,1:10]) MLoef.1 <- MLoef(res, splitcr = "median") MLoef.2 <- MLoef(res, splitcr = splitvec) MLoef.1 summary(MLoef.2) } \keyword{models} eRm/man/stepwiseIt.Rd0000755000175100001440000000524314375241641014233 0ustar hornikusers\encoding{UTF-8} \name{stepwiseIt} \alias{stepwiseIt} \alias{stepwiseIt.eRm} \alias{print.step} %- Also NEED an '\alias' for EACH other topic documented here. \title{Stepwise item elimination} \description{This function eliminates items stepwise according to one of the following criteria: itemfit, Wald test, Andersen's LR-test } \usage{ \method{stepwiseIt}{eRm}(object, criterion = list("itemfit"), alpha = 0.05, verbose = TRUE, maxstep = NA) } \arguments{ \item{object}{Object of class \code{eRm}.} \item{criterion}{List with either \code{"itemfit"}, \code{"Waldtest"} or \code{"LRtest"} as first element. Optionally, for the Waldtest and LRtest a second element containing the split criterion can be specified (see details).} \item{alpha}{Significance level.} \item{verbose}{If \code{TRUE} intermediate results are printed out. } \item{maxstep}{Maximum number of elimination steps. If \code{NA} the procedure stops when the itemset is Rasch homogeneous.} } \details{If \code{criterion = list("itemfit")} the elimination stops when none of the p-values in itemfit is significant. Within each step the item with the largest chi-squared itemfit value is excluded. If \code{criterion = list("Waldtest")} the elimination stops when none of the p-values resulting from the Wald test is significant. Within each step the item with the largest z-value in Wald test is excluded. If \code{criterion = list("LRtest")} the elimination stops when Andersen's LR-test is not significant. Within each step the item with the largest z-value in Wald test is excluded. } \value{ The function returns an object of class \code{step} containing: \item{X}{Reduced data matrix (bad items eliminated)} \item{fit}{Object of class \code{eRm} with the final item parameter elimination} \item{it.elim}{Vector contaning the names of the eliminated items} \item{res.wald}{Elimination results for Wald test criterion} \item{res.itemfit}{Elimination results for itemfit criterion} \item{res.LR}{Elimination results for LR-test criterion} \item{nsteps}{Number of elimination steps} } \seealso{ \code{\link{LRtest.Rm}}, \code{\link{Waldtest.Rm}}, \code{\link{itemfit.ppar}} } \examples{ ## 2pl-data, 100 persons, 10 items set.seed(123) X <- sim.2pl(500, 10, 0.4) res <- RM(X) ## elimination according to itemfit stepwiseIt(res, criterion = list("itemfit")) ## Wald test based on mean splitting stepwiseIt(res, criterion = list("Waldtest","mean")) ## Andersen LR-test based on random split set.seed(123) groupvec <- sample(1:3, 500, replace = TRUE) stepwiseIt(res, criterion = list("LRtest",groupvec)) } \keyword{models} eRm/man/plotPWmap.Rd0000755000175100001440000001160614375241641014016 0ustar hornikusers\encoding{UTF-8} \name{plotPWmap} \alias{plotPWmap} \title{Pathway Map} \description{ A Bond-and-Fox Pathway Map displays the location of each item or each person against its infit t-statistic. Pathway maps are useful for identifying misfitting items or misfitting persons. Items or people should ideally have a infit t-statistic lying between about -2 and +2, and these values are marked. } \usage{ plotPWmap(object, pmap = FALSE, imap=TRUE, item.subset = "all", person.subset = "all", mainitem = "Item Map", mainperson = "Person Map", mainboth="Item/Person Map", latdim = "Latent Dimension", tlab = "Infit t statistic", pp = NULL, cex.gen = 0.6, cex.pch=1, person.pch = 1, item.pch = 16, personCI = NULL, itemCI = NULL, horiz=FALSE) } \arguments{ \item{object}{Object of class \code{Rm} or \code{dRm}} \item{pmap}{Plot a person map if \code{TRUE}; the default is \code{FALSE}.} \item{imap}{Plot an item map if \code{TRUE} (the default); do not plot if \code{FALSE}. At least one of \code{pmap} and \code{imap} must be \code{TRUE}.} \item{item.subset}{Subset of items to be plotted for an item map. Either a numeric vector indicating the item numbers or a character vector indicating the item names. If \code{"all"}, all items are plotted. The number of items to be plotted must be > 1.} \item{person.subset}{Subset of persons to be plotted for a person map. Either a numeric vector indicating the person numbers or a character vector indicating the person names. If \code{"all"}, all persons are plotted. The number of persons to be plotted must be > 1.} \item{mainitem}{Main title of an item plot.} \item{mainperson}{Main title of a person plot.} \item{mainboth}{Main title of a person/item joint plot.} \item{latdim}{Label of the y-axis, i.e., the latent dimension.} \item{tlab}{Label of the x-axis, i.e., the t-statistic dimension.} \item{pp}{If non-\code{NULL}, this contains the \code{person.parameter} data of the data object, avoiding the need to recalculate it.} \item{cex.gen}{\code{cex} as a graphical parameter specifies a numerical value giving the amount by which plotting text and symbols should be magnified relative to the default. Here \code{cex.gen} applies to all text labels. The default is 0.6.} \item{cex.pch}{applies to all plotting symbols. The default is 1.} \item{person.pch, item.pch}{Specifies the symbol used for plotting person data and item data respectively; the defaults are 1 and 16 respectively. See \code{\link{points}} for more information about \code{pch} values.} \item{personCI, itemCI}{Plotting confidence intervals for the the person abilities and item difficulties. If \code{personCI=NULL} (the default) no confidence intervals are drawn for person abilities. Otherwise, specifying \code{personCI} draws approximate confidence intervals for each person's ability. \code{personCI} must be specified as a list, and the optional elements of this list are \code{gamma}, the confidence level, \code{col}, colour, and \code{lty}, line type. If \code{personCI} is specified as an empty list, or not all of the list items are specified, the default values \code{personCI=list(gamma=0.95,col="orange",lty="dotted")} will be used. The same goes for \code{itemCI}, except that the default settings are \code{itemCI=list(gamma=0.95,col="red",lty="dotted")}.} \item{horiz}{if \code{TRUE}, the plot is horizontal, i.e., the latent dimension is on the x-axis. The default is \code{FALSE}.} } \details{ This code uses vertical(horizontal) error bars rather than circles or boxes to indicate standard errors. It also offers the possibility of plotting item or person data on its own; this can considerably simplify the reading of the plots for large datasets. } %\value{} \references{ Bond T.G., Fox C.M. (2007) \emph{Applying the Rasch Model: Fundamental Measurement in the Human Sciences} (2nd ed.) chapter 3, Lawrence Erlbaum Associates, Inc. Linacre J.M., Wright B.D. (1994) Dichotomous Infit and Outfit Mean-Square Fit Statistics / Chi-Square Fit Statistics. \emph{Rasch Measurement Transactions} \bold{8:2} p. 350, \url{https://www.rasch.org/rmt/rmt82a.htm} Linacre J.M. (2002) What do Infit and Outfit, Mean-square and Standardized mean? \emph{Rasch Measurement Transactions} \bold{16:2} p. 878, \url{https://www.rasch.org/rmt/rmt162f.htm} Wright B.D., Masters G.N. (1990) Computation of OUTFIT and INFIT Statistics. \emph{Rasch Measurement Transactions} \bold{3:4} p. 84--85, \url{https://www.rasch.org/rmt/rmt34e.htm} } \author{Julian Gilbey} %\note{} %\seealso{} \examples{ res <- PCM(pcmdat) pparm <- person.parameter(res) plotPWmap(res, pp = pparm) plotPWmap(res, pp = pparm, pmap = TRUE) } \keyword{models} eRm/man/plotTR.Rd0000755000175100001440000000244414375241641013317 0ustar hornikusers\encoding{UTF-8} \name{plotTR} \alias{plotTR} \title{Plot Trend Effects for LLRA } \description{ Plots trend effects over time. } \usage{ plotTR(object, ...) } \arguments{ \item{object}{an object of class \code{"llra"} } \item{\dots}{Additional parameters to be passed to and from other methods} } \details{ The plot is a lattice plot with one panel. The effects for each items are plotted over the different time points. Please note that all effects are to be interpreted relative to the baseline (i.e. t1). Currently, this function only works for a full item x treatment x timepoints LLRA. Collapsed effects will not be displayed properly. } \author{Thomas Rusch} \seealso{ The plot method for treatment effects \code{"plotGR"}. } \section{Warning:}{ Objects of class \code{"llra"} that contain estimates from a collapsed data matrix will not be displayed correctly. } \examples{ ##Example 6 from Hatzinger & Rusch (2009) groups <- c(rep("TG",30),rep("CG",30)) llra1 <- LLRA(llradat3,mpoints=2,groups=groups) summary(llra1) plotTR(llra1) \dontrun{ ##An LLRA with 2 treatment groups and 1 baseline group, 5 items and 4 ##time points. Item 1 is dichotomous, all others have 3, 4, 5, 6 ##categories respectively. ex2 <- LLRA(llraDat2[1:20],mpoints=4,groups=llraDat2[21]) plotTR(ex2)} } eRm/man/plotGR.Rd0000755000175100001440000000270514375241641013302 0ustar hornikusers\encoding{UTF-8} \name{plotGR} \alias{plotGR} \title{Plot Treatment or Covariate Effects for LLRA } \description{ Plots treatment or covariate group effects over time. } \usage{ plotGR(object, ...) } \arguments{ \item{object}{an object of class "llra". } \item{\dots}{Additional parameters to be passed to and from other methods. } } \details{ The plot is a lattice plot with each panel corresponding to an item. The effects are plotted for each groups (including baseline) over the different time points. The groups are given the same names as for the parameter estimates (derived from groupvec). Please note that all effects are to be interpreted relative to the baseline. Currently, this function only works for a full item x treatment x timepoints LLRA. Collapsed effects will not be displayed properly. } \author{Thomas Rusch} \seealso{ The plot method for trend effects \code{\link{plotTR}}. } \section{Warning:}{ Objects of class \code{"llra"} that contain estimates from a collapsed data matrix will not be displayed correctly. } \examples{ ##Example 6 from Hatzinger & Rusch (2009) groups <- c(rep("TG",30),rep("CG",30)) llra1 <- LLRA(llradat3,mpoints=2,groups=groups) summary(llra1) plotGR(llra1) \dontrun{ ##An LLRA with 2 treatment groups and 1 baseline group, 5 items and 4 ##time points. Item 1 is dichotomous, all others have 3, 4, 5, 6 ##categories respectively. ex2 <- LLRA(llraDat2[1:20],mpoints=4,groups=llraDat2[21]) plotGR(ex2)} } eRm/man/item_info.Rd0000755000175100001440000000270614473203752014045 0ustar hornikusers\encoding{UTF-8} \name{item_info} \alias{item_info} \alias{i_info} \title{Calculate Item Information for 'eRm' objects } \description{ Calculates Samejima's (1969) information for all items. } \usage{ item_info(ermobject, theta = seq(-5, 5, 0.01)) i_info(hvec, itembeta, theta) } \arguments{ \item{ermobject}{An object of class 'eRm'. } \item{theta}{Supporting or sampling points on the latent trait. } \item{hvec}{Number of categories of a single item. } \item{itembeta}{Cumulative item category parameters for a single item. } } \details{The function \code{item_info} calculates information of the whole set of items in the 'eRm' object. The function \code{i_info} does the same for a single item (and is called by \code{item_info}). } \value{ Returns a list (\code{i_info}) or a list of lists (where each list element corresponds to an item, \code{item_info}) and contains \item{c.info}{Matrix of category information in columns for the different theta values in rows.} \item{i.info}{Vector of item information for the different theta values.} } \references{ Samejima, F. (1969) Estimation of latent ability using a response pattern of graded scores. \emph{Psychometric Monographs}, \bold{17}. } \author{Thomas Rusch} \seealso{ The function to calculate the test information, \code{\link{test_info}} and the plot function \code{\link{plotINFO}}. } \examples{ res <- PCM(pcmdat) info <- item_info(res) plotINFO(res,type="item") } eRm/man/thresholds.Rd0000755000175100001440000000461214375241641014251 0ustar hornikusers\encoding{UTF-8} \name{thresholds} \alias{thresholds} \alias{thresholds.eRm} \alias{print.threshold} \alias{summary.threshold} \alias{confint.threshold} %- Also NEED an '\alias' for EACH other topic documented here. \title{Computation of item-category treshold parameters.} \description{This function transforms the beta parameters into threshold parameters. These can be interpreted by means of log-odds as visualized in ICC plots. } \usage{ \method{thresholds}{eRm}(object) \method{print}{threshold}(x, ...) \method{summary}{threshold}(object, ...) \method{confint}{threshold}(object, parm, level = 0.95, ...) } \arguments{ Arguments for \code{thresholds}: \item{object}{Object of class \code{eRm}.} Arguments for \code{print}, \code{summary}, and \code{confint} methods: \item{x}{Object of class \code{threshold}.} \item{parm}{Parameter specification (ignored).} \item{level}{Alpha-level.} \item{...}{Further arguments to be passed to methods. They are ignored.} } \details{For dichotomous models (i.e., RM and LLTM) threshold parameters are not computed. The \code{print} method returns a location parameter for each item which is the mean of the corresponding threshold parameters. For LPCM and LRSM the thresholds are computed for each design matrix block (i.e., measurement point/group) separately (PCM and RSM have only 1 block).} \value{ The function \code{thresholds} returns an object of class \code{threshold} containing: \item{threshpar}{Vector with threshold parameters.} \item{se.thresh}{Vector with standard errors.} \item{threshtable}{Data frame with location and threshold parameters.} } \references{ Andrich, D. (1978). Application of a psychometric rating model to ordered categories which are scored with successive integers. Applied Psychological Measurement, 2, 581-594. } \seealso{ \code{\link{plotICC.Rm}} } \examples{ #Threshold parameterization for a rating scale model res <- RSM(rsmdat) th.res <- thresholds(res) th.res confint(th.res) summary(th.res) #Threshold parameters for a PCM with ICC plot res <- PCM(pcmdat) th.res <- thresholds(res) th.res plotICC(res) #Threshold parameters for a LPCM: #Block 1: t1, g1; Block 2: t1, g2; ...; Block 6: t2,g3 G <- c(rep(1,7),rep(2,7),rep(3,6)) # group vector for 3 groups res <- LPCM(lpcmdat, mpoints = 2, groupvec = G) th.res <- thresholds(res) th.res } \keyword{models} eRm/man/IC.Rd0000755000175100001440000000221214375241641012357 0ustar hornikusers\encoding{UTF-8} \name{IC} \alias{IC} \alias{IC.ppar} \title{Information criteria} \description{Computation of information criteria such as AIC, BIC, and cAIC based on unconditional (joint), marginal, and conditional log-likelihood} \usage{ \method{IC}{ppar}(object) } \arguments{ \item{object}{Object of class \code{ppar} (from \code{person.parameter()}.} } \details{ The joint log-likelihood is established by summation of the logarithms of the estimated solving probabilities. The marginal log-likelihood can be computed directly from the conditional log-likelihood (see vignette for details). } \value{ The function \code{IC} returns an object of class \code{ICr} containing: \item{ICtable}{Matrix containing log-likelihood values, number of parameters, AIC, BIC, and cAIC for the joint, marginal, and conditional log-likelihood.} } \seealso{ \code{\link{LRtest.Rm}} } \examples{ #IC's for Rasch model res <- RM(raschdat2) #Rasch model pres <- person.parameter(res) #Person parameters IC(pres) #IC's for RSM res <- RSM(rsmdat) pres <- person.parameter(res) IC(pres) } \keyword{models} eRm/man/summary.RSmpl.Rd0000755000175100001440000000156314375241641014625 0ustar hornikusers\encoding{UTF-8} \name{summary.RSmpl} \alias{summary.RSmpl} \alias{summary.RSmplext} \title{Summary Methods for Sample Objects} \description{ Prints a summary list for sample objects of class \code{\link{RSmpl}} and \code{\link{RSmplext}}. } \usage{ \method{summary}{RSmpl}(object, ...) \method{summary}{RSmplext}(object, ...) } \arguments{ \item{object}{object as obtained from \code{rsampler} or \code{rsextrobj} } \item{\dots}{ potential further arguments (ignored) } } \details{ Describes the status of an sample object. } \seealso{\code{\link{rsampler}}, \code{\link{rsextrobj}} } \examples{ ctr <- rsctrl(burn_in = 10, n_eff = 3, step=10, seed = 0, tfixed = FALSE) mat <- matrix(sample(c(0,1), 50, replace = TRUE), nr = 10) all_m <- rsampler(mat, ctr) summary(all_m) some_m <- rsextrobj(all_m, 1, 2) summary(some_m) } \keyword{misc} eRm/man/LRSM.Rd0000755000175100001440000000715014375241641012647 0ustar hornikusers\encoding{UTF-8} \name{LRSM} \alias{LRSM} %- Also NEED an '\alias' for EACH other topic documented here. \title{Estimation of linear rating scale models} \description{ This function computes the parameter estimates of a linear rating scale model (LRSM) for polytomuous item responses by using CML estimation. } \usage{ LRSM(X, W , mpoints = 1, groupvec = 1, se = TRUE, sum0 = TRUE, etaStart) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{X}{Input data matrix or data frame; rows represent individuals (N in total), columns represent items. Missing values are inserted as \code{NA}.} \item{W}{Design matrix for the LRSM. If omitted, the function will compute W automatically.} \item{mpoints}{Number of measurement points.} \item{groupvec}{Vector of length N which determines the group membership of each subject, starting from 1} \item{se}{If \code{TRUE}, the standard errors are computed.} \item{sum0}{If \code{TRUE}, the parameters are normalized to sum-0 by specifying an appropriate \code{W}. If \code{FALSE}, the first parameter is restricted to 0.} \item{etaStart}{A vector of starting values for the eta parameters can be specified. If missing, the 0-vector is used.} } \details{ Through appropriate definition of \code{W} the LRSM can be viewed as a more parsimonous RSM, on the one hand, e.g. by imposing some cognitive base operations to solve the items. One the other hand, linear extensions of the Rasch model such as group comparisons and repeated measurement designs can be computed. If more than one measurement point is examined, the item responses for the 2nd, 3rd, etc. measurement point are added column-wise in X. If \code{W} is user-defined, it is nevertheless necessary to specify \code{mpoints} and \code{groupvec}. It is important that first the time contrasts and then the group contrasts have to be imposed. Available methods for LRSM-objects are: \code{print}, \code{coef}, \code{model.matrix}, \code{vcov},\code{summary}, \code{logLik}, \code{person.parameters}. } \value{ Returns an object of class \code{'eRm'} containing: \item{loglik}{Conditional log-likelihood.} \item{iter}{Number of iterations.} \item{npar}{Number of parameters.} \item{convergence}{See \code{code} output in \code{\link{nlm}}.} \item{etapar}{Estimated basic item parameters (item and category parameters).} \item{se.eta}{Standard errors of the estimated basic item parameters.} \item{betapar}{Estimated item (easiness) parameters.} \item{se.beta}{Standard errors of item parameters.} \item{hessian}{Hessian matrix if \code{se = TRUE}.} \item{W}{Design matrix.} \item{X}{Data matrix.} \item{X01}{Dichotomized data matrix.} \item{groupvec}{Group membership vector.} \item{call}{The matched call.} } \references{ Fischer, G. H., and Molenaar, I. (1995). Rasch Models - Foundations, Recent Developements, and Applications. Springer. Mair, P., and Hatzinger, R. (2007). Extended Rasch modeling: The \pkg{eRm} package for the application of IRT models in R. Journal of Statistical Software, 20(9), 1-20. Mair, P., and Hatzinger, R. (2007). CML based estimation of extended Rasch models with the \pkg{eRm} package in R. Psychology Science, 49, 26-43. } \author{Patrick Mair, Reinhold Hatzinger} %\note{} \seealso{\code{\link{LLTM}},\code{\link{LPCM}}} \examples{ #LRSM for two measurement points #20 subjects, 2*3 items, W generated automatically, #first parameter set to 0, no standard errors computed. res <- LRSM(lrsmdat, mpoints = 2, groupvec = 1, sum0 = FALSE, se = FALSE) res } \keyword{models} eRm/man/PCM.Rd0000755000175100001440000000556014375241641012514 0ustar hornikusers\encoding{UTF-8} \name{PCM} \alias{PCM} %- Also NEED an '\alias' for EACH other topic documented here. \title{Estimation of partial credit models} \description{ This function computes the parameter estimates of a partial credit model for polytomous item responses by using CML estimation. } \usage{ PCM(X, W, se = TRUE, sum0 = TRUE, etaStart) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{X}{Input data matrix or data frame with item responses (starting from 0); rows represent individuals, columns represent items. Missing values are inserted as \code{NA}.} \item{W}{Design matrix for the PCM. If omitted, the function will compute W automatically.} \item{se}{If \code{TRUE}, the standard errors are computed.} \item{sum0}{If \code{TRUE}, the parameters are normed to sum-0 by specifying an appropriate \code{W}. If \code{FALSE}, the first parameter is restricted to 0.} \item{etaStart}{A vector of starting values for the eta parameters can be specified. If missing, the 0-vector is used.} } \details{ Through specification in W, the parameters of the categories with 0 responses are set to 0 as well as the first category of the first item. Available methods for PCM-objects are:\cr \code{print}, \code{coef}, \code{model.matrix}, \code{vcov}, \code{plot}, \code{summary}, \code{logLik}, \code{person.parameters}, \code{plotICC}, \code{LRtest}. } \value{ Returns an object of class \code{Rm, eRm} containing. \item{loglik}{Conditional log-likelihood.} \item{iter}{Number of iterations.} \item{npar}{Number of parameters.} \item{convergence}{See \code{code} output in \code{\link{nlm}}.} \item{etapar}{Estimated basic item difficulty parameters.} \item{se.eta}{Standard errors of the estimated basic item parameters.} \item{betapar}{Estimated item-category (easiness) parameters.} \item{se.beta}{Standard errors of item parameters.} \item{hessian}{Hessian matrix if \code{se = TRUE}.} \item{W}{Design matrix.} \item{X}{Data matrix.} \item{X01}{Dichotomized data matrix.} \item{call}{The matched call.} } \references{ Fischer, G. H., and Molenaar, I. (1995). Rasch Models - Foundations, Recent Developements, and Applications. Springer. Mair, P., and Hatzinger, R. (2007). Extended Rasch modeling: The \pkg{eRm} package for the application of IRT models in R. Journal of Statistical Software, 20(9), 1-20. Mair, P., and Hatzinger, R. (2007). CML based estimation of extended Rasch models with the \pkg{eRm} package in R. Psychology Science, 49, 26-43. } \author{Patrick Mair, Reinhold Hatzinger} %\note{} \seealso{\code{\link{RM}},\code{\link{RSM}},\code{\link{LRtest}} } \examples{ ##PCM with 10 subjects, 3 items res <- PCM(pcmdat) res summary(res) #eta and beta parameters with CI thresholds(res) #threshold parameters } \keyword{models} eRm/man/LLRA.Rd0000755000175100001440000001153114473214517012623 0ustar hornikusers\encoding{UTF-8} \name{LLRA} \alias{LLRA} \alias{print.llra} \title{Fit Linear Logistic Models with Relaxed Assumptions (LLRA) } \description{ Automatically builds design matrix and fits LLRA. } \usage{ LLRA(X, W, mpoints, groups, baseline, itmgrps = NULL, ...) \method{print}{llra}(x, ...) } \arguments{ \item{X}{Data matrix as described in Hatzinger and Rusch (2009). It must be of wide format, e.g. for each person all item answers are written in columns for t1, t2, t3 etc. Hence each row corresponds to all observations for a single person. See llraDat1 for an example. Missing values are not allowed. } \item{W}{Design Matrix for LLRA to be passed to \code{LPCM}. If missing, it is generated automatically. } \item{mpoints}{The number of time points. } \item{groups}{Vector, matrix or data frame with subject/treatment covariates. } \item{baseline}{An optional vector with the baseline values for the columns in group. } \item{itmgrps}{ Specifies how many groups of items there are. Currently not functional but may be useful in the future. } \item{x}{For the print method, an object of class \code{"llra"}. } \item{\dots}{ Additional arguments to be passed to and from other methods. } } \details{The function \code{LLRA} is a wrapper for \code{LPCM} to fit Linear Logistic Models with Relaxed Assumptions (LLRA). LLRA are extensions of the LPCM for the measurement of change over a number of discrete time points for a set of items. It can incorporate categorical covariate information. If no design matrix W is passed as an argument, it is built automatically from scratch. Unless passed by the user, the baseline group is always the one with the lowest (alpha-)numerical value for argument \code{groups}. All other groups are labeled decreasingly according to the (alpha)-numerical value, e.g. with 2 treatment groups (TG1 and TG2) and one control group (CG), CG will be the baseline than TG1 and TG2. Hence the group effects are ordered like \code{rev((unique(names(groupvec)))} for naming. Caution is advised as LLRA will fail if all changes for a group will be into a single direction (e.g. all subjects in the treatment group show improvement). Currently only data matrices are supported as arguments. } \value{ Returns an object of class \code{'llra'} (also inheriting from class \code{'eRm'}) containing \item{loglik}{Conditional log-likelihood.} \item{iter}{Number of iterations.} \item{npar}{Number of parameters.} \item{convergence}{See code output in nlm.} \item{etapar}{Estimated basic item parameters. These are the LLRA effect parameters.} \item{se.eta}{Standard errors of the estimated basic item parameters.} \item{betapar}{Estimated item (easiness) parameters of the virtual items (not useful for interpretation here).} \item{se.beta}{Standard errors of virtual item parameters (not useful for interpretation here).} \item{hessian}{Hessian matrix if \code{se = TRUE}.} \item{W}{Design matrix.} \item{X}{Data matrix in long format. The columns correspond to the measurement points and each persons item answers are listed susequently in rows.} \item{X01}{Dichotomized data matrix.} \item{groupvec}{Assignment vector.} \item{call}{The matched call.} \item{itms}{The number of items.} } \references{ Fischer, G.H. (1995) Linear logistic models for change. In G.H. Fischer and I. W. Molenaar (eds.), \emph{Rasch models: Foundations, recent developments and applications} (pp. 157--181), New York: Springer. Glueck, J. and Spiel, C. (1997) Item response models for repeated measures designs: Application and limitations of four different approaches. \emph{Methods of Psychological Research}, \bold{2}. Hatzinger, R. and Rusch, T. (2009) IRT models with relaxed assumptions in eRm: A manual-like instruction. \emph{Psychology Science Quarterly}, \bold{51}, pp. 87--120. } \author{Thomas Rusch} \section{Warning}{A warning is printed that the first two categories for polytomous items are equated to save parameters. See Hatzinger and Rusch (2009) for a justification why this is valid also from a substantive point of view.} \seealso{ The function to build the design matrix \code{\link{build_W}}, and the S3 methods \code{\link{summary.llra}} and \code{\link{plotTR}} and \code{\link{plotGR}} for plotting. } \examples{ ##Example 6 from Hatzinger & Rusch (2009) groups <- c(rep("TG",30),rep("CG",30)) llra1 <- LLRA(llradat3,mpoints=2,groups=groups) llra1 \dontrun{ ##An LLRA with 2 treatment groups and 1 baseline group, 5 items and 4 ##time points. Item 1 is dichotomous, all others have 3, 4, 5, 6 ##categories respectively. dats <- llraDat2[1:20] groups <- llraDat2$group tps <- 4 #baseline CG ex2 <- LLRA(dats,mpoints=tps,groups=groups) #baseline TG1 ex2a <- LLRA(dats,mpoints=tps,groups=groups,baseline="TG1") #summarize results summary(ex2) summary(ex2a) #plotting plotGR(ex2) plotTR(ex2)} } eRm/man/sim.2pl.Rd0000755000175100001440000000524014375241641013354 0ustar hornikusers\encoding{UTF-8} \name{sim.2pl} % \alias{sim.2pl} % % % \title{Simulation of 2-PL Data} \description{This utility function returns a 0-1 matrix violating the parallel ICC assumption in the Rasch model.} \usage{sim.2pl(persons, items, discrim = 0.25, seed = NULL, cutpoint = "randomized")} % \arguments{ \item{persons}{Either a vector of person parameters or an integer indicating the number of persons (see details).} \item{items}{Either a vector of item parameters or an integer indicating the number of items (see details).} \item{discrim}{Standard deviation on the log scale.} \item{seed}{A seed for the random number generated can be set.} \item{cutpoint}{Either \code{"randomized"} for a randomized transformation of the model probability matrix into the model 0-1 matrix or an integer value between 0 and 1 (see details).} } \details{% If \code{persons} and/or \code{items} (using single integers) are specified to determine the number of subjects or items, the corresponding parameter vector is drawn from N(0,1). The \code{cutpoint} argument refers to the transformation of the theoretical probabilities into a 0-1 data matrix. A randomized assingment implies that for each cell an additional random number is drawn. If the model probability is larger than this value, the person gets 1 on this particular item, if smaller, 0 is assigned. Alternatively, a numeric probability cutpoint can be assigned and the 0-1 scoring is carried out according to the same rule. The \code{discrim} argument can be specified either as a vector of length \code{items} defining the item discrimination parameters in the 2-PL (e.g., \code{c(1,1,0.5,1,1.5)}), or as a single value. In that case, the discrimination parameters are drawn from a lognormal distribution with \code{meanlog = 0}, where the specified value in \code{discrim} refers to the standard deviation on the log-scale. The larger the values, the stronger the degree of Rasch violation. Reasonable values are up to 0.5. If 0, the data are Rasch homogeneous. } % % % \references{ Su\'arez-Falc\'on, J. C., & Glas, C. A. W. (2003). Evaluation of global testing procedures for item fit to the Rasch model. British Journal of Mathematical and Statistical Society, 56, 127-143. } % \seealso{\code{\link{sim.rasch}}, \code{\link{sim.locdep}}, \code{\link{sim.xdim}}} % \examples{ #simulating 2-PL data #500 persons, 10 items, sdlog = 0.30, randomized cutpoint X <- sim.2pl(500, 10, discrim = 0.30) #item and discrimination parameters from uniform distribution, #cutpoint fixed dpar <- runif(50, 0, 2) ipar <- runif(50, -1.5, 1.5) X <- sim.2pl(500, ipar, dpar, cutpoint = 0.5) } % \keyword{models} eRm/man/RaschSampler.Rd0000755000175100001440000001035314375241641014455 0ustar hornikusers\encoding{UTF-8} \name{RaschSampler} \alias{RaschSampler} %\docType{package} \title{Rasch Sampler Package} \description{ The package implements an \acronym{MCMC} algorithm for sampling of binary matrices with fixed margins complying to the Rasch model. Its stationary distribution is uniform. The algorithm also allows for square matrices with fixed diagonal.\cr Parameter estimates in the Rasch model only depend on the marginal totals of the data matrix that is used for the estimation. From this it follows that, if the model is valid, all binary matrices with the same marginals as the observed one are equally likely. For any statistic of the data matrix, one can approximate the null distribution, i.e., the distribution if the Rasch model is valid, by taking a random sample from the collection of equally likely data matrices and constructing the observed distribution of the statistic. One can then simply determine the exceedence probability of the statistic in the observed sample, and thus construct a non-parametric test of the Rasch model. The main purpose of this package is the implementation of a methodology to build nonparametric tests for the Rasch model. \cr In the context of social network theories, where the structure of binary asymmetric relations is studied, for example, person \eqn{a}{a} esteems person \eqn{b}{b}, which correponds to a 1 in cell \eqn{(a, b)}{(a, b)} of the associated adjacency matrix. If one wants to study the distribution of a statistic defined on the adjacency matrix and conditional on the marginal totals, one has to exclude the diagonal cells from consideration, i.e., by keeping the diagonal cells fixed at an arbitrary value. The \code{RaschSampler} package has implemented an appropriate option, thus it can be also used for sampling random adjacency matrices with given marginal totals. } \details{ \tabular{ll}{% Package:\tab RaschSampler\cr Type: \tab Package\cr Version:\tab 0.8-6\cr Date: \tab 2012-07-03\cr License:\tab GNU GPL 2, June 1991\cr% } The user has to supply a binary input matrix. After defining appropriate control parameters using \code{\link{rsctrl}} the sampling function \code{\link{rsampler}} may be called to obtain an object of class \code{\link{RSmpl}} which contains the generated random matrices in encoded form. After defining an appropriate function to operate on a binary matrix (e.g., calculate a statistic such as \code{\link{phi.range}}) the application of this function to the sampled matrices is performed using \code{\link{rstats}}. Prior to applying the user defined function, \code{\link{rstats}} decodes the matrices packed in the \code{\link{RSmpl}}-object.\cr The package also defines a utility function \code{\link{rsextrobj}} for extracting certains parts from the \code{\link{RSmpl}}-object resulting in an object of class \code{\link{RSmplext}}. Both types of objects can be saved and reloaded for later use.\cr Summary methods are available to print information on these objects, as well as on the control object \code{\link{RSctr}} which is obtained from using \code{\link{rsctrl}} containing the specification for the sampling routine. } \author{Reinhold Hatzinger, Patrick Mair, Norman D. Verhelst} \references{ Verhelst, N. D. (2008) An Efficient \acronym{MCMC} Algorithm to Sample Binary Matrices with Fixed Marginals. Psychometrika, Volume 73, Number 4\cr Verhelst, N. D., Hatzinger, R., and Mair, P. (2007) The Rasch Sampler, Journal of Statistical Software, Vol. 20, Issue 4, Feb 2007 } \note{The current implementation allows for data matrices up to 4096 rows and 128 columns. This can be changed by setting \code{nmax} and \code{kmax} in \code{RaschSampler.f90} to values which are a power of 2. These values should also be changed in \code{rserror.R}. For convenience, we reuse the Fortran code of package version 0.8-1 which cicumvents the compiler bug in Linux distributions of GCC 4.3. The following note from package version 0.8-3 is thus obsolete: In case of compilation errors (due to a bug in Linux distributions of GCC 4.3) please use \code{RaschSampler.f90} from package version 0.8-1 and change \code{nmax} and \code{kmax} accordingly (or use GCC 4.4).} \keyword{package} eRm/man/plotICC.Rd0000755000175100001440000001414114375241641013365 0ustar hornikusers\encoding{UTF-8} \name{plotICC} \alias{plotICC} \alias{plotICC.Rm} \alias{plotjointICC} \alias{plotjointICC.dRm} \title{ICC Plots} \description{Plot functions for visualizing the item characteristic curves} \usage{ \method{plotICC}{Rm}(object, item.subset = "all", empICC = NULL, empCI = NULL, mplot = NULL, xlim = c(-4, 4), ylim = c(0, 1), xlab = "Latent Dimension", ylab = "Probability to Solve", main=NULL, col = NULL, lty = 1, legpos = "left", ask = TRUE, ...) \method{plotjointICC}{dRm}(object, item.subset = "all", legend = TRUE, xlim = c(-4, 4), ylim = c(0, 1), xlab = "Latent Dimension", ylab = "Probability to Solve", lty = 1, legpos = "topleft", main="ICC plot",col=NULL,...) } \arguments{ \item{object}{object of class \code{Rm} or \code{dRm}} \item{item.subset}{Subset of items to be plotted. Either a numeric vector indicating the column in \code{X} or a character vector indiciating the column name. If \code{"all"} (default), all items are plotted.} \item{empICC}{Plotting the empirical ICCs for objects of class \code{dRm}. If \code{empICC=NULL} (the default) the empirical ICC is not drawn. Otherwise, \code{empICC} must be specified as a list where the first element must be one of \code{"raw"}, \code{"loess"}, \code{"tukey"}, \code{"kernel"}. The other optional elements are \code{smooth} (numeric), \code{type} (line type for empirical ICCs, useful values are \code{"p"} (default), \code{"l"}, and \code{"b"}, see graphics parameter \code{type} in \code{\link{plot.default}}), \code{pch}, \code{col}, and \code{lty}, plotting `character', colour and linetype (see \code{\link{par}}). See details and examples below. } \item{empCI}{Plotting confidence intervals for the the empirical ICCs. If \code{empCI=NULL} (the default) no confidence intervals are drawn. Otherwise, by specifying \code{empCI} as a list gives `exact' confidence intervals for each point of the empirical ICC. The optional elements of this list are \code{gamma}, the confidence level, \code{col}, colour, and \code{lty}, line type. If \code{empCI} is specified as an empty list, the default values \code{empCI=list(gamma=0.95,col="red",lty="dotted")} will be used. } \item{mplot}{if \code{NULL} the default setting is in effect. For models of class \code{dRm} this is \code{mplot = TRUE}, i.e., the ICCs for up to 4 items are plotted in one figure. For \code{Rm} models the default is \code{FALSE} (each item in one figure) but may be set to \code{TRUE}. } \item{xlab}{Label of the x-axis.} \item{ylab}{Label of the y-axis.} \item{xlim}{Range of person parameters.} \item{ylim}{Range for probability to solve.} \item{legend}{If \code{TRUE}, legend is provided, otherwise the ICCs are labeled.} \item{col}{If not specified or \code{NULL}, line colors are determined automatically. Otherwise, a scalar or vector with appropriate color specifications may be supplied (see \code{\link{par}}).} \item{lty}{Line type.} \item{main}{Title of the plot.} \item{legpos}{Position of the legend with possible values \code{"bottomright"}, \code{"bottom"}, \code{"bottomleft"}, \code{"left"}, \code{"topleft"}, \code{"top"}, \code{"topright"}, \code{"right"} and \code{"center"}. If \code{FALSE} no legend is displayed.} \item{ask}{If \code{TRUE} (the default) and the \code{R} session is interactive the user is asked for input, before a new figure is drawn. \code{FALSE} is only useful if automated figure export is in effect, e.g., when using \code{\link{Sweave}}.} \item{\ldots}{Additional plot parameters.} } \details{Empirical ICCs for objects of class \code{dRm} can be plotted using the option \code{empICC}, a list where the first element specifies the type of calculation of the empirical values. If \code{empICC=list("raw", other specifications)} relative frequencies of the positive responses are calculated for each rawscore group and plotted at the position of the corresponding person parameter. The other options use the default versions of various smoothers: \code{"tukey"} (see \code{\link{smooth}}), \code{"loess"} (see \code{\link{loess}}), and \code{"kernel"} (see \code{\link{ksmooth}}). For \code{"loess"} and \code{"kernel"} a further element, \code{smooth}, may be specified to control the span (default is 0.75) or the bandwith (default is 0.5), respectively. For example, the specification could be \code{empirical = list("loess", smooth=0.9)} or \code{empirical = list("kernel",smooth=2)}. Higher values result in smoother estimates of the empirical ICCs. The optional confidence intervals are obtained by a procedure first given in Clopper and Pearson (1934) based on the beta distribution (see \code{\link{binom.test}}). } \note{For most of the plot options see \code{\link{plot}} and \code{\link{par}}.} %\value{} %\references{} \author{Patrick Mair, Reinhold Hatzinger} %\note{} \seealso{\code{\link{plotGOF}}} \examples{ \dontrun{ # Rating scale model, ICC plot for all items rsm.res <- RSM(rsmdat) thresholds(rsm.res) plotICC(rsm.res) # now items 1 to 4 in one figure without legends plotICC(rsm.res, item.subset = 1:4, mplot = TRUE, legpos = FALSE) # Rasch model for items 1 to 8 from raschdat1 # empirical ICCs displaying relative frequencies (default settings) rm8.res <- RM(raschdat1[,1:8]) plotICC(rm8.res, empICC=list("raw")) # the same but using different plotting styles plotICC(rm8.res, empICC=list("raw",type="b",col="blue",lty="dotted")) # kernel-smoothed empirical ICCs using bandwidth = 2 plotICC(rm8.res, empICC = list("kernel",smooth=3)) # raw empirical ICCs with confidence intervals # displaying only items 2,3,7,8 plotICC(rm8.res, item.subset=c(2,3,7,8), empICC=list("raw"), empCI=list()) # Joint ICC plot for items 2, 6, 8, and 15 for a Rasch model res <- RM(raschdat1) plotjointICC(res, item.subset = c(2,6,8,15), legpos = "left") } } \keyword{models} eRm/man/collapse_W.Rd0000755000175100001440000000456614375241641014172 0ustar hornikusers\encoding{UTF-8} \name{collapse_W} \alias{collapse_W} \title{ Convenient Collapsing of LLRA Design Matrix } \description{ Collapses columns of a design matrix for LLRA to specify different parameter restrictions in \code{LLRA}. } \usage{ collapse_W(W, listItems, newNames) } \arguments{ \item{W}{A design matrix (for LLRA), typically from a call to \code{\link{build_W}} or component \code{$W} from \code{\link{LLRA}} or \code{\link{LPCM}} } \item{listItems}{A list of numeric vectors. Each component of the list specifies columns to be collapsed together. } \item{newNames}{An (optional) character vector specifying the names of the collapsed effects. } } \details{ This function is a convenience function to collapse a design matrix, i.e. to specify linear trend or treatment effects and so on. Collapsing here means that effects in columns are summed up. For this, a list of numeric vectors with the column indices of columns to be collapsed have to be passed to the function. For example, if you want to collapse column 3, 6 and 8 into one new effect and 1, 4 and 9 into another it needs to be passed with \code{list(c(3,6,8),c(1,4,9))}. The new effects can be given names by passing a character vector to the function with equal length as the list. } \value{An LLRA design matrix as described by Hatzinger and Rusch (2009). This can be passed as the \code{W} argument to \code{LLRA} or \code{LPCM}. } \references{ Hatzinger, R. and Rusch, T. (2009) IRT models with relaxed assumptions in eRm: A manual-like instruction. \emph{Psychology Science Quarterly}, \bold{51}, pp. 87--120. } \author{Thomas Rusch} \seealso{ The function to build design matrices from scratch, \code{\link{build_W}}. } \examples{ ##An LLRA with 2 treatment groups and 1 baseline group, 5 items and 4 ##time points. Item 1 is dichotomous, all others have 3, 4, 5, 6 ##categories respectively. llraDat2a <- matrix(unlist(llraDat2[1:20]),ncol=4) groupvec <-rep(1:3*5,each=20) W <- build_W(llraDat2a, nitems=5, mpoints=4, grp_n=c(10,20,40), groupvec=groupvec,itmgrps=1:5) #There are 55 parameters to be estimated dim(W) #Imposing a linear trend for the second item ,i.e. parameters in #columns 32, 37 and 42 need to be collapsed into a single column. collItems1 <- list(c(32,37,42)) newNames1 <- c("trend.I2") Wstar1 <- collapse_W(W,collItems1) #53 parameters need to be estimated dim(Wstar1) }eRm/man/rsextrobj.Rd0000755000175100001440000000505614375241641014117 0ustar hornikusers\encoding{UTF-8} \name{rsextrobj} \alias{rsextrobj} \title{Extracting Encoded Sample Matrices} \description{ Utility function to extract some of the generated matrices, still in encoded form. } \usage{ rsextrobj(RSobj, start = 1, end = 8192) } \arguments{ \item{RSobj}{object as obtained from using \code{rsampler}} \item{start}{number of the matrix to start with. When specifying 1 (the default value) the original input matrix is included in the output object. } \item{end}{last matrix to be extracted. If \code{end} is not specified, all matrices from \code{RSobj} are extracted (the maximal value is 8192, see \code{rsctrl}). If \code{end} is larger than the number of matrices stored in \code{RSobj}, \code{end} is set to the highest possible value (i.e., \code{n_tot}). } } \value{ A list of class \code{\link{RSmpl}} with components \item{n}{number of rows of the input matrix} \item{k}{number of columns of the input matrix} \item{inpmat}{the input matrix} \item{tfixed}{\code{TRUE}, if diagonals of \code{inpmat} are fixed} \item{burn_in}{length of the burn in process} \item{n_eff}{number of generated matrices (effective matrices)} \item{step}{controls the number number of void matrices generated in the burn in process and when effective matrices are generated (see note in \code{\link{rsctrl}}). } \item{seed}{starting value for the random number generator} \item{n_tot}{number of matrices in \code{outvec}.} \item{outvec}{vector of encoded random matrices} \item{ier}{error code} } \note{By default, all generated matrices plus the original matrix (in position 1) are contained in \code{outvec}, thus \code{n_tot = n_eff + 1}. If the original matrix is not in \code{outvec} then \code{n_tot = n_eff}.\cr For saving and loading objects of class \code{RSobj} see the example below. For extracting a decoded (directly usable) matrix use \code{\link{rsextrmat}}. } \seealso{\code{\link{rsampler}}, \code{\link{rsextrmat}} } \examples{ ctr <- rsctrl(burn_in = 10, n_eff = 3, step=10, seed = 0, tfixed = FALSE) mat <- matrix(sample(c(0,1), 50, replace = TRUE), nr = 10) all_m <- rsampler(mat, ctr) summary(all_m) some_m <- rsextrobj(all_m, 1, 2) summary(some_m) \dontrun{ save(some_m, file = "some.RSobj.RData") rm(some_m) ls() load("some.RSobj.RData") summary(some_m)} } \keyword{misc} eRm/man/PersonMisfit.Rd0000755000175100001440000000232014375241641014506 0ustar hornikusers\name{PersonMisfit} \alias{PersonMisfit} \alias{PersonMisfit.ppar} %- Also NEED an '\alias' for EACH other topic documented here. \title{Person Misfit} \description{This function counts the number of persons who do not fit the Rasch model. More specifically, it returns the proportion and frequency of persons - or more generally cases - who exceed a Chi-square based Z-value of 1.96 (suggesting a statistically significant deviation from the predicted response pattern). } \usage{ \method{PersonMisfit}{ppar}(object) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{Object of class \code{ppar}.} } \details{ Returns the proportion and absolute number of persons who do not fit the Rasch model (Z-values > 1.96). } \value{ \code{PersonMisfit} returns an object of class \code{MisfittingPersons} containing: \item{PersonMisfit}{the proportion of misfitting persons,} \item{count.misfit.Z}{the frequency of misfitting person,} \item{total.persons}{the number of persons for whom a fit value was estimated.} } \author{Adrian Bruegger} %\note{} \examples{ rm1 <- RM(raschdat1) pers <- person.parameter(rm1) pmfit <- PersonMisfit(pers) pmfit summary(pmfit) } \keyword{person misfit} eRm/man/LLTM.Rd0000755000175100001440000000725414375241641012647 0ustar hornikusers\encoding{UTF-8} \name{LLTM} \alias{LLTM} \title{Estimation of linear logistic test models} \description{ This function computes the parameter estimates of a linear logistic test model (LLTM) for binary item responses by using CML estimation. } \usage{ LLTM(X, W, mpoints = 1, groupvec = 1, se = TRUE, sum0 = TRUE, etaStart) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{X}{Input 0/1 data matrix or data frame; rows represent individuals (N in total), columns represent items. Missing values have to be inserted as \code{NA}.} \item{W}{Design matrix for the LLTM. If omitted, the function will compute W automatically.} \item{mpoints}{Number of measurement points.} \item{groupvec}{Vector of length N which determines the group membership of each subject, starting from 1. If \code{groupvec=1}, no group contrasts are imposed.} \item{se}{If \code{TRUE}, the standard errors are computed.} \item{sum0}{If \code{TRUE}, the parameters are normalized to sum-0 by specifying an appropriate \code{W}. If \code{FALSE}, the first parameter is restricted to 0.} \item{etaStart}{A vector of starting values for the eta parameters can be specified. If missing, the 0-vector is used.} } \details{ Through appropriate definition of \code{W} the LLTM can be viewed as a more parsimonous Rasch model, on the one hand, e.g. by imposing some cognitive base operations to solve the items. One the other hand, linear extensions of the Rasch model such as group comparisons and repeated measurement designs can be computed. If more than one measurement point is examined, the item responses for the 2nd, 3rd, etc. measurement point are added column-wise in X. If \code{W} is user-defined, it is nevertheless necessary to specify \code{mpoints} and \code{groupvec}. It is important that first the time contrasts and then the group contrasts have to be imposed. Available methods for LLTM-objects are:\cr \code{print}, \code{coef}, \code{model.matrix}, \code{vcov},\code{summary}, \code{logLik}, \code{person.parameters}. } \value{ Returns on object of class \code{eRm} containing: \item{loglik}{Conditional log-likelihood.} \item{iter}{Number of iterations.} \item{npar}{Number of parameters.} \item{convergence}{See \code{code} output in \code{\link{nlm}}.} \item{etapar}{Estimated basic item parameters.} \item{se.eta}{Standard errors of the estimated basic parameters.} \item{betapar}{Estimated item (easiness) parameters.} \item{se.beta}{Standard errors of item parameters.} \item{hessian}{Hessian matrix if \code{se = TRUE}.} \item{W}{Design matrix.} \item{X}{Data matrix.} \item{X01}{Dichotomized data matrix.} \item{groupvec}{Group membership vector.} \item{call}{The matched call.} } \references{ Fischer, G. H., and Molenaar, I. (1995). Rasch Models - Foundations, Recent Developements, and Applications. Springer. Mair, P., and Hatzinger, R. (2007). Extended Rasch modeling: The eRm package for the application of IRT models in R. Journal of Statistical Software, 20(9), 1-20. Mair, P., and Hatzinger, R. (2007). CML based estimation of extended Rasch models with the eRm package in R. Psychology Science, 49, 26-43. } \author{Patrick Mair, Reinhold Hatzinger} %\note{} \seealso{\code{\link{LRSM}},\code{\link{LPCM}}} \examples{ #LLTM for 2 measurement points #100 persons, 2*15 items, W generated automatically res1 <- LLTM(lltmdat1, mpoints = 2) res1 summary(res1) #Reparameterized Rasch model as LLTM (more pasimonious) W <- matrix(c(1,2,1,3,2,2,2,1,1,1),ncol=2) #design matrix res2 <- LLTM(lltmdat2, W = W) res2 summary(res2) } \keyword{models} eRm/man/RSM.Rd0000755000175100001440000000574314375241641012541 0ustar hornikusers\encoding{UTF-8} \name{RSM} \alias{RSM} %- Also NEED an '\alias' for EACH other topic documented here. \title{Estimation of rating scale models} \description{ This function computes the parameter estimates of a rating scale model for polytomous item responses by using CML estimation. } \usage{ RSM(X, W, se = TRUE, sum0 = TRUE, etaStart) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{X}{Input data matrix or data frame with item responses (starting from 0); rows represent individuals, columns represent items. Missing values are inserted as \code{NA}.} \item{W}{Design matrix for the RSM. If omitted, the function will compute W automatically.} \item{se}{If \code{TRUE}, the standard errors are computed.} \item{sum0}{If \code{TRUE}, the parameters are normed to sum-0 by specifying an appropriate \code{W}. If \code{FALSE}, the first parameter is restricted to 0.} \item{etaStart}{A vector of starting values for the eta parameters can be specified. If missing, the 0-vector is used.} } \details{ The design matrix approach transforms the RSM into a partial credit model and estimates the corresponding basic parameters by using CML. Available methods for RSM-objects are \code{print}, \code{coef}, \code{model.matrix}, \code{vcov}, \code{summary}, \code{logLik}, \code{person.parameters}, \code{plotICC}, \code{LRtest}. } \value{ Returns an object of class \code{'Rm'}, \code{'eRm'} and contains the log-likelihood value, the parameter estimates and their standard errors. \item{loglik}{Conditional log-likelihood.} \item{iter}{Number of iterations.} \item{npar}{Number of parameters.} \item{convergence}{See \code{code} output in \code{\link{nlm}}.} \item{etapar}{Estimated basic item difficulty parameters (item and category parameters).} \item{se.eta}{Standard errors of the estimated basic item parameters.} \item{betapar}{Estimated item-category (easiness) parameters.} \item{se.beta}{Standard errors of item parameters.} \item{hessian}{Hessian matrix if \code{se = TRUE}.} \item{W}{Design matrix.} \item{X}{Data matrix.} \item{X01}{Dichotomized data matrix.} \item{call}{The matched call.} } \references{ Fischer, G. H., and Molenaar, I. (1995). Rasch Models - Foundations, Recent Developements, and Applications. Springer. Mair, P., and Hatzinger, R. (2007). Extended Rasch modeling: The \pkg{eRm} package for the application of IRT models in R. Journal of Statistical Software, 20(9), 1-20. Mair, P., and Hatzinger, R. (2007). CML based estimation of extended Rasch models with the \pkg{eRm} package in R. Psychology Science, 49, 26-43. } \author{Patrick Mair, Reinhold Hatzinger} %\note{} \seealso{\code{\link{RM}},\code{\link{PCM}},\code{\link{LRtest}} } \examples{ ##RSM with 10 subjects, 3 items res <- RSM(rsmdat) res summary(res) #eta and beta parameters with CI thresholds(res) #threshold parameters } \keyword{models} eRm/man/plotINFO.Rd0000755000175100001440000000277414473203752013533 0ustar hornikusers\encoding{UTF-8} \name{plotINFO} \alias{plotINFO} \title{Plot Information For \code{'eRm'} objects } \description{Calculates and plots the individual item-category information (type='category'), item information (type='item') or test/scale information (i.e., summed item information, type='scale' or 'test') ) as defined by Samejima (1969)} \usage{ plotINFO(ermobject, type = "both", theta = seq(-6, 6, length.out = 1001L), legpos = "topright", ...) } \arguments{ \item{ermobject}{An object of class \code{'eRm'}.} \item{type}{A string denoting the type of information to be plotted. Currently supports \code{"category"}, \code{"item"}, \code{"test"}, \code{"scale"} and \code{"both"} (which gives item and scale information; default).} \item{theta}{Supporting or sampling points on the latent trait.} \item{legpos}{Defines the positioning of the legend, as in \code{\link[eRm]{plotICC}}.} \item{...}{% Further arguments. \code{xlab} sets the label of the \eqn{x}{x} axis. \code{ylabI} and \code{ylabT} control the labeling of the item or test information plot. \code{mainI} and \code{mainT} set the titles for item/test information plots. } } \references{Samejima, F. (1969) Estimation of latent ability using a response pattern of graded scores. \emph{Psychometric Monographs}, \bold{17}.} \author{Thomas Rusch} \seealso{The function to calculate the item or test information, \code{\link[eRm]{item_info}} and \code{\link[eRm]{test_info}}.} \examples{ res <- PCM(pcmdat) plotINFO(res) } eRm/man/RM.Rd0000755000175100001440000000610214375241641012404 0ustar hornikusers\encoding{UTF-8} \name{RM} \alias{RM} %- Also NEED an '\alias' for EACH other topic documented here. \title{Estimation of Rasch Models} \description{ This function computes the parameter estimates of a Rasch model for binary item responses by using CML estimation. } \usage{ RM(X, W, se = TRUE, sum0 = TRUE, etaStart) } \arguments{ \item{X}{Input 0/1 data matrix or data frame; rows represent individuals, columns represent items. Missing values are inserted as \code{NA}.} \item{W}{Design matrix for the Rasch model. If omitted, the function will compute W automatically.} \item{se}{If \code{TRUE}, the standard errors are computed.} \item{sum0}{If \code{TRUE}, the parameters are normed to sum-0 by specifying an appropriate \code{W}. If \code{FALSE}, the first parameter is restricted to 0.} \item{etaStart}{A vector of starting values for the eta parameters can be specified. If missing, the 0-vector is used.} } \details{ For estimating the item parameters the CML method is used. Available methods for RM-objects are:\cr \code{print}, \code{coef}, \code{model.matrix}, \code{vcov}, \code{summary}, \code{logLik}, \code{person.parameter}, \code{LRtest}, \code{Waldtest}, \code{plotICC}, \code{plotjointICC}. } \value{ Returns an object of class \code{dRm, Rm, eRm} and contains the log-likelihood value, the parameter estimates and their standard errors. \item{loglik}{Conditional log-likelihood.} \item{iter}{Number of iterations.} \item{npar}{Number of parameters.} \item{convergence}{See \code{code} output in \code{\link{nlm}}.} \item{etapar}{Estimated basic item difficulty parameters.} \item{se.eta}{Standard errors of the estimated basic item parameters.} \item{betapar}{Estimated item (easiness) parameters.} \item{se.beta}{Standard errors of item parameters.} \item{hessian}{Hessian matrix if \code{se = TRUE}.} \item{W}{Design matrix.} \item{X}{Data matrix.} \item{X01}{Dichotomized data matrix.} \item{call}{The matched call.} } \references{ Fischer, G. H., and Molenaar, I. (1995). Rasch Models - Foundations, Recent Developements, and Applications. Springer. Mair, P., and Hatzinger, R. (2007). Extended Rasch modeling: The \pkg{eRm} package for the application of IRT models in R. Journal of Statistical Software, 20(9), 1-20. Mair, P., and Hatzinger, R. (2007). CML based estimation of extended Rasch models with the \pkg{eRm} package in R. Psychology Science, 49, 26-43. } \author{Patrick Mair, Reinhold Hatzinger} %\note{} \seealso{\code{\link{RSM}},\code{\link{PCM}}, \code{\link{LRtest}}, \code{\link{Waldtest}} } \examples{ # Rasch model with beta.1 restricted to 0 res <- RM(raschdat1, sum0 = FALSE) res summary(res) res$W #generated design matrix # Rasch model with sum-0 beta restriction; no standard errors computed res <- RM(raschdat1, se = FALSE, sum0 = TRUE) res summary(res) res$W #generated design matrix #Rasch model with missing values res <- RM(raschdat2) res summary(res) } \keyword{models} eRm/man/anova.eRm.Rd0000755000175100001440000000443414375241641013722 0ustar hornikusers\encoding{UTF-8} \name{Analysis of Deviances} \alias{anova.eRm} \alias{print.eRm_anova} \title{Analysis of Deviances for Rasch Models} \description{Performs likelihood ratio tests against the model with the largest number of parameters.} \usage{\method{anova}{eRm}(object, \dots) \method{print}{eRm_anova}(x, \dots)} \arguments{ \item{object}{ Gives the first object to be tested against others which follow, separated by commata. } \item{x}{ An object of class \code{"eRm_anova"}. } \item{\dots}{ Further models to test with \code{anova.eRm()}. } } \details{ The \code{anova} method is quite flexible and, as long the used data are identical, every model except the \acronym{LLRA} can be tested against each other. Regardless of the order that models are specified, they will always be sorted by the number of parameters in decreasing order. If \eqn{\geq3}{>= 3} models are passed to the method, all models will be tested against the first model (i.e., the one with the largest amount of parameters). } \value{ \code{anova.eRm} returns a list object of class \code{eRm_anova} containing: \item{calls}{function calls of the different models (character).} \item{statistics}{the analysis of deviances table (columns are \code{LLs}: conditional log-likelihoods, \code{dev}: deviances, \code{npar}: number of parameters, \code{LR}: likelihood ratio statistics, \code{df}: degrees of freedom, \code{p}: \eqn{p}{p}-values).} } \section{Warning}{Although, there is a check for identical data matrices used, the models have to be nested for the likelihood ratio test to work. You have to ensure that this is the case, otherwise results will be invalid. \acronym{LLRA}s cannot be tested with other models (\acronym{RM}, \acronym{LLTM}, \acronym{RSM}, \ldots); for more information see \code{\link{anova.llra}}.} %\references{xxx} \author{Marco J. Maier} \seealso{\code{\link{anova.llra}}, \code{\link{anova}}} \examples{ ### dichotomous data dmod1 <- RM(lltmdat1) dmod2 <- LLTM(lltmdat1, mpoints = 2) anova(dmod1, dmod2) ### polytomous data pmod1 <- RSM(rsmdat) pmod2 <- PCM(rsmdat) anova(pmod1, pmod2) W <- cbind(rep(c(1,0), each=9), rep(c(0,1), each=9)) W pmod3 <- LPCM(rsmdat, W) anova(pmod3, pmod1, pmod2) # note that models are sorted by npar } eRm/man/llraDat2.Rd0000755000175100001440000000422414375241641013536 0ustar hornikusers\encoding{UTF-8} \name{llraDat2} \alias{llraDat2} \docType{data} \title{An Artificial LLRA Data Set} \description{Artificial data set of 70 subjects with 5 items, 4 time points and 3 groups for LLRA.} \usage{llraDat2} \format{ A data frame with 70 observations of 21 variables. \describe{ \item{\code{t1.I1}}{Answers to item 1 at time point 1} \item{\code{t1.I2}}{Answers to item 2 at time point 1} \item{\code{t1.I3}}{Answers to item 3 at time point 1} \item{\code{t1.I4}}{Answers to item 4 at time point 1} \item{\code{t1.I5}}{Answers to item 5 at time point 1} \item{\code{t2.I1}}{Answers to item 1 at time point 2} \item{\code{t2.I2}}{Answers to item 2 at time point 2} \item{\code{t2.I3}}{Answers to item 3 at time point 2} \item{\code{t2.I4}}{Answers to item 4 at time point 2} \item{\code{t2.I5}}{Answers to item 5 at time point 2} \item{\code{t3.I1}}{Answers to item 1 at time point 3} \item{\code{t3.I2}}{Answers to item 2 at time point 3} \item{\code{t3.I3}}{Answers to item 3 at time point 3} \item{\code{t3.I4}}{Answers to item 4 at time point 3} \item{\code{t3.I5}}{Answers to item 5 at time point 3} \item{\code{t4.I1}}{Answers to item 1 at time point 4} \item{\code{t4.I2}}{Answers to item 2 at time point 4} \item{\code{t4.I3}}{Answers to item 3 at time point 4} \item{\code{t4.I4}}{Answers to item 4 at time point 4} \item{\code{t4.I5}}{Answers to item 5 at time point 4} \item{\code{group}}{The group membership} } } \details{ This is a data set as described in Hatzinger and Rusch (2009). 5 items were measured at 4 time points (in columns). Each persons answers to the items are recorded in the rows. There are 2 treatment groups and a control group. Treatment group 2 has size, 10, treatment group 1 has size 20 and the control group has size 40. Item 1 is dichotomous, all others are polytomous. Item 2, 3, 4 and 5 have 3, 4, 5, 6 categories respectively. } \references{ Hatzinger, R. and Rusch, T. (2009) IRT models with relaxed assumptions in eRm: A manual-like instruction. \emph{Psychology Science Quarterly}, \bold{51}, pp. 87--120. } \examples{ llraDat2 } \keyword{datasets} eRm/man/rsampler.Rd0000755000175100001440000000525414375241641013722 0ustar hornikusers\encoding{UTF-8} \name{rsampler} \alias{rsampler} \title{Sampling Binary Matrices} \description{% The function implements an \acronym{MCMC} algorithm for sampling of binary matrices with fixed margins complying to the Rasch model. Its stationary distribution is uniform. The algorithm also allows for square matrices with fixed diagonal. } \usage{ rsampler(inpmat, controls = rsctrl()) } \arguments{ \item{inpmat}{A binary (data) matrix with \eqn{n}{n} rows and \eqn{k}{k} columns.} \item{controls}{An object of class \code{\link{RSctr}}. If not specified, the default parameters as returned by function \code{\link{rsctrl}} are used.} } \details{ \code{rsampler} is a wrapper function for a Fortran routine to generate binary random matrices based on an input matrix. On output the generated binary matrices are integer encoded. For further processing of the generated matrices use the function \code{\link{rstats}}. } \value{ A list of class \code{\link{RSmpl}} with components \item{n}{number of rows of the input matrix} \item{k}{number of columns of the input matrix} \item{inpmat}{the input matrix} \item{tfixed}{\code{TRUE}, if diagonals of \code{inpmat} are fixed} \item{burn_in}{length of the burn in process} \item{n_eff}{number of generated matrices (effective matrices)} \item{step}{controls the number number of void matrices generated in the the burn in process and when effective matrices are generated (see note in \code{\link{rsctrl}}). } \item{seed}{starting value for the random number generator} \item{n_tot}{number of matrices in \code{outvec}, \code{n_tot = n_eff + 1}} \item{outvec}{vector of encoded random matrices} \item{ier}{error code} } \references{% Verhelst, N. D. (2008). An Efficient \acronym{MCMC} Algorithm to Sample Binary Matrices with Fixed Marginals. \emph{Psychometrika, 73} (4)% } \author{Reinhold Hatzinger, Norman Verhelst} \note{% An element of \code{outvec} is a four byte (or 32 bits) integer. The matrices to be output are stored bitwise (some bits are unused, since a integer is used for every row of a matrix). So the number of integers per row needed equals \eqn{(k+31)/32}{(k+31)/32} (integer division), which is one to four in the present implementation since the number of columns and rows must not exceed 128 and 4096, respectively. The summary method (\code{\link{summary.RSmpl}}) prints information on the content of the output object. } \seealso{\code{\link{rsctrl}}, \code{\link{rstats}} } \examples{ data(xmpl) ctr<-rsctrl(burn_in=10, n_eff=5, step=10, seed=0, tfixed=FALSE) res<-rsampler(xmpl,ctr) summary(res) } \keyword{misc} eRm/man/rsctrl.Rd0000755000175100001440000000655414375241641013412 0ustar hornikusers\encoding{UTF-8} \name{rsctrl} \alias{rsctrl} \title{Controls for the Sampling Function} \description{ Various parameters that control aspects of the random generation of binary matrices. } \usage{ rsctrl(burn_in = 100, n_eff = 100, step = 16, seed = 0, tfixed = FALSE) } \arguments{ \item{burn_in}{ the number of sampled matrices to come close to a stationary distribution. The default is \code{burn_in = 100}. (The actual number is \code{2 * burn_in * step}.) } \item{n_eff}{ the number of effective matrices, i.e., the number of matrices to be generated by the sampling function \code{\link{rsampler}}. \code{n_eff} must be positive and not larger than 8191 (\eqn{2^{13}-1}{(2^13) - 1}). The default is \code{n_eff = 100}. } \item{step}{controls the number number of void matrices generated in the the burn in process and when effective matrices are generated (see note below). The default is \code{step = 16}. } \item{seed}{ is the indicator for the seed of the random number generator. Its value must be in the range 0 and 2147483646 (2**31-2). If the value of seed equals zero, a seed is generated by the sampling function \code{\link{rsampler}} (dependent on the system's clock) and its value is returned in the output. If seed is not equal to zero, its value is used as the seed of the random number generator. In that case its value is unaltered at output. The default is \code{seed = 0}. } \item{tfixed}{logical, -- specifies if in case of a quadratic input matrix the diagonal is considered fixed (see note below). The default is \code{tfixed = FALSE}. } } \value{ A list of class \code{RSctr} with components \code{burn_in}, \code{n_eff}, \code{step}, \code{seed}, \code{tfixed}., } \note{ If one of the components is incorrectly specified the error function \code{rserror} is called and some informations are printed. The ouput object will not be defined.\cr\cr The specification of \code{step} controls the sampling algorithm as follows: If , e.g., \code{burn_in = 10}, \code{n_eff = 5}, and \code{step = 2}, then during the burn in period \code{step * burn_in = 2 * 10} matrices are generated. After that, \code{n_eff * step = 5 * 2} matrices are generated and every second matrix of these last ten is returned from \code{link{rsampler}}.\cr\cr \code{tfixed} has no effect if the input matrix is not quadratic, i.e., all matrix elements are considered free (unrestricted). If the input matrix is quadratic, and \code{tfixed = TRUE}, the main diagonal of the matrix is considered as fixed. On return from \code{link{rsampler}} all diagonal elements of the generated matrices are set to zero. This specification applies, e.g., to analyzing square incidence matrices representing binary asymmetric relation in social network theory.\cr\cr The summary method (\code{\link{summary.RSctr}}) prints the current definitions. \cr } \seealso{\code{\link{rsampler}} } \examples{ ctr <- rsctrl(n_eff = 1, seed = 987654321) # specify new controls summary(ctr) \dontrun{ # incorrect specifications will lead to an error ctr2 <- rsctrl(step = -3, n_eff = 10000)} } \keyword{misc} eRm/man/llradat3.Rd0000755000175100001440000000170614375241641013601 0ustar hornikusers\encoding{UTF-8} \name{llradat3} \alias{llradat3} \docType{data} \title{An Artificial LLRA Data Set} \description{ Artificial data set of 3 items, 2 time points and 2 groups for LLRA. It is example 6 from Hatzinger and Rusch (2009). } \usage{llradat3} \format{ A data frame with 60 observations of 6 variables. \describe{ \item{\code{V1}}{Answers to item 1 at time point 1} \item{\code{V2}}{Answers to item 2 at time point 1} \item{\code{V3}}{Answers to item 3 at time point 1} \item{\code{V4}}{Answers to item 1 at time point 2} \item{\code{V5}}{Answers to item 2 at time point 2} \item{\code{V6}}{Answers to item 3 at time point 2} } } \details{ This is a data set as described in Hatzinger and Rusch (2009). } \references{ Hatzinger, R. and Rusch, T. (2009) IRT models with relaxed assumptions in eRm: A manual-like instruction. \emph{Psychology Science Quarterly}, \bold{51}, pp. 87--120. } \examples{ llradat3 } \keyword{datasets} eRm/man/print.eRm.Rd0000755000175100001440000000426514375241641013754 0ustar hornikusers\encoding{UTF-8} \name{print.eRm} \alias{print.eRm} \alias{summary.eRm} \alias{vcov.eRm} \alias{model.matrix.eRm} \alias{coef.eRm} \alias{logLik.eRm} \alias{confint.eRm} %- Also NEED an '\alias' for EACH other topic documented here. \title{Methods for extended Rasch models} \description{Several methods for objects of class \code{'eRm'}.} \usage{ \method{print}{eRm}(x, ...) \method{summary}{eRm}(object, ...) \method{coef}{eRm}(object, parm="beta", ...) \method{model.matrix}{eRm}(object, ...) \method{vcov}{eRm}(object, ...) \method{logLik}{eRm}(object, ...) \method{confint}{eRm}(object, parm = "beta", level = 0.95, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{Object of class \code{eRm}.} \item{object}{Object of class \code{eRm}.} \item{parm}{Either \code{"eta"} or \code{"beta"}.} \item{level}{Alpha-level.} \item{...}{Further arguments to be passed to or from other methods. They are ignored in this function.} } \details{ The \code{print} method displays the value of the log-likelihood, parameter estimates (basic parameters eta) and their standard errors. For RM, RSM, and PCM models, the etas are difficulty parameters, for the LLTM, LRSM, LPCM the sign of the parameters depend on the design matrix and are easiness effects by default. The \code{summary} method additionally gives the full set of item parameters beta as easiness parameters for all models. Print methods are also available for the functions \code{logLik} and \code{confint} (see below). } \value{ The methods below are extractor functions and return various quantities: \code{vcov} returns the variance-covariance matrix of the parameter estimates, \code{coef} a vector of estimates of the eta or beta basic parameters, \code{model.matrix} the design matrix, \code{logLik} an object with elements \code{loglik} and \code{df} containing the log-likelihood value and df. \code{confint} a matrix of confidence interval values for eta or beta. } \author{Patrick Mair, Reinhold Hatzinger} \examples{ res <- RM(raschdat1) res summary(res) coef(res) vcov(res) model.matrix(res) logLik(res) } \keyword{models} eRm/man/plotPImap.Rd0000755000175100001440000000615014375241641013776 0ustar hornikusers\encoding{UTF-8} \name{plotPImap} \alias{plotPImap} %- Also NEED an '\alias' for EACH other topic documented here. \title{Person-Item Map} \description{ A person-item map displays the location of item (and threshold) parameters as well as the distribution of person parameters.along the latent dimension. Person-item maps are useful to compare the range and position of the item measure distribution (lower panel) to the range and position of the person measure distribution (upper panel). Items should ideally be located along the whole scale to meaningfully measure the `ability' of all persons. } \usage{ plotPImap(object, item.subset = "all", sorted = FALSE, main = "Person-Item Map", latdim = "Latent Dimension", pplabel = "Person\nParameter\nDistribution", cex.gen = 0.7, xrange = NULL, warn.ord = TRUE, warn.ord.colour = "black", irug = TRUE, pp = NULL) } \arguments{ \item{object}{Object of class \code{Rm} or \code{dRm}} \item{item.subset}{Subset of items to be plotted. Either a numeric vector indicating the column in \code{X} or a character vector indicating the column name. If \code{"all"}, all items are plotted. The number of items to be plotted must be > 1.} \item{sorted}{ If \code{TRUE}, the items are sorted in increasing order according to their location on the latent dimension.} \item{main}{Main title of the plot.} \item{latdim}{Label of the x-axis, i.e., the latent dimension.} \item{pplabel}{Title for the upper panel displaying the person parameter distribution} \item{cex.gen}{\code{cex} as a graphical parameter specifies a numerical value giving the amount by which plotting text and symbols should be magnified relative to the default. Here \code{cex.gen} applies to all text labels. The default is 0.7.} \item{xrange}{Range for the x-axis} \item{warn.ord}{If \code{TRUE} (the default) asterisks are displayed in the right margin of the lower panel to indicate nonordinal threshold locations for polytomous items.} \item{warn.ord.colour}{Nonordinal threshold locations for polytomous items are coloured with this colour to make them more visible. This is especially useful when there are many items so that the plot is quite dense. The default is \code{"black"}, so that there is no distinction made.} \item{irug}{If \code{TRUE} (the default), all thresholds are plotted below the person distribution to indicate where the included items are most informative.} \item{pp}{If non-\code{NULL}, this contains the \code{person.parameter} data of the data object, avoiding the need to recalculate it.} } \details{ Item locations are displayed with bullets, threshold locations with circles. } %\value{} \references{Bond, T.G., and Fox Ch.M. (2007) Applying the Rasch Model. Fundamental Measurement in the Human Sciences. 2nd Edition. Lawrence Erlbaum Associates. } \author{Patrick Mair, Reinhold Hatzinger, patches from Julian Gilbey and Marco J. Maier} %\note{} %\seealso{} \examples{ res <- PCM(pcmdat) plotPImap(res, sorted=TRUE) } \keyword{models} eRm/man/LRtest.Rd0000755000175100001440000002333714375241641013314 0ustar hornikusers\encoding{UTF-8} \name{LRtest} \alias{LRtest.Rm} \alias{LRtest} \alias{print.LR} \alias{summary.LR} \alias{plotGOF} \alias{plotGOF.LR} \title{Computation of Andersen's LR-test.} \description{This LR-test is based on subject subgroup splitting.} \usage{\method{LRtest}{Rm}(object, splitcr = "median", se = TRUE) \method{plotGOF}{LR}(x, beta.subset = "all", main = "Graphical Model Check", xlab, ylab, tlab = "item", xlim, ylim, type = "p", pos = 4, conf = NULL, ctrline = NULL, smooline = NULL, asp = 1, x_axis = TRUE, y_axis = TRUE, set_par = TRUE, reset_par = TRUE, \dots)} \arguments{ \item{object}{Object of class \code{"Rm"}.} \item{splitcr}{Split criterion for subject raw score splitting. \code{"all.r"} corresponds to a full raw score split, \code{"median"} uses the median as split criterion, \code{"mean"} performs a mean split. Optionally \code{splitcr} can also be a vector which assigns each person to a certain subgroup (e.g., following an external criterion). This vector can be numeric, character or a factor.} \item{se}{controls computation of standard errors in the submodels (default: \code{TRUE}).} \item{x}{Object of class \code{"LR"}. Also used for visualizing the fit of single items.} \item{beta.subset}{If \code{"all"}, all items are plotted. Otherwise numeric subset vector can be specified.} \item{main}{Title of the plot.} \item{xlab}{Label on \eqn{x}{x}-axis, default gives name of \code{splitcr} and level.} \item{ylab}{Label on \eqn{y}{y}-axis, default gives name of \code{splitcr} and level.} \item{tlab}{Specification of item labels: \code{"item"} prints the item names, \code{"number"} gives integers corresponding to order of the beta parameters, if \code{"none"} no labels are printed. \code{"identify"} allows for an interactive labelling. Initially no labels are printed, after clicking close to an item point the corresponding label is added. The identification process is terminated by clicking the second button and selecting 'Stop' from the menu, or from the 'Stop' menu on the graphics window. For more information and basic operation see \code{\link{identify}}.} \item{xlim}{Limits on \eqn{x}{x}-axis.} \item{ylim}{Limits on \eqn{y}{y}-axis.} \item{type}{Plotting type (see \code{\link[graphics]{plot}}).} \item{pos}{Position of the item label (see \code{\link[graphics]{text}}).} \item{conf}{for plotting confidence ellipses for the item parameters. If \code{conf = NULL} (the default) no ellipses are drawn. Otherwise, \code{conf} must be specified as a list with optional elements: \code{gamma}, is the confidence level (numeric), \code{col} and \code{lty}, color and linetype (see \code{\link[graphics:par]{par}}), \code{which} (numeric index vector) specifying for which items ellipses are drawn (must be a subset of \code{beta.subset}), and \code{ia}, logical, if the ellipses are to be drawn interactively (cf., \code{tlab = "identify"} above). For details about the default behavior, if \code{conf} is specified as a an empty list, see Details and Examples below. To use \code{conf}, the LR object \code{x} has to be generated using the option \code{se = TRUE} in \code{LRtest()}. For specification of \code{col} and \code{which} see Details and Examples below.} \item{ctrline}{for plotting confidence bands (control lines, cf. eg. Wright and Stone, 1999). If \code{ctrline = NULL} (the default) no lines are drawn. Otherwise, \code{ctrline} must be specified as a list with optional elements: \code{gamma}, is the confidence level (numeric), \code{col} and \code{lty}, color and linetype (see \code{\link[graphics:par]{par}}). If \code{ctrline} is specified as \code{ctrline = list()}, the default values \code{conf = list(gamma = 0.95, col = "blue", lty = "solid")} will be used. See examples below. To use \code{ctrline}, the LR object \code{x} has to be generated using the option \code{se = TRUE} in \code{LRtest()}.} \item{smooline}{spline smoothed confidence bands; must be specified as a list with optional elements: \code{gamma}, is the confidence level (numeric), \code{col} and \code{lty}, color and linetype, \code{spar} as smoothing parameter (see \code{\link{smooth.spline}}).} \item{asp}{sets the \eqn{y/x}{y/x} ratio of the plot (see \code{\link[graphics]{plot.window}}).} \item{x_axis}{if \code{TRUE}, the \eqn{x}{x}-axis will be plotted.} \item{y_axis}{if \code{TRUE}, the \eqn{y}{y}-axis will be plotted.} \item{set_par}{if \code{TRUE}, graphical parameters will be set by the function to optimize the plot's appearance. Unless \code{reset_par = FALSE}, these will be reset to the previous \code{\link[graphics:par]{par}} settings.} \item{reset_par}{if \code{TRUE}, graphical parameters will be reset to defaults via \code{\link[graphics:par]{par}()} after plotting (only if \code{set_par = TRUE}). To make adjustments \emph{after} using \code{plotGOF}, this reset can be switched off. Note that the changed graphical parameters will remain in place unless they are redefined (using \code{\link[graphics:par]{par}()}) or the device is closed.} \item{...}{additional parameters.} } \details{ If the data set contains missing values and \code{mean} or \code{median} is specified as split criterion, means or medians are calculated for each missing value subgroup and consequently used for raw score splitting. When using interactive selection for both labelling of single points (\code{tlab = "identify"} and drawing confidence ellipses at certain points (\code{ia = TRUE}) then first all plotted points are labelled and afterwards all ellipses are generated. Both identification processes can be terminated by clicking the second (right) mouse button and selecting `Stop' from the menu, or from the `Stop' menu on the graphics window. Using the specification \code{which} in allows for selectively drawing ellipses for certain items only, e.g., \code{which = 1:3} draws ellipses for items 1 to 3 (as long as they are included in \code{beta.subset}). The default is drawing ellipses for all items. The element \code{col} in the \code{conf} list can either be a single color specification such as \code{"blue"} or a vector with color specifications for all items. The length must be the same as the number of ellipses to be drawn. For color specification a palette can be set up using standard palettes (e.g., \code{\link{rainbow}}) or palettes from the \code{colorspace} or \code{RColorBrewer} package. An example is given below. \code{summary} and \code{print} methods are available for objects of class \code{LR}. } \value{ \code{LRtest} returns an object of class \code{LR} containing: \item{LR}{LR-value.} \item{df}{Degrees of freedom of the test statistic.} \item{Chisq}{Chi-square value with corresponding df.} \item{pvalue}{P-value of the test.} \item{likgroup}{Log-likelihood values for the subgroups} \item{betalist}{List of beta parameters for the subgroups.} \item{selist}{List of standard errors of beta's.} \item{etalist}{List of eta parameters for the subgroups.} \item{spl.gr}{Names and levels for \code{splitcr}.} \item{call}{The matched call.} \item{fitobj}{List containing model objects from subgroup fit.} } \references{ Fischer, G. H., and Molenaar, I. (1995). Rasch Models - Foundations, Recent Developements, and Applications. Springer. Mair, P., and Hatzinger, R. (2007). Extended Rasch modeling: The \pkg{eRm} package for the application of IRT models in R. Journal of Statistical Software, 20(9), 1-20. Mair, P., and Hatzinger, R. (2007). CML based estimation of extended Rasch models with the \pkg{eRm} package in R. Psychology Science, 49, 26-43. Wright, B.D., and Stone, M.H. (1999). Measurement essentials. Wide Range Inc., Wilmington. (\url{https://www.rasch.org/measess/me-all.pdf} 28Mb). } \author{Patrick Mair, Reinhold Hatzinger, Marco J. Maier, Adrian Bruegger} \seealso{\code{\link{Waldtest}}, \code{\link{MLoef}}} \examples{ # the object used is the result of running ... RM(raschdat1) res <- raschdat1_RM_fitted # see ? raschdat1_RM_fitted # LR-test on dichotomous Rasch model with user-defined split splitvec <- sample(1:2, 100, replace = TRUE) lrres <- LRtest(res, splitcr = splitvec) lrres summary(lrres) \dontrun{ # goodness-of-fit plot with interactive labelling of items w/o standard errors plotGOF(lrres, tlab = "identify")} # LR-test with a full raw-score split X <- sim.rasch(1000, -2:2, seed = 5) res2 <- RM(X) full_lrt <- LRtest(res2, splitcr = "all.r") full_lrt \dontrun{ # LR-test with mean split, standard errors for beta's lrres2 <- LRtest(res, split = "mean")} # to save computation time, the results are loaded from raschdat1_RM_lrres2 lrres2 <- raschdat1_RM_lrres2 # see ?raschdat1_RM_lrres2 # goodness-of-fit plot # additional 95 percent control line with user specified style plotGOF(lrres2, ctrline = list(gamma = 0.95, col = "red", lty = "dashed")) # goodness-of-fit plot for items 1, 14, 24, and 25 # additional 95 percent confidence ellipses, default style plotGOF(lrres2, beta.subset = c(14, 25, 24, 1), conf = list()) \dontrun{ # goodness-of-fit plot for items 1, 14, 24, and 25 # for items 1 and 24 additional 95 percent confidence ellipses # using colors for these 2 items from the colorspace package library("colorspace") my_colors <- rainbow_hcl(2) plotGOF(lrres2, beta.subset = c(14, 25, 24, 1), conf = list(which = c(1, 14), col = my_colors))} # first, save current graphical parameters in an object old_par <- par(mfrow = c(1, 2), no.readonly = TRUE) # plots plotGOF(lrres2, ctrline = list(gamma = 0.95, col = "red", lty = "dashed"), xlim = c(-3, 3), x_axis = FALSE, set_par = FALSE) axis(1, seq(-3, 3, .5)) plotGOF(lrres2, conf = list(), xlim = c(-3, 3), x_axis = FALSE, set_par = FALSE) axis(1, seq(-3, 3, .5)) text(-2, 2, labels = "Annotation") # reset graphical parameters par(old_par) } \keyword{models} eRm/man/summary.llra.Rd0000755000175100001440000000355014375241641014520 0ustar hornikusers\encoding{UTF-8} \name{summary.llra} \alias{summary.llra} \alias{print.summary.llra} \title{Summarizing Linear Logistic Models with Relaxed Assumptions (LLRA) } \description{ \code{summary} method for class \code{"llra"} } \usage{ \method{summary}{llra}(object, level, ...) \method{print}{summary.llra}(x, ...) } \arguments{ \item{object}{an object of class "llra", typically result of a call to \code{\link{LLRA}}. } \item{x}{an object of class "summary.llra", usually, a result of a call to \code{summary.llra}. } \item{level}{The level of confidence for the confidence intervals. Default is 0.95.} \item{\dots}{further arguments passed to or from other methods. } } \details{ Objects of class \code{"summary.llra"} contain all parameters of interest plus the confidence intervals. \code{print.summary.llra} rounds the values to 3 digits and displays them nicely. } \value{ The function \code{summary.lllra} computes and returns a list of summary statistics of the fitted LLRA given in object, reusing the components (list elements) \code{call}, \code{etapar}, \code{iter}, \code{loglik}, \code{model}, \code{npar} and \code{se.etapar} from its argument, plus \item{ci}{The upper and lower confidence interval borders.} } \author{Thomas Rusch} \seealso{ The model fitting function \code{\link{LLRA}}. } \examples{ ##Example 6 from Hatzinger & Rusch (2009) groups <- c(rep("TG",30),rep("CG",30)) llra1 <- LLRA(llradat3,mpoints=2,groups=groups) summary(llra1) \dontrun{ ##An LLRA with 2 treatment groups and 1 baseline group, 5 items and 4 ##time points. Item 1 is dichotomous, all others have 3, 4, 5, 6 ##categories respectively. ex2 <- LLRA(llraDat2[1:20],mpoints=4,llraDat2[21]) sumEx2 <- summary(ex2, level=0.95) #print a summary sumEx2 #get confidence intervals sumEx2$ci} } eRm/man/rstats.Rd0000755000175100001440000000462014375241641013411 0ustar hornikusers\encoding{UTF-8} \name{rstats} \alias{rstats} \title{Calculating Statistics for the Sampled Matrices} \description{ This function is used to calculate user defined statistics for the (original and) sampled matrices. A user defined function has to be provided. } \usage{ rstats(RSobj, userfunc, ...) } \arguments{ \item{RSobj}{object as obtained from using \code{\link{rsampler}} or \code{\link{rsextrobj}} } \item{userfunc}{a user defined function which performs operations on the (original and) sampled matrices. The first argument in the definition of the user function must be an object of type matrix.} \item{...}{further arguments, that are passed to the user function} } \value{ A list of objects as specified in the user supplied function } \note{The encoded matrices that are contained in the input object \code{RSobj} are decoded and passed to the user function in turn. If \code{RSobj} is not an object obtained from either \code{\link{rsampler}} or \code{\link{rsextrobj}} or no user function is specified an error message is printed. A simple user function, \code{\link{phi.range}}, is included in the RaschSampler package for demonstration purposes.\cr \code{rstats} can be used to obtain the 0/1 values for any of the sampled matrices (see second example below). Please note, that the output from the user function is stored in a list where the number of components corresponds to the number of matrices passed to the user function (see third example). } \seealso{\code{\link{rsampler}}, \code{\link{rsextrobj}} } \examples{ ctr <- rsctrl(burn_in = 10, n_eff = 5, step=10, seed = 12345678, tfixed = FALSE) mat <- matrix(sample(c(0,1), 50, replace = TRUE), nr = 10) rso <- rsampler(mat, ctr) rso_st <- rstats(rso,phi.range) unlist(rso_st) # extract the third generated matrix # (here, the first is the input matrix) # and decode it into rsmat rso2 <- rsextrobj(rso,4,4) summary(rso2) rsmat <- rstats(rso2, function(x) matrix(x, nr = rso2$n)) print(rsmat[[1]]) # extract only the first r rows of the third generated matrix mat<-function(x, nr = nr, r = 3){ m <- matrix(x, nr = nr) m[1:r,] } rsmat2 <- rstats(rso2, mat, nr=rso$n, r = 3) print(rsmat2[[1]]) # apply a user function to the decoded object print(phi.range(rsmat[[1]])) } \keyword{misc} eRm/man/itemfit.ppar.Rd0000755000175100001440000000734714375241641014504 0ustar hornikusers\encoding{UTF-8} \name{itemfit.ppar} \alias{itemfit.ppar} \alias{itemfit} \alias{personfit.ppar} \alias{personfit} \alias{residuals.ppar} \alias{pmat.ppar} \alias{pmat} \alias{print.ifit} \alias{print.pfit} \alias{print.resid} %- Also NEED an '\alias' for EACH other topic documented here. \title{Residuals, Personfit and Itemfit Statistics} \description{\code{pmat} computes the theoretical person-item matrix with solving probabilities for each category (except 0th). \code{residuals} computes the squared and standardized residuals based on the observed and the expected person-item matrix. Chi-square based itemfit and personfit statistics can be obtained by using \code{itemfit} and \code{personfit}. Corrected item-test correlations in \code{itemfit} are computed using the approach from Cureton (1966). } \usage{ \method{pmat}{ppar}(object) \method{residuals}{ppar}(object,...) \method{itemfit}{ppar}(object) \method{personfit}{ppar}(object) \method{print}{ifit}(x, visible = TRUE, sort_by = c("none", "p", "outfit_MSQ", "infit_MSQ", "outfit_t", "infit_t", "discrim"), decreasing = FALSE, digits = 3,...) \method{print}{pfit}(x, visible = TRUE, ...) \method{print}{resid}(x, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{Object of class \code{ppar}, derived from \code{person.parameter}.} \item{x}{Object of class \code{ifit}, \code{pfit}, or \code{resid}.} \item{visible}{If \code{FALSE}, returns the matrix of fit statistics that otherwise would be printed.} \item{sort_by}{Optionally the itemfit output can be sorted by one of these criteria.} \item{decreasing}{If \code{sort_by} is set, whether the output should be sorted in increasing or decreasing order.} \item{digits}{How many digits should be printed.} \item{...}{Further arguments passed to or from other methods. They are ignored in this function.} } %\details{} \value{ %Function \code{pmat}: \item{pmat}{Matrix of theoretical probabilities for each category except 0th (from function \code{pmat}).} %Function \code{itemfit} returns a list of class \code{ifit} with components: \item{i.fit}{Chi-squared itemfit statistics (from function \code{itemfit}).} \item{i.df}{Degrees of freedom for itemfit statistics (from function \code{itemfit}).} \item{st.res}{Standardized residuals (from function \code{itemfit}).} \item{i.outfitMSQ}{Outfit mean-square statistics (from function \code{itemfit}).} \item{i.infitMSQ}{Infit mean-square statistics (from function \code{itemfit}).} \item{i.disc}{Corrected item-test correlations (from function \code{itemfit}).} %Function \code{personfit} returns a list of class \code{pfit} with components: \item{p.fit}{Chi-squared personfit statistics (from function \code{personfit}).} \item{p.df}{Degrees of freedom for personfit statistics (from function \code{personfit}).} \item{st.res}{Standardized residuals (from function \code{personfit}).} \item{p.outfitMSQ}{Outfit mean-square statistics (from function \code{personfit}).} \item{p.infitMSQ}{Infit mean-square statistics (from function \code{personfit}).} } \references{ Smith Jr., E. V., and Smith, R. M. (2004). Introduction to Rasch Measurement. JAM press. Wright, B.D., and Masters, G.N. Computation of OUTFIT and INFIT Statistics. Rasch Measurement Transactions, 1990, 3:4 p.84-85 Cureton, E. E. (1966). Corrected item-test correlations. Psychometrika, 31, 93-96 } \author{Patrick Mair, Reinhold Hatzinger, Moritz Heene} %\note{} \seealso{\code{\link{person.parameter}} } \examples{ # Rasch model, estimation of item and person parameters res <- RM(raschdat2) p.res <- person.parameter(res) # Matrix with expected probabilities and corresponding residuals pmat(p.res) residuals(p.res) #Itemfit itemfit(p.res) #Personfit personfit(p.res) } \keyword{models} eRm/man/NPtest.Rd0000755000175100001440000003033714375241641013312 0ustar hornikusers\encoding{UTF-8} \name{NonparametricTests} \alias{NonparametricTests} \alias{NPtest} \title{A Function to Perform Nonparametric Rasch Model Tests} \description{A variety of nonparametric tests as proposed by Ponocny (2001), Koller and Hatzinger (2012), and an \sQuote{exact} version of the Martin-Löf test are implemented. The function operates on random binary matrices that have been generated using an \acronym{MCMC} algorithm (Verhelst, 2008) from the \pkg{RaschSampler} package (Hatzinger, Mair, and Verhelst, 2009).% } \usage{NPtest(obj, n = NULL, method = "T1", \dots)} \arguments{ \item{obj}{ A binary data matrix (or data frame) or an object containing the output from the \pkg{\link[eRm:RaschSampler]{RaschSampler}} package. } \item{n}{ If \code{obj} is a matrix or a data frame, \code{n} is the number of sampled matrices (default is 500) } \item{method}{ One of the test statistics. See Details below. } \item{\dots}{ Further arguments according to \code{method}. See Details below. Additionally, the sampling routine can be controlled by specifying \code{burn_in}, \code{step}, and \code{seed} (for details see below and \code{\link[eRm:rsctrl]{rsctrl}}). A summary of the sampling object may be obtained using the option \code{RSinfo = TRUE}. } } \details{ The function uses the \pkg{\link[eRm:RaschSampler]{RaschSampler}} package, which is now packaged with \pkg{eRm} for convenience. It can, of course, still be accessed and downloaded separately via CRAN. As an input the user has to supply either a binary data matrix or a \pkg{RaschSampler} output object. If the input is a data matrix, the \pkg{RaschSampler} is called with default values (i.e., \code{rsctrl(burn_in = 256, n_eff = n, step = 32)}, see \code{\link[eRm:rsctrl]{rsctrl}}), where \code{n} corresponds to \code{n_eff} (the default number of sampled matrices is 500). By default, the starting values for the random number generators (\code{seed}) are chosen randomly using system time. Methods other than those listed below can easily be implemented using the \pkg{RaschSampler} package directly. The currently implemented methods (following Ponocny's notation of \eqn{T}{T}-statistics) and their options are: \describe{ \item{\eqn{T_1}{T_1}:}{\code{method = "T1"}\cr% Checks for local dependence via increased inter-item correlations. For all item pairs, cases are counted with equal responses on both items. } \item{\eqn{T_{1m}}{T_1m}:}{\code{method = "T1m"}\cr% Checks for multidimensionality via decreased inter-item correlations. For all item pairs, cases are counted with equal responses on both items. } \item{\eqn{T_{1l}}{T_1l}:}{\code{method = "T1l"}\cr% Checks for learning. For all item pairs, cases are counted with response pattern (1,1). } \item{\eqn{T_{md}}{T_md}:}{\code{method = "Tmd", idx1, idx2}\cr% \code{idx1} and \code{idx2} are vectors of indices specifying items which define two subscales, e.g., \code{idx1 = c(1, 5, 7)} and \code{idx2 = c(3, 4, 6)}\cr% Checks for multidimensionality based on correlations of person raw scores for the subscales. } \item{\eqn{T_2}{T_2}:}{\code{method = "T2", idx = NULL, stat = "var"}\cr% \code{idx} is a vector of indices specifying items which define a subscale, e.g., \code{idx = c(1, 5, 7)}\cr% \code{stat} defines the used statistic as a character object which can be: \code{"var"} (variance), \code{"mad1"} (mean absolute deviation), \code{"mad2"} (median absolute deviation), or \code{"range"} (range)\cr% Checks for local dependence within model deviating subscales via increased dispersion of subscale person rawscores. } \item{\eqn{T_{2m}}{T_2m}:}{\code{method = "T2m", idx = NULL, stat = "var"}\cr% \code{idx} is a vector of indices specifying items which define a subscale, e.g., \code{idx = c(1, 5, 7)}\cr% \code{stat} defines the used statistic as a character object which can be: \code{"var"} (variance), \code{"mad1"} (mean absolute deviation), \code{"mad2"} (median absolute deviation), \code{"range"} (range)\cr% Checks for multidimensionality within model deviating subscales via decreased dispersion of subscale person rawscores. } \item{\eqn{T_4}{T_4}:}{\code{method = "T4", idx = NULL, group = NULL, alternative = "high"}\cr% \code{idx} is a vector of indices specifying items which define a subscale, e.g., \code{idx = c(1, 5, 7)}\cr% \code{group} is a logical vector defining a subject group, e.g., \code{group = ((age >= 20) & (age < 30))}\cr% \code{alternative} specifies the alternative hypothesis and can be: \code{"high"} or \code{"low"}.\cr% Checks for group anomalies (\acronym{DIF}) via too high (low) raw scores on item(s) for specified group. } % removed in version 0.14-5 % \item{\bold{T7:}}{\code{method = "T7", idx = NULL}}\cr % \code{idx} \ldots vector of indices specifying items which define a subscale, e.g., \code{idx = c(1, 5, 7)}\cr % Checks for lower discrimination (2PL) in item subscale via counting cases with response 1 on more % difficult and 0 on easier items. The test is global for the subscale, i.e. all subscale items are evaluated % using a single statistic. % % \item{\bold{T7a:}}{\code{method = "T7a", idx = NULL}}\cr % \code{idx} \ldots vector of indices specifying items to investigate, e.g., \code{idx = c(1, 5, 7)}\cr % Checks for lower discrimination (2PL) of an item compared to another item via counting cases with response 1 on more % difficult and 0 on easier item. The test is performed pairwise, i.e. a statistic is calculated for each item pair. % # Examples % ##---- T7, T7a -------------------------------------------------- % # simultaenous test for all items in subscale % t7<-NPtest(rmat,method="T7",idx=1:3) % t7 % % # test for item-pairs % t7a<-NPtest(rmat,method="T7a",idx=c(1,3,5)) # test for item-pairs % t7a \item{\eqn{T_{10}}{T_10}:}{\code{method = "T10", splitcr = "median"}\cr% \code{splitcr} defines the split criterion for subject raw score splitting. \code{"median"} uses the median as split criterion, \code{"mean"} performs a mean-split. Optionally, \code{splitcr} can also be a vector which assigns each person to one of two subgroups (e.g., following an external criterion). This vector can be numeric, character, logical, or a factor.\cr% Global test for subgroup-invariance. Checks for different item difficulties in two subgroups (for details see Ponocny, 2001). } \item{\eqn{T_{11}}{T_11}:}{\code{method = "T11"}\cr% Global test for local dependence. The statistic calculates the sum of absolute deviations between the observed inter-item correlations and the expected correlations. } \item{\eqn{T_{pbis}}{T_pbis}:}{\code{method = "Tpbis", idxt, idxs}\cr Test for discrimination. The statistic calculates a point-biserial correlation for a test item (specified via \code{idxt}) with the person row scores for a subscale of the test sum (specified via \code{idxs}). If the correlation is too low, the test item shows different discrimination compared to the items of the subscale. } \item{\emph{Martin-Löf}}{% The \sQuote{exact} version of the \emph{Martin-Löf} statistic is specified via \code{method = "MLoef"} and optionally \code{splitcr} (see \code{\link{MLoef}}).% } % added in version 0.16-3 \item{\eqn{Q_{3h}}{Q_3h}:}{\code{method = "Q3h"}\cr% Checks for local dependence by detecting an increased correlation of inter-item residuals. Low p-values correspond to a high ("h") correlation between two items. } \item{\eqn{Q_{3l}}{Q_3l}:}{\code{method = "Q3l"}\cr% Checks for local dependence by detecting a decreased correlation of inter-item residuals. Low p-values correspond to a low ("l") correlation between two items. } } } \value{ Depending on the \code{method} argument, a list is returned which has one of the following classes: \code{'T1obj'}, \code{'T1mobj'}, \code{'T1lobj'}, \code{'Tmdobj'}, \code{'T2obj'}, \code{'T2mobj'}, \code{'T4obj'}, \code{'T10obj'}, \code{'T11obj'}, \code{'Tpbisobj'}, \code{'Q3hobj'} or \code{'Q3lobj'}. The main output element is \code{prop} giving the one-sided \eqn{p}{p}-value, i.e., the number of statistics from the sampled matrices which are equal or exceed the statistic based on the observed data. For \eqn{T_1}{T_1}, \eqn{T_{1m}}{T_1m}, and \eqn{T_{1l}}{T_1l}, \code{prop} is a vector. For the Martin-Löf test, the returned object is of class \code{'MLobj'}. Besides other elements, it contains a \code{prop} vector and \code{MLres}, the output object from the asymptotic Martin-Löf test on the input data. } \note{The \pkg{RaschSampler} package is no longer required to use \code{NPtest} since \pkg{eRm} version 0.15-0.} \references{% Ponocny, I. (2001). Nonparametric goodness-of-fit tests for the Rasch model. \emph{Psychometrika, 66}(3), 437--459. \doi{10.1007/BF02294444} Verhelst, N. D. (2008). An efficient \acronym{MCMC} algorithm to sample binary matrices with fixed marginals. \emph{Psychometrika, 73}(4), 705--728. \doi{10.1007/s11336-008-9062-3} Verhelst, N., Hatzinger, R., & Mair, P. (2007). The Rasch sampler. \emph{Journal of Statistical Software, 20}(4), 1--14. \url{https://www.jstatsoft.org/v20/i04} Koller, I., & Hatzinger, R. (2013). Nonparametric tests for the Rasch model: Explanation, development, and application of quasi-exact tests for small samples. \emph{Interstat, 11}, 1--16. \url{http://interstat.statjournals.net/YEAR/2013/abstracts/1311002.php} Koller, I., Maier, M. J., & Hatzinger, R. (2015). An Empirical Power Analysis of Quasi-Exact Tests for the Rasch Model: Measurement Invariance in Small Samples. \emph{Methodology, 11}(2), 45--54. \doi{10.1027/1614-2241/a000090} Debelak, R., & Koller, I. (2019). Testing the Local Independence Assumption of the Rasch Model With Q3-Based Nonparametric Model Tests. \emph{Applied Psychological Measurement} \doi{10.1177/0146621619835501} } \author{Reinhold Hatzinger} %\seealso{ % \code{\link{RaschSampler}} %} \examples{ ### Preparation: # data for examples below X <- as.matrix(raschdat1) # generate 100 random matrices based on original data matrix rmat <- rsampler(X, rsctrl(burn_in = 100, n_eff = 100, seed = 123)) ## the following examples can also directly be used by setting ## rmat <- as.matrix(raschdat1) ## without calling rsampler() first t1 <- NPtest(rmat, n = 100, method = "T1") ### Examples ################################################################### ###--- T1 ---------------------------------------------------------------------- t1 <- NPtest(rmat, method = "T1") # choose a different alpha for selecting displayed values print(t1, alpha = 0.01) ###--- T2 ---------------------------------------------------------------------- t21 <- NPtest(rmat, method = "T2", idx = 1:5, burn_in = 100, step = 20, seed = 7654321, RSinfo = TRUE) # default stat is variance t21 t22 <- NPtest(rmat, method = "T2", stat = "mad1", idx = c(1, 22, 5, 27, 6, 9, 11)) t22 ###--- T4 ---------------------------------------------------------------------- age <- sample(20:90, 100, replace = TRUE) # group MUST be a logical vector # (value of TRUE is used for group selection) age <- age < 30 t41 <- NPtest(rmat, method = "T4", idx = 1:3, group = age) t41 sex <- gl(2, 50) # group can also be a logical expression (generating a vector) t42 <- NPtest(rmat, method = "T4", idx = c(1, 4, 5, 6), group = sex == 1) t42 ###--- T10 --------------------------------------------------------------------- t101 <- NPtest(rmat, method = "T10") # default split criterion is "median" t101 \dontrun{ split <- runif(100) t102 <- NPtest(rmat, method = "T10", splitcr = split > 0.5) t102 t103 <- NPtest(rmat, method = "T10", splitcr = sex) t103} ###--- T11 --------------------------------------------------------------------- t11 <- NPtest(rmat, method = "T11") t11 ###--- Tpbis ------------------------------------------------------------------- tpb <- NPtest(X[, 1:5], method = "Tpbis", idxt = 1, idxs = 2:5) tpb ###--- Martin-Löf -------------------------------------------------------------- \dontrun{ # takes a while ... split <- rep(1:3, each = 10) NPtest(raschdat1, n = 100, method = "MLoef", splitcr = split)} } \keyword{htest} \keyword{nonparametric} eRm/man/plotDIF.Rd0000755000175100001440000001025214375241641013370 0ustar hornikusers\encoding{UTF-8} \name{plotDIF} \alias{plotDIF} \title{ Confidence intervals plot of item parameter estimates. } \description{ Performs an plot of item parameter conficence intervals based on \code{LRtest} subgroup splitting. } \usage{ plotDIF(object, item.subset = NULL, gamma = 0.95, main = NULL, xlim = NULL, xlab = " ", ylab=" ", col = NULL, distance, splitnames=NULL, leg = FALSE, legpos="bottomleft", ...) } \arguments{ \item{object}{ An object of class \code{LR} (if more objects should be plotted, the argument has to be defined as a \code{list}). } \item{item.subset}{ Subset of items to be plotted. Either a numeric vector indicating the items or a character vector indicating the itemnames. If nothing is defined (default), all items are plotted. } \item{gamma}{ The level for the item parameter's confidence limits (default is gamma = 0.95). } \item{main}{ Main title for the plot. } \item{xlim}{ Numeric vector of length 2, giving the x coordinates ranges of the plot (the y coordinates depend on the number of depicted items). } \item{xlab}{ Label for the x axis. } \item{ylab}{ Label for the y axis. } \item{col}{ By default the color for the drawn confidence lines is determined automatically whereas every group (split criterion) is depicted in the same color. } \item{distance}{ Distance between each item's confidence lines -- if omitted, the distance shrinks with increasing numbers of split criteria. Can be overriden using values in (0, 0.5). %Distance between the drawn confidence lines, default is division by factor 10 . } \item{splitnames}{ For labeling the splitobjects in the legend (returns a nicer output). } \item{leg}{ If \code{TRUE} a legend is provided by default. } \item{legpos}{ Position of the legend with possible values \code{"bottomright"}, \code{"bottom"}, \code{"bottomleft"}, \code{"left"}, \code{"topleft"}, \code{"top"}, \code{"topright"}, \code{"right"} and \code{"center"}. The default value for the legend is \code{"bottomleft"}. } \item{...}{ Further options to be passed to \code{plot}. } } \details{ If there are items that cannot be estimated for some reasons, certainly these ones are not plotted. For plotting several objects of class \code{LR}, the subgroup splitting by \code{LRtest} has to be carried out for the same data set (or at least item subsets of it). Plotting a certain subset of items could be useful if the objects of class \code{LR} contain a huge number of estimated items. The default level for the conficence limits is gamma = 0.95. (If the conficence limits should be corrected it is useful to use a correction, e.g., Bonferroni: 1 - (1 - gamma) / number of estimated items.) } \value{ \code{plotCI} returns a list containing the confidence limits of each group in each \code{LRtest} object. } \author{Kathrin Gruber, Reinhold Hatzinger} \seealso{\code{\link{LRtest}}, \code{\link{confint.threshold}}, \code{\link{thresholds}}} \examples{ # the object used is the result of running RM(raschdat1) res <- raschdat1_RM_fitted # see ? raschdat1_RM_fitted \dontrun{ # LR-test on dichotomous Rasch model with user-defined split splitvec <- rep(1:2, each = 50) lrres <- LRtest(res, splitcr = splitvec) # LR-test with mean split lrres2 <- LRtest(res, split = "mean") # combination of LRtest-objects in a list RMplotCI <- list(lrres, lrres2)} # the object raschdat1_RM_plotDIF is the result of the computations outlined # above and is loaded to save computation time. see ?raschdat1_RM_plotDIF RMplotCI <- raschdat1_RM_plotDIF # Confidence intervals plot with default assumptions plotDIF(RMplotCI) # Confidence intervals plot with Bonferroni correction plotDIF(RMplotCI, gamma = (1 - (0.05/10))) # Confidence intervals plot for an item subset plotDIF(RMplotCI, item.subset = 1:6) # with user defined group color and legend plotDIF(RMplotCI, col = c("red", "blue"), leg = TRUE, legpos = "bottomright") # with names for the splitobjects plotDIF(RMplotCI, col = c("red", "blue"), leg = TRUE, legpos = "bottomright", splitnames = c(paste("User", 1:2), paste(rep("Mean", 2), 1:2))) } \keyword{models} eRm/man/SepRel.Rd0000755000175100001440000000721514375241641013266 0ustar hornikusers\encoding{UTF-8} \name{Separation Reliability} \alias{SepRel} \alias{print.eRm_SepRel} \alias{summary.eRm_SepRel} % % % \title{Person Separation Reliability} % \description{% This function calculates the proportion of person variance that is not due to error. The concept of person separation reliability is very similar to reliability indices such as Cronbach's \eqn{\alpha}. } % % % \usage{SepRel(pobject) \method{print}{eRm_SepRel}(x, \dots) \method{summary}{eRm_SepRel}(object, \dots)} % \arguments{ \item{pobject}{Object of class \code{ppar} (see \code{\link{person.parameter}}).} \item{x}{Object of class \code{eRm_SepRel}.} \item{object}{Object of class \code{eRm_SepRel}.} \item{\dots}{Further arguments.} } % % % \details{ Returns the person separation reliability \eqn{\frac{\mathrm{SSD}-\mathrm{MSE}}{\mathrm{SSD}}}{(SSD-MSE)/SSD} where SSD is the squared standard deviation and MSE the mean squared error. Note that persons with raw scores of 0 or k are ignored in the computation. \subsection{Caveats}{% Please note that the concept of \emph{reliability} and associated problems are fundamentally different between \acronym{IRT} and \acronym{CTT} (Classical Test Theory). Separation reliability is more like a workaround to make the \dQuote{change} from \acronym{CTT} to \acronym{IRT} easier for users by providing something \dQuote{familiar.} Hence, we recommend not to put too much emphasis on this particular measure and use it with caution. } \subsection{Varying results in different programs}{% If you compare the separation reliability obtained using \pkg{eRm} with values by other software, you will find that they are most likely not equal. This has a couple of reasons, one of the most important is the employed estimation method. \pkg{eRm} uses a conditional maximum likelihood (\acronym{CML}) framework and handles missing values as separate groups during the estimation of item parameters. Person parameters are computed in a second step using unconditional or joint maximum likelihood (\acronym{UML} or \acronym{JML}) estimation with item parameters assumed to be known from the first step. Other programs might do \acronym{JML} to estimate item and person parameters at the same time, or employ marginal maximum likelihood \acronym{MML} to estimate item parameters, assuming a certain distribution for person parameters. In the latter case person parameters might be obtained by various methods like \acronym{EAP}, \acronym{MAP}, \ldots. Even \acronym{CML}-based programs yield different values, for example, if they use Warm's weighted maximum likelihood estimation \acronym{WLE} to compute person parameters in the second step. The bottom line is that, since there is not \dQuote{definite} solution for this problem, you will end up with different values under different circumstances. This is another reason to take results and implications with a grain of salt. } } % % % \value{\code{SepRel} returns a list object of class \code{eRm_SepRel} containing: \item{sep.rel}{the person separation reliability,} \item{SSD.PS}{the squared standard deviation (i.e., total person variability),} \item{MSE}{the mean square measurement error (i.e., model error variance).} } % % % \references{% Wright, B.D., and Stone, M.H. (1999). \emph{Measurement essentials.} Wide Range Inc., Wilmington. (\url{https://www.rasch.org/measess/me-all.pdf} 28Mb).% } \author{Original code by Adrian Brügger (\email{Adrian.Bruegger@imu.unibe.ch}), adapted by Marco J. Maier} %\note{} % % % \examples{# Compute Separation Reliability for a Rasch Model: pers <- person.parameter(RM(raschdat1)) res <- SepRel(pers) res summary(res) } eRm/man/summary.RSctr.Rd0000755000175100001440000000104114375241641014614 0ustar hornikusers\encoding{UTF-8} \name{summary.RSctr} \alias{summary.RSctr} \title{Summary Method for Control Objects} \description{ Prints the current definitions for the sampling function. } \usage{ \method{summary}{RSctr}(object, ...) } \arguments{ \item{object}{ object of class \code{RSctr} as obtained from \code{\link{rsctrl}} } \item{\dots}{ potential further arguments (ignored) } } \seealso{ \code{\link{rsctrl}} } \examples{ ctr <- rsctrl(n_eff = 1, seed = 123123123) # specify controls summary(ctr) } \keyword{misc} eRm/man/llra.datprep.Rd0000755000175100001440000000454614375241641014470 0ustar hornikusers\encoding{UTF-8} \name{llra.datprep} \alias{llra.datprep} \title{Prepare Data Set for LLRA Analysis } \description{ Converts wide data matrix in long format, sorts subjects according to groups and builds assigment vector. } \usage{ llra.datprep(X, mpoints, groups, baseline) } \arguments{ \item{X}{Data matrix as described in Hatzinger and Rusch (2009). It must be of wide format, e.g. for each person all item answers are written in columns for t1, t2, t3 etc. Hence each row corresponds to all observations for a single person. Missing values are not allowed. } \item{mpoints}{The number of time points. } \item{groups}{Vector, matrix or data frame with subject/treatment covariates. } \item{baseline}{An optional vector with the baseline values for the columns in group.} } \details{The function converts a data matrix from wide to long fromat as needed for LLRA. Additionally it sorts the subjects according to the different treatment/covariate groups. The group with the lowest (alpha-)numerical value will be the baseline. Treatment and covariate groups are either defined by a vector, or by a matrix or data frame. The latter will be combined to a vector of groups corresponding to a combination of each factor level per column with the factor levels of the other column. The (constructed or passed) vector will then be used to create the assignment vector. } \value{ Returns a list with the components \item{X}{Data matrix in long format with subjects sorted by groups.} \item{assign.vec}{The assignment vector.} \item{grp_n}{A vector of the number of subjects in each group.} } \author{Reinhold Hatzinger} \seealso{ The function that uses this is \code{\link{LLRA}}. The values from \code{llra.datprep} can be passed to \code{\link{build_W}}. } \examples{ # example 3 items, 3 timepoints, n=10, 2x2 treatments dat<-sim.rasch(10,9) tr1<-sample(c("a","b"),10,r=TRUE) tr2<-sample(c("x","y"),10,r=TRUE) # one treatment res<-llra.datprep(dat,mpoints=3,groups=tr1) res<-llra.datprep(dat,mpoints=3,groups=tr1,baseline="b") # two treatments res<-llra.datprep(dat,mpoints=3,groups=cbind(tr1,tr2)) res<-llra.datprep(dat,mpoints=3,groups=cbind(tr1,tr2),baseline=c("b","x")) # two treatments - data frame tr.dfr<-data.frame(tr1, tr2) res<-llra.datprep(dat,mpoints=3,groups=tr.dfr) } eRm/man/person.parameter.Rd0000755000175100001440000000763114375241641015363 0ustar hornikusers\encoding{UTF-8} \name{person.parameter} \alias{person.parameter} \alias{person.parameter.eRm} \alias{summary.ppar} \alias{print.ppar} \alias{plot.ppar} \alias{coef.ppar} \alias{logLik.ppar} \alias{print.logLik.ppar} \alias{confint.ppar} %- Also NEED an '\alias' for EACH other topic documented here. \title{Estimation of Person Parameters} \description{Maximum likelihood estimation of the person parameters with spline interpolation for non-observed and 0/full responses. Extraction of information criteria such as AIC, BIC, and cAIC based on unconditional log-likelihood.} \usage{ \method{person.parameter}{eRm}(object) \method{summary}{ppar}(object, ...) \method{print}{ppar}(x, ...) \method{plot}{ppar}(x, xlab = "Person Raw Scores", ylab = "Person Parameters (Theta)", main = NULL, ...) \method{coef}{ppar}(object, extrapolated = TRUE, ...) \method{logLik}{ppar}(object, ...) \method{confint}{ppar}(object, parm, level = 0.95, ...) } \arguments{ \item{object}{Object of class \code{'eRm'} in \code{person.parameter} and object of class \code{ppar} in \code{IC}.} Arguments for \code{print} and \code{plot} methods: \item{x}{Object of class \code{ppar}.} \item{xlab}{Label of the x-axis.} \item{ylab}{Label of the y-axis.} \item{main}{Title of the plot.} \item{...}{Further arguments to be passed to or from other methods. They are ignored in this function.} Arguments for the \code{coef} method: \item{extrapolated}{either returns extrapolated values for raw scores 0 and k or sets them \code{NA}} Arguments for \code{confint}: \item{parm}{Parameter specification (ignored).} \item{level}{Alpha-level.} } \details{If the data set contains missing values, person parameters are estimated for each missing value subgroup. } \value{ The function \code{person.parameter} returns an object of class \code{ppar} containing: \item{loglik}{Log-likelihood of the collapsed data (for faster estimation persons with the same raw score are collapsed).} \item{npar}{Number of parameters.} \item{niter}{Number of iterations.} \item{thetapar}{Person parameter estimates.} \item{se.theta}{Standard errors of the person parameters.} \item{hessian}{Hessian matrix.} \item{theta.table}{Matrix with person parameters (ordered according to original data) including NA pattern group.} \item{pers.ex}{Indices with persons excluded due to 0/full raw score} \item{X.ex}{Data matrix with persons excluded} \item{gmemb}{NA group membership vector (0/full persons excluded)} The function \code{coef} returns a vector of the person parameter estimates for each person (i.e., the first column of \code{theta.table}). The function \code{logLik} returns an object of class \code{loglik.ppar} containing: \item{loglik}{Log-likelihood of the collapsed data (see above).} \item{df}{Degrees of freedom.} } \references{ Fischer, G. H., and Molenaar, I. (1995). Rasch Models - Foundations, Recent Developements, and Applications. Springer. Mair, P., and Hatzinger, R. (2007). Extended Rasch modeling: The \pkg{eRm} package for the application of IRT models in R. Journal of Statistical Software, 20(9), 1-20. Mair, P., and Hatzinger, R. (2007). CML based estimation of extended Rasch models with the \pkg{eRm} package in R. Psychology Science, 49, 26-43. } \author{Patrick Mair, Reinhold Hatzinger} %\note{} \seealso{ \code{\link{itemfit.ppar}},\code{\link{personfit.ppar}} } \examples{ #Person parameter estimation of a rating scale model res <- RSM(rsmdat) pres <- person.parameter(res) pres summary(pres) plot(pres) #Person parameter estimation for a Rasch model with missing values res <- RM(raschdat2, se = FALSE) #Rasch model without standard errors pres <- person.parameter(res) pres #person parameters summary(pres) logLik(pres) #log-likelihood of person parameter estimation } \keyword{models} eRm/man/anova.llra.Rd0000755000175100001440000000403114375241641014122 0ustar hornikusers\encoding{UTF-8} \name{anova.llra} \alias{anova.llra} \title{Analysis of Deviance for Linear Logistic Models with Relaxed Assumptions} \description{Compute an analysis of deviance table for one or more LLRA.} \usage{ \method{anova}{llra}(object, ...) } \arguments{ \item{object, ... }{Objects of class "llra", typically the result of a call to \code{\link{LLRA}}. } } \details{ An analysis of deviance table will be calculated. The models in rows are ordered from the smallest to the largest model. Each row shows the number of parameters (Npar) and the log-likelihood (logLik). For all but the first model, the parameter difference (df) and the difference in deviance or the likelihood ratio (-2LR) is given between two subsequent models (with increasing complexity). Please note that interpreting these values only makes sense if the models are nested. The table also contains p-values comparing the reduction in the deviance to the df for each row based on the asymptotic Chi^2-Distribution of the Likelihood ratio test statistic. } \value{ An object of class \code{"anova"} inheriting from class \code{"data.frame"}. } \author{Thomas Rusch} \section{Warning:}{ The comparison between two or more models by \code{anova} will only be valid if they are fitted to the same dataset and if the models are nested. The function does not check if that is the case. } \seealso{ The model fitting function \code{\link{LLRA}}. } \examples{\dontrun{ ##An LLRA with 2 treatment groups and 1 baseline group, 5 items and 4 ##time points. Item 1 is dichotomous, all others have 3, 4, 5, 6 ##categories respectively. #fit LLRA ex2 <- LLRA(llraDat2[,1:20],mpoints=4,groups=llraDat2[,21]) #Imposing a linear trend for items 2 and 3 using collapse_W collItems2 <- list(c(32,37,42),c(33,38,43)) newNames2 <- c("trend.I2","trend.I3") Wnew <- collapse_W(ex2$W,collItems2,newNames2) #Estimating LLRA with the linear trend for item 2 and 3 ex2new <- LLRA(llraDat2[1:20],W=Wnew,mpoints=4,groups=llraDat2[21]) #comparing models with likelihood ratio test anova(ex2,ex2new)}} eRm/man/llraDat1.Rd0000755000175100001440000000502514375241641013535 0ustar hornikusers\encoding{UTF-8} \name{llraDat1} \alias{llraDat1} \docType{data} \title{An Artificial LLRA Data Set} \description{Artificial data set of 5 items, 5 time points and 5 groups for LLRA.} \usage{llraDat1} \format{ A data frame with 150 observations of 26 variables. \describe{ \item{\code{t1.I1}}{Answers to item 1 at time point 1} \item{\code{t1.I2}}{Answers to item 2 at time point 1} \item{\code{t1.I3}}{Answers to item 3 at time point 1} \item{\code{t1.I4}}{Answers to item 4 at time point 1} \item{\code{t1.I5}}{Answers to item 5 at time point 1} \item{\code{t2.I1}}{Answers to item 1 at time point 2} \item{\code{t2.I2}}{Answers to item 2 at time point 2} \item{\code{t2.I3}}{Answers to item 3 at time point 2} \item{\code{t2.I4}}{Answers to item 4 at time point 2} \item{\code{t2.I5}}{Answers to item 5 at time point 2} \item{\code{t3.I1}}{Answers to item 1 at time point 3} \item{\code{t3.I2}}{Answers to item 2 at time point 3} \item{\code{t3.I3}}{Answers to item 3 at time point 3} \item{\code{t3.I4}}{Answers to item 4 at time point 3} \item{\code{t3.I5}}{Answers to item 5 at time point 3} \item{\code{t4.I1}}{Answers to item 1 at time point 4} \item{\code{t4.I2}}{Answers to item 2 at time point 4} \item{\code{t4.I3}}{Answers to item 3 at time point 4} \item{\code{t4.I4}}{Answers to item 4 at time point 4} \item{\code{t4.I5}}{Answers to item 5 at time point 4} \item{\code{t5.I1}}{Answers to item 1 at time point 5} \item{\code{t5.I2}}{Answers to item 2 at time point 5} \item{\code{t5.I3}}{Answers to item 3 at time point 5} \item{\code{t5.I4}}{Answers to item 4 at time point 5} \item{\code{t5.I5}}{Answers to item 5 at time point 5} \item{\code{groups}}{The group membership} } } \details{ This is a data set as described in Hatzinger and Rusch (2009). 5 items were measured at 5 time points (in columns). Each row corresponds to one person (P1 to P150). There are 4 treatment groups and a control group. Treatment group G5 has size 10 (the first ten subjects), treatment group G4 has size 20, treatment group G3 has size 30, treatment group G2 has size 40 and the control group CG has size 50 (the last 50 subjects). Item 1 is dichotomous, all others are polytomous. Item 2, 3, 4 and 5 have 3, 4, 5, 6 categories respectively. } \references{ Hatzinger, R. and Rusch, T. (2009) IRT models with relaxed assumptions in eRm: A manual-like instruction. \emph{Psychology Science Quarterly}, \bold{51}, pp. 87--120. } \examples{ llraDat1 } \keyword{datasets} eRm/man/LPCM.Rd0000755000175100001440000000710414375241641012624 0ustar hornikusers\encoding{UTF-8} \name{LPCM} \alias{LPCM} %- Also NEED an '\alias' for EACH other topic documented here. \title{Estimation of linear partial credit models} \description{ This function computes the parameter estimates of a linear partial credit model (LRSM) for polytomuous item responses by using CML estimation. } \usage{ LPCM(X, W , mpoints = 1, groupvec = 1, se = TRUE, sum0 = TRUE, etaStart) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{X}{Input data matrix or data frame; rows represent individuals (N in total), columns represent items. Missing values are inserted as \code{NA}.} \item{W}{Design matrix for the LPCM. If omitted, the function will compute W automatically.} \item{mpoints}{Number of measurement points.} \item{groupvec}{Vector of length N which determines the group membership of each subject, starting from 1} \item{se}{If \code{TRUE}, the standard errors are computed.} \item{sum0}{If \code{TRUE}, the parameters are normalized to sum-0 by specifying an appropriate \code{W}. If \code{FALSE}, the first parameter is restricted to 0.} \item{etaStart}{A vector of starting values for the eta parameters can be specified. If missing, the 0-vector is used.} } \details{ Through appropriate definition of \code{W} the LPCM can be viewed as a more parsimonous PCM, on the one hand, e.g. by imposing some cognitive base operations to solve the items. One the other hand, linear extensions of the Rasch model such as group comparisons and repeated measurement designs can be computed. If more than one measurement point is examined, the item responses for the 2nd, 3rd, etc. measurement point are added column-wise in X. If \code{W} is user-defined, it is nevertheless necessary to specify \code{mpoints} and \code{groupvec}. It is important that first the time contrasts and then the group contrasts have to be imposed. Available methods for LPCM-objects are:\cr \code{print}, \code{coef}, \code{model.matrix}, \code{vcov},\code{summary}, \code{logLik}, \code{person.parameters}. } \value{ Returns on object of class \code{'eRm'} containing: \item{loglik}{Conditional log-likelihood.} \item{iter}{Number of iterations.} \item{npar}{Number of parameters.} \item{convergence}{See \code{code} output in \code{\link{nlm}}.} \item{etapar}{Estimated basic item parameters.} \item{se.eta}{Standard errors of the estimated basic item parameters.} \item{betapar}{Estimated item (easiness) parameters.} \item{se.beta}{Standard errors of item parameters.} \item{hessian}{Hessian matrix if \code{se = TRUE}.} \item{W}{Design matrix.} \item{X}{Data matrix.} \item{X01}{Dichotomized data matrix.} \item{groupvec}{Group membership vector.} \item{call}{The matched call.} } \references{ Fischer, G. H., and Molenaar, I. (1995). Rasch Models - Foundations, Recent Developements, and Applications. Springer. Mair, P., and Hatzinger, R. (2007). Extended Rasch modeling: The \pkg{eRm} package for the application of IRT models in R. Journal of Statistical Software, 20(9), 1-20. Mair, P., and Hatzinger, R. (2007). CML based estimation of extended Rasch models with the \pkg{eRm} package in R. Psychology Science, 49, 26-43. } \author{Patrick Mair, Reinhold Hatzinger} %\note{} \seealso{\code{\link{LRSM}},\code{\link{LLTM}}} \examples{ #LPCM for two measurement points and two subject groups #20 subjects, 2*3 items G <- c(rep(1,10),rep(2,10)) #group vector res <- LPCM(lpcmdat, mpoints = 2, groupvec = G) res summary(res) } \keyword{models} eRm/man/phi.range.Rd0000755000175100001440000000113414375241641013741 0ustar hornikusers\encoding{UTF-8} \name{phi.range} \alias{phi.range} \title{Example User Function} \description{Calculates the \eqn{R_\phi} statistic, i.e., the range of the inter-column correlations (\eqn{\phi}-coefficients) for a binary matrix.} \usage{phi.range(mat)} \arguments{\item{mat}{a binary matrix}} \value{The range of the inter-column correlations} \examples{ ctr <- rsctrl(burn_in = 10, n_eff = 5, step=10, seed = 123, tfixed = FALSE) mat <- matrix(sample(c(0,1), 50, replace = TRUE), nr = 10) rso <- rsampler(mat, ctr) rso_st <- rstats(rso,phi.range) print(unlist(rso_st)) } \keyword{misc} eRm/man/sim.xdim.Rd0000755000175100001440000000623014375241641013620 0ustar hornikusers\encoding{UTF-8} \name{sim.xdim} \alias{sim.xdim} \title{Simulation of multidimensional binary data} \description{This utility function simulates a 0-1 matrix violating the unidimensionality assumption in the Rasch model. } \usage{ sim.xdim(persons, items, Sigma, weightmat, seed = NULL, cutpoint = "randomized") } \arguments{ \item{persons}{Either a matrix (each column corresponds to a dimension) of person parameters or an integer indicating the number of persons (see details).} \item{items}{Either a vector of item parameters or an integer indicating the number of items (see details).} \item{Sigma}{A positive-definite symmetric matrix specifying the covariance matrix of the variables.} \item{weightmat}{Matrix for item-weights for each dimension (columns).} \item{seed}{A seed for the random number generated can be set.} \item{cutpoint}{Either \code{"randomized"} for a randomized tranformation of the model probability matrix into the model 0-1 matrix or an integer value between 0 and 1 (see details).} } \details{If \code{persons} is specified as matrix, \code{Sigma} is ignored. If \code{items} is an integer value, the corresponding parameter vector is drawn from N(0,1). The \code{cutpoint} argument refers to the transformation of the theoretical probabilities into a 0-1 data matrix. A randomized assingment implies that for each cell an additional random number is drawn. If the model probability is larger than this value, the person gets 1 on this particular item, if smaller, 0 is assigned. Alternatively, a numeric probability cutpoint can be assigned and the 0-1 scoring is carried out according to the same rule. If \code{weightmat} is not specified, a random indicator matrix is generated where each item is a measurement of only one dimension. For instance, the first row for a 3D-model could be (0,1,0) which means that the first item measures the second dimension only. This corresponds to the between-item multidimensional model presented by Adams et al. (1997). \code{Sigma} reflects the VC-structure for the person parameters drawn from a multivariate standard normal distribution. Thus, the diagonal elements are typically 1 and the lower the covariances in the off-diagonal, the stronger the model violation. } \references{ Adams, R. J., Wilson, M., & Wang, W. C. (1997). The multidimensional random coefficients multinomial logit model. Applied Psychological Measurement, 21, 1-23. Glas, C. A. W. (1992). A Rasch model with a multivariate distribution of ability. In M. Wilson (Ed.), Objective Measurement: Foundations, Recent Developments, and Applications (pp. 236-258). Norwood, NJ: Ablex. } \seealso{\code{\link{sim.rasch}}, \code{\link{sim.locdep}}, \code{\link{sim.2pl}}} \examples{ # 500 persons, 10 items, 3 dimensions, random weights. Sigma <- matrix(c(1, 0.01, 0.01, 0.01, 1, 0.01, 0.01, 0.01, 1), 3) X <- sim.xdim(500, 10, Sigma) #500 persons, 10 items, 2 dimensions, weights fixed to 0.5 itemvec <- runif(10, -2, 2) Sigma <- matrix(c(1, 0.05, 0.05, 1), 2) weights <- matrix(0.5, ncol = 2, nrow = 10) X <- sim.xdim(500, itemvec, Sigma, weightmat = weights) } \keyword{models} eRm/DESCRIPTION0000644000175100001440000000315514505226141012525 0ustar hornikusersPackage: eRm Type: Package Title: Extended Rasch Modeling Version: 1.0-4 Date: 2023-09-27 Authors@R: c(person(given="Patrick", family="Mair", email="mair@fas.harvard.edu", role=c("cre","aut")), person(given="Thomas", family="Rusch", email="thomas.rusch@wu.ac.at", role="aut"), person(given="Reinhold", family="Hatzinger", role="aut"), person(given=c("Marco", "J."), family="Maier", role="aut"), person(given="Rudolf", family="Debelak", email="rudolf.debelak@psychologie.uzh.ch", role="ctb")) Description: Fits Rasch models (RM), linear logistic test models (LLTM), rating scale model (RSM), linear rating scale models (LRSM), partial credit models (PCM), and linear partial credit models (LPCM). Missing values are allowed in the data matrix. Additional features are the ML estimation of the person parameters, Andersen's LR-test, item-specific Wald test, Martin-Loef-Test, nonparametric Monte-Carlo Tests, itemfit and personfit statistics including infit and outfit measures, ICC and other plots, automated stepwise item elimination, simulation module for various binary data matrices. License: GPL-3 Imports: graphics, grDevices, stats, methods, MASS, splines, Matrix, lattice, colorspace, psych Depends: R (>= 3.5.0) Encoding: UTF-8 LazyData: yes LazyLoad: yes ByteCompile: yes NeedsCompilation: yes Packaged: 2023-09-27 20:08:43 UTC; patrick Author: Patrick Mair [cre, aut], Thomas Rusch [aut], Reinhold Hatzinger [aut], Marco J. Maier [aut], Rudolf Debelak [ctb] Maintainer: Patrick Mair Repository: CRAN Date/Publication: 2023-09-28 07:33:53 UTC eRm/build/0000755000175100001440000000000014505105713012113 5ustar hornikuserseRm/build/vignette.rds0000644000175100001440000000030014505105713014443 0ustar hornikusersb```b`afd`b2 1# 'fO +G +8%g&cP& 6h0X" ,LȊsS1 tI-HK î?"5lP5,n90{C2K7(1 棸(\^P6@btr$$ گ xeRm/build/partial.rdb0000644000175100001440000000007514505105676014252 0ustar hornikusersb```b`afd`b1 H020piּb C"{7eRm/src/0000755000175100001440000000000014505105713011603 5ustar hornikuserseRm/src/geodist.c0000755000175100001440000000424214375241637013425 0ustar hornikusers/* ###################################################################### # # geodist.c # # copyright (c) 2004, Carter T. Butts # Last Modified 11/21/04 # Licensed under the GNU General Public License version 2 (June, 1991) # # Part of the R/sna package # # This file contains routines related to the computation of geodesics. # ###################################################################### */ #include #include #include #include "geodist.h" void geodist_R(double *g, double *pn, double *gd, double *sigma) /* Compute geodesics for the graph in g. The geodesic distances are stored in gd, and the path counts in sigma (both being nxn matrices). Note that these should be initialized to all infs and all 0s, respectively. */ { char *visited; long int n,v,i,nod,s1count; /*Set up stuff*/ n=*pn; /*Allocate memory for visited list*/ visited=(char *)R_alloc(n,sizeof(char)); /*Cycle through each node, performing a BFS*/ for(v=0;v0){ while(s1count>0){ /*Find the next visitable node, and change its state*/ for(nod=0;visited[nod]!=1;nod++); /*Only OK b/c s1count>0*/ visited[nod]=3; s1count--; for(i=0;i=g[nod+i*n]){ gd[v+i*n]=gd[v+nod*n]+g[nod+i*n]; /*Geodist is nod's+g*/ sigma[v+i*n]+=sigma[v+nod*n]; /*Add to path count*/ } } } /*Continue until we run out of nodes for this iteration*/ /*Mark all "to-be-visited" nodes as visitable*/ for(i=0;i # Last Modified 11/21/04 # Licensed under the GNU General Public License version 2 (June, 1991) # # Part of the R/sna package # # This file contains headers for geodist.c. # ###################################################################### */ #ifndef GEODIST_H #define GEODIST_H /*DECLARATIONS/INCLUSIONS---------------------------------------------------*/ #include #include #include /*INTERNAL ROUTINES---------------------------------------------------------*/ /*R-CALLABLE ROUTINES-------------------------------------------------------*/ void geodist_R(double *g, double *pn, double *gd, double *sigma); #endif eRm/src/components.h0000755000175100001440000000145014375241637014157 0ustar hornikusers/* ###################################################################### # # components.h # # copyright (c) 2004, Carter T. Butts # Last Modified 11/26/04 # Licensed under the GNU General Public License version 2 (June, 1991) # # Part of the R/sna package # # This file contains headers for components.c. # ###################################################################### */ #ifndef COMPONENTS_H #define COMPONENTS_H /*DECLARATIONS/INCLUSIONS---------------------------------------------------*/ #include #include #include /*INTERNAL ROUTINES---------------------------------------------------------*/ /*R-CALLABLE ROUTINES-------------------------------------------------------*/ void component_dist_R(double *g, double *pn, double *memb); #endif eRm/src/RaschSampler.f900000644000175100001440000005146014504365500014516 0ustar hornikuserssubroutine sampler(n,k,inputmat,tfixed,burn_in,n_eff,step,seed,outputvec,ier) ! sample binary matrices with given marginals. ! input: n = number of rows (integer*4) ! k = number of columns (integer*4) ! inputmat: input binary matrix (n*k) (integer*4) ! tfixed: main diagonal is fixed if true; has only effect if n.eq.k ! step: if the matrix #i is an effective matrix, then the next effective matrix is #(i+step) ! burn_in: number of burn_in matrices in units of step ! n_eff: number of effective matrices, to be written in the output vector ! I/O seed (integer*4). Seed of the random generator ! if seed <> 0: seed is unaltered and |seed| is used as the seed of the random generator. ! if seed.eq.0: a seed is generated from the system clock, and its value is returned. ! ATTENTION: currently seed.eq.0 is deactivated and only seed<>0 is allowed ! (see lines 103-113) (rh 2006-10-25) ! output:outputvec (integer*4 vector): n_eff binary matrices, stored bitwise in the following way: ! if(k<=32) one row of a matrix is stored in one position (number) of four bytes, the first element ! is bit 0, the second is bit 1, etc. ! if(32 nmax = 1024 = 2**10 !!!!!! changed to 2**12 in 0.8-3 ! 2: k > kmax = 64 = 2**6 !!!!!! changed to 2**7 in 0.8-3 ! 4: n_eff > n_effmax = 8191 = 2**13 - 1 ! 8: burn_in < 0 ! 16: step <= 0 ! 1-31: sums of the foregoing codes ! 32: input matrix contains values other than one or zero ! 64: the input matrix has a Guttman form ! if tfixed and n.eq.k, the main diagonal is condidered as fixed. ! if tfixed and n!=k, the case is treated as a rectangular matrix without constraints ! the Markov chain transition matrix used is Q**step integer,parameter :: logical1=selected_int_kind(1) !***new integer(kind(1)), dimension(n*(k+31)/32*(n_eff+1)),intent(out)::outputvec !*** integer(kind(1)), intent(out) :: ier !*** integer(kind(1)), intent(in) :: n,k,burn_in,n_eff,step !*** integer(kind(1)), dimension(n,k),intent(in) :: inputmat !*** integer(kind(1)) :: seed !*** logical(kind(1)), intent(in) :: tfixed !*** character(len=10) :: timevec !integer(kind(1)),parameter :: nmax=1024,kmax=64,n_effmax=8191 !!!!!! kmax changed to 2**7 nmax changed to 2**12 !*** integer(kind(1)),parameter :: nmax=4096,kmax=128,n_effmax=8191 !*** integer(kind(1)), allocatable :: a(:),b(:),aold(:),bold(:),a_kol(:),b_kol(:),iwork(:) !*** integer(kind(1)) :: i,j,m,kk2,kk3,it,krand,k2,k3,nhex,k2old,k3old,nhexold !*** integer(kind(1)) :: x1,x2 ! x1 and x2 are reserved for the random generator !*** integer(kind(1)) :: words_per_row, offset !*** integer(kind(1)),allocatable :: hexmat(:,:),hexmatold(:,:) !*** real(kind(1.0)) :: tijd !*** !*** logical(logical1),parameter :: t=.true.,f=.false. !*** logical(logical1),allocatable :: t_in(:,:) !*** logical(logical1),dimension(3,3) :: hexa,hexb !*** logical(logical1),allocatable :: twa(:),twb(:),tw(:),tng(:),tngold(:),col1(:),col2(:) !tng = non-guttman pair !*** logical(logical1) :: t_eff,tfixnow !*** data hexa/f,f,t,t,f,f,f,t,f/,hexb/f,t,f,f,f,t,t,f,f/ !check error codes 1, 2 4, 8 and 16 ier=0 if(n.le.0 .or. n.gt.nmax)ier=ier+1 if(k.le.0 .or. k.gt.kmax)ier=ier+2 if(n_eff.le.0 .or. n_eff.gt.n_effmax)ier=ier+4 if(burn_in.lt.0)ier=ier+8 if(step.le.0)ier=ier+16 if(ier.ne.0)return ! allocate the necessary arrays kk2=k*(k-1)/2 allocate(t_in(n,k)) allocate(a(kk2),b(kk2),aold(kk2),bold(kk2),a_kol(kk2),b_kol(kk2)) allocate(twa(n),twb(n),tw(n),tng(kk2),tngold(kk2),col1(n),col2(n)) allocate (iwork(n)) tfixnow=tfixed if(n.ne.k)tfixnow=.false. if(tfixnow)then kk3=kk2*(k-2)/3 allocate(hexmat(3,kk3),hexmatold(3,kk3)) endif ! check error code 32 ier=count(inputmat.gt.1)+count(inputmat.lt.0) if(ier.ne.0)then ier=32 return endif ! copy input matrix to t_in !!!t_in=inputmat !!!replaced by t_in=btest(inputmat,0) if(tfixnow) then forall (i=1:n) t_in(i,i)=f endif ! !select seed for random number generation ! if(seed.eq.0)then ! call date_and_time(TIME=timevec) ! read(timevec,'(f10.3)')tijd ! x1=tijd*1000. ! x1=0. ! x1=x1+536870911 ! =x1 + 2**29 - 1 ! seed=x1 ! else ! x1=abs(seed) ! endif x1=abs(seed) ! added from upper else clause (to be removed if random seed enabled) x2=x1 call rand1(x1) krand=1+mod(k,25) ! KRAND selects a random generator (used in RAND_INTEGER42) !fill the arrays a_kol, b_kol, a, b, and b_pairs for the input matrices t_in !determine the weight k2 (= #neighbour column pairs of the input matrix) it=0 do i=2,k do j=1,i-1 it=it+1 a_kol(it)=i b_kol(it)=j call findab(t_in(1:n,i),t_in(1:n,j),i,j,a(it),b(it)) tng(it)=a(it)*b(it).gt.0 end do end do k2=count(tng(1:kk2)) k3=k2 if(tfixnow)then call hexagon if(nhex.gt.0)k3=k2+1 endif ! check on the Guttman condition (error code 64) if(k3.eq.0)then ier=64 return endif ! pack the input matrix and put it in the outputvector offset=0 ! offset is the number of words defined until now words_per_row=(k+31)/32 call pack_matrix(outputvec) ! offset is updated within the subroutine ! compute the total number of matrices to be computed n_tot=burn_in+n_eff ! do the sampling do i=1,n_tot t_eff=i.gt.burn_in do j=1,step ! generate step matrices before computing the statistic call rand_integer42(it,k3,x1,x2,krand) !{*** from here to ***} only applies to alternating hexagons if(k3.gt.k2.and.it.eq.k3)then ! there are restrictions on the main diagonal ! and there exists at least one alternating hexagon (k3>k2) ! an alternating hexagon has to be changed (it=k3) ! first save necessary elements for Metropolis-Hastings k2old=k2 k3old=k3 aold=a bold=b nhexold=nhex hexmatold(:,1:nhex)=hexmat(:,1:nhex) tngold=tng ! make a new matrix by switching one alternating hexagon call rand_integer42(it,nhex,x1,x2,krand) call make_matrix3(it) call update_pairs3(hexmat(1,it),hexmat(2,it),hexmat(3,it)) call update_pairs3(hexmat(2,it),hexmat(1,it),hexmat(3,it)) call update_pairs3(hexmat(3,it),hexmat(1,it),hexmat(2,it)) call hexagon k2=count(tng(1:kk2)) k3=k2+1 ! there is at least one alternating hexagon, vz, the one that just changed into its complement if(k3old.lt.k3) then ! check if process possibly remains in the same state (Metropolis-Hastings) call rand_integer42(m,k3,x1,x2,krand) if(m.gt.k3old)then ! process remains in the same state call make_matrix3(it) ! this restores the matrix k3=k3old k2=k2old a=aold b=bold nhex=nhexold hexmat(:,1:nhex)=hexmatold(:,1:nhex) tng=tngold endif endif cycle endif !***} call pick_a_pair(it) col1=t_in(1:n,a_kol(it)) col2=t_in(1:n,b_kol(it)) k2old=k2 k3old=k3 aold=a bold=b tngold=tng if(tfixnow)then nhexold=nhex hexmatold(:,1:nhex)=hexmat(:,1:nhex) endif call make_matrix(it) call update_pairs(a_kol(it),b_kol(it)) call update_pairs(b_kol(it),a_kol(it)) k2=count(tng(1:kk2)) k3=k2 if(tfixnow)then call hexagon if(nhex.gt.0)k3=k3+1 endif if(k3old.lt.k3)then ! apply Metropolis-Hastings call rand_integer42(m,k3,x1,x2,krand) if(m.gt.k3old)then ! process remains in the current state t_in(1:n,a_kol(it))=col1(1:n) t_in(1:n,b_kol(it))=col2(1:n) k2=k2old k3=k3old a=aold b=bold tng=tngold if(tfixnow)then nhex=nhexold hexmat(:,1:nhex)=hexmatold(:,1:nhex) endif endif endif end do ! if this is an 'effective' sample, pack it and store it in outputvec if(t_eff)call pack_matrix(outputvec) end do ! here ends the sampling procedure deallocate(a,b,aold,bold,a_kol,b_kol,iwork,twa,twb,tw,tng,tngold,col1,col2,t_in) if(tfixnow) deallocate(hexmat,hexmatold) contains subroutine pack_matrix(vec) integer(kind(1)) vec(*) !*** integer(kind(1)) :: i,j,ib,ie,it,iw !*** do i=1,n ib=1 do iw=1,words_per_row offset=offset+1 vec(offset)=0 ie=min(ib+31,k) it=-1 do j=ib,ie it=it+1 if(.not.t_in(i,j))cycle vec(offset)=ibset(vec(offset),it) end do ib=ie+1 end do end do end subroutine pack_matrix subroutine findab(ta,tb,i,j,a,b) !!!!! logical(logical1):: ta(n),tb(n) !*** logical(logical1):: ta(n),tb(n),test(n) !*** integer(kind(1))::a,b,i,j !*** tw=(ta.neqv.tb) if(tfixnow)then tw(i)=.false. tw(j)=.false. endif test=ta.and.tw a=count(test) test=tb.and.tw b=count(test) !!!!! a=count(ta.and.tw) !!!!! b=count(tb.and.tw) end subroutine findab subroutine pick_a_pair(it) integer(kind(1)),intent(out)::it !*** integer(kind(1)) ::i,m !*** call rand_integer42(it,k2,x1,x2,krand) m=count(tng(1:it)) if(m.eq.it)return do i=it+1,kk2 if(.not.tng(i))cycle m=m+1 if(m.eq.it)then it=i return endif end do end subroutine pick_a_pair subroutine make_matrix(it) integer(kind(1)),intent(in)::it !*** integer(kind(1)) ::m,i,j,ii,jj !*** !!!!! logical(logical1),allocatable :: test(:) !*** logical(logical1) :: test(n) !*** ii=a_kol(it) jj=b_kol(it) if(a(it)*b(it).eq.1)then ! columns ii and jj contain a single tetrad. ! no sampling is necessary: the tetrad is complemented j=0 do i=1,n if(tfixnow)then if(i.eq.ii)cycle if(i.eq.jj)cycle endif if(t_in(i,ii).eqv.t_in(i,jj))cycle j=j+1 t_in(i,ii)=t_in(i,jj) t_in(i,jj)=.not.t_in(i,ii) if(j.eq.2)return end do endif do ! a random binomial operation is applied ! copy the two selected colums in the logical vectors twa and twb twa(1:n)=t_in(1:n,ii) twb(1:n)=t_in(1:n,jj) m=a(it)+b(it) call combine(m,a(it),iwork,tw) ! generate the random combination of a(it) objets out of m ! insert the combination into the vectors twa and twb j=0 do i=1,n if(tfixnow)then if(i.eq.ii)cycle if(i.eq.jj)cycle endif if(twa(i).eqv.twb(i))cycle j=j+1 if(tw(j))then twa(i)=.true. twb(i)=.false. else twa(i)=.false. twb(i)=.true. endif if(j.eq.m)exit end do ! check whether matrix has changed !!!!! !!!!! test=twa test=twa(1:n).eqv.t_in(1:n,ii) m=count(test) !!!!! m=count(twa(1:n).eqv.t_in(1:n,ii)) if(m.ne.n)exit ! the matrix has changed end do ! the matrix has not changed; a new combination is tried. ! the changes are inserted in the matrix t_in t_in(1:n,ii)=twa(1:n) t_in(1:n,jj)=twb(1:n) end subroutine make_matrix subroutine make_matrix3(it) integer(kind(1)), intent(in)::it !*** integer(kind(1)) ::i,j,ii,jj !*** do i=1,2 ii=hexmat(i,it) do j=i+1,3 jj=hexmat(j,it) t_in(ii,jj)=.not.t_in(ii,jj) t_in(jj,ii)=.not.t_in(jj,ii) end do end do end subroutine make_matrix3 subroutine combine(n,k,ix,tx) ! generate a random combination of k objects out of n ! the result is stored in the logical n-vector tx ! ix is a working array integer(kind(1)) ::n,k,kk,ii,iu,nnu !*** integer(kind(1)) ::ix(n) !*** logical(logical1) ::tx(n) !*** ix(1:n)=(/(ii,ii=1,n)/) tx(1:n)=.false. nnu=n kk=min(k,n-k) do ii=1,kk call rand_integer42(iu,nnu,x1,x2,krand) tx(ix(iu))=.true. if(iu.lt.nnu)ix(iu:nnu-1)=ix(iu+1:nnu) nnu=nnu-1 end do if(kk.lt.k)tx=.not.tx end subroutine combine subroutine update_pairs(i,j) integer(kind(1)),intent(in) :: i,j !*** integer(kind(1)):: jt,m !*** do m=1,i-1 if(m.eq.j)cycle jt=(i-1)*(i-2)/2+m call findab(t_in(1:n,i),t_in(1:n,m),i,m,a(jt),b(jt)) tng(jt)=a(jt)*b(jt).gt.0 end do do m=i+1,k if(m.eq.j)cycle jt=(m-1)*(m-2)/2+i call findab(t_in(1:n,m),t_in(1:n,i),m,i,a(jt),b(jt)) tng(jt)=a(jt)*b(jt).gt.0 end do end subroutine update_pairs subroutine update_pairs3(i,j,l) integer(kind(1)),intent(in) :: i,j,l !*** integer(kind(1)):: jt,m !*** do m=1,i-1 if(m.eq.j)cycle if(m.eq.l)cycle jt=(i-1)*(i-2)/2+m call findab(t_in(1:n,i),t_in(1:n,m),i,m,a(jt),b(jt)) tng(jt)=a(jt)*b(jt).gt.0 end do do m=i+1,k if(m.eq.j)cycle if(m.eq.l)cycle jt=(m-1)*(m-2)/2+i call findab(t_in(1:n,m),t_in(1:n,i),m,i,a(jt),b(jt)) tng(jt)=a(jt)*b(jt).gt.0 end do end subroutine update_pairs3 subroutine hexagon logical(logical1),dimension(3,3):: c !*** integer(kind(1)),dimension(3) :: v !*** integer(kind(1)) :: i,j,m !*** nhex=0 do i=1,n-2 v(1)=i do j=i+1,n-1 if(t_in(i,j).eqv.t_in(j,i))cycle v(2)=j do m=j+1,n v(3)=m c=t_in(v,v) if(all(c.eqv.hexa).or.all(c.eqv.hexb))then nhex=nhex+1 hexmat(1:3,nhex)=v endif end do end do end do end subroutine hexagon subroutine rand1(x) ! see Ripley, B.D., Stochastic Simulation. New-York:Wiley, 1987, pp. 37-39. (generator 4) integer(kind(1)) x,p,q,r,a,b,c !*** data a,b,c,p/127773,16807,2836,2147483647/ ! generator 4 q=x/a r=mod(x,a) x=b*r-c*q if(x.lt.0)x=x+p end subroutine rand1 subroutine rand_integer42(iu,a,x1,x2,k) ! draw a uniformly distributed integer from {1, 2, ..., A} ! the rejection rate is (P - BOUND)/P ! where P equals 2**31-2 (= the number of different values RAND1 can take) ! and BOUND equals A*(P/A) ! example: for A = 1000, the rejection rate is 3.008E-7 ! Notice that zero as result of the draw leads to rejection (see !***) ! The routine calls RAND2 with the K-th set of coefficients integer(kind(1)) iu,a,x1,x2,bound,k !*** integer(kind(1)),parameter :: p = 2147483646 !*** ! P is the number of values X can take: 2**31 - 2, ! because 0 is excluded bound=(p/a)*a do call rand2(x1,x2,k) if(x2.eq.0)cycle if(x2.le.bound)exit !*** LE not LT end do iu=1+mod(x2,a) end subroutine rand_integer42 subroutine rand2(x1,x2,k) ! Random number generators MRG (multiple recursive generator) ! Lih-Yuan Deng and Dennis K.J. Lin (2000).Random Number Generation for the New Century, ! The American Statistician, vol 54, no. 2, pp. 145-150 ! To compute the formulae, the method in the referenced article is used. B(K) is the table as published ! A(K)=P/B(K) and C(K)=P-A(K)*B(K), P = 2**31 -1 integer (kind(1))::k !*** integer (kind(1))::x1,x2,p,q,r,y !*** integer (kind(1)), dimension(25)::b,c,a !*** data b/26403,33236,36673,40851,43693,27149,33986,36848,40961, & 44314,29812,34601,37097,42174,44530,30229,36098,37877, & 42457,45670,31332,36181,39613,43199,46338/ data a/81334,64613,58557,52568,49149,79099,63187,58279,52427, & 48460,72034,62064,57888,50919,48225,71040,59490,56696, & 50580,47021,68539,59353,54211,49711,46343/ data c/22045, 5979,22786,28279,16390,24896,10265,19055,21300, & 27207, 6039, 7183,12511,25741,24397,15487,13627, 9255, & 8587,34577,19699,32754,23304,18158,41713/ data p/2147483647/ q=x1/a(k) r=mod(x1,a(k)) y=b(k)*r-c(k)*q if(y.ge.x2-p)then y=y-x2 else y=y+(p-x2) endif if(y.lt.0)y=y+p x1=x2 x2=y end subroutine rand2 end subroutine sampler subroutine unpack(vec,words_per_row,t_out,n,k) integer(kind(1)) offset,words_per_row,n,k !*** integer(kind(1)),dimension(n*words_per_row)::vec !*** integer(kind(1)) i,j,it,ib,ie,ioff !*** ! matrix t_in is not needed !logical(logical1),dimension(n,k) :: t_in !*** integer(kind(1)),dimension(n,k) :: t_out !*** t_out=0 ! intialize t_out ioff=0 do i=1,n ib=1 do iw=1,words_per_row ioff=ioff+1 ie=min(ib+31,k) it=-1 do j=ib,ie it=it+1 !t_in(i,j)=btest(vec(ioff),it) !replace the preceding statement by if(btest(vec(ioff),it)) t_out(i,j)=1 end do ib=ie+1 end do end do end subroutine unpack eRm/src/registerDynamicSymbol.c0000755000175100001440000000034514375241637016306 0ustar hornikusers// RegisteringDynamic Symbols #include #include #include void R_init_markovchain(DllInfo* info) { R_registerRoutines(info, NULL, NULL, NULL, NULL); R_useDynamicSymbols(info, TRUE); } eRm/src/components.c0000755000175100001440000000411114375241637014147 0ustar hornikusers/* ###################################################################### # # components.c # # copyright (c) 2004, Carter T. Butts # Last Modified 11/26/04 # Licensed under the GNU General Public License version 2 (June, 1991) # # Part of the R/sna package # # This file contains routines related to the identification of # components. # ###################################################################### */ #include #include #include #include "components.h" void component_dist_R(double *g, double *pn, double *memb) /* Determine component memberships in g. The memberships are stored in memb, which must be a zero-initialized vector of length *pn. */ { char *visited; long int n,v,nod,i,s1count; double comp=0.0; /*Set up stuff*/ n=*pn; /*Allocate memory for visited list*/ visited=(char *)R_alloc(n,sizeof(char)); /*Cycle through each node, performing a BFS*/ for(v=0;v0*/ visited[nod]=3; /*Mark as visited*/ s1count--; memb[nod]=comp; /*Set membership to comp*/ for(i=v+1;i 0$. Furthermore, $\gamma_{r}^{(i)}$ are the first order derivatives of the $\gamma$-functions with respect to item $i$. The index $a$ in $\eta_a$ denotes the first derivative with respect to the $a^{th}$ parameter. For the second order derivative of $\log L_c$, two cases have to be distinguished: the derivatives for the off-diagonal elements and the derivatives for the main diagonal elements. The item categories with respect to the item index $i$ are coded with $h_i$, and those referring to item $l$ with $h_l$. The second order derivatives of the $\gamma$-functions with respect to items $i$ and $l$ are denoted by $\gamma_r^{(i,l)}$. The corresponding likelihood expressions are \begin{align} \label{eq:2dcml} \frac{\partial\log L_c}{\partial\eta_a \eta_b} = & -\sum_{i=1}^k \sum_{h_i=1}^{m_i} w_{ih_ia}w_{ih_ib}\epsilon_{ih_i} \sum_{r=1}^{r_{max}} n_r \frac{\log \gamma_{r-h_i}}{\gamma_r}\\ & -\sum_{i=1}^k \sum_{h_i=1}^{m_i} \sum_{l=1}^k \sum_{h_l=1}^{m_l} w_{ih_ia}w_{lh_lb} \left[\epsilon_{ih_i} \epsilon_{lh_l} \left( \sum_{r=1}^{r_{max}} n_r \frac{\gamma_{r}^{(i)}\gamma_{r}^{(l)}}{\gamma_r^2} - \sum_{r=1}^{r_{max}} n_r \frac{\gamma_{r}^{(i,l)}}{\gamma_r}\right)\right] \notag \end{align} for $a\neq b$, and \begin{align} \label{eq:2dcmlab} \frac{\partial\log L_c}{\partial\eta_a^2} = & -\sum_{i=1}^k \sum_{h_i=1}^{m_i} w_{ih_ia}^2 \epsilon_{ih_i} \sum_{r=1}^{r_{max}} n_r \frac{\log \gamma_{r-h_i}}{\gamma_r}\\ & -\sum_{i=1}^k \sum_{h_i=1}^{m_i} \sum_{l=1}^k \sum_{h_l=1}^{m_l} w_{ih_ia}w_{lh_la}\epsilon_{ih_i} \epsilon_{lh_l}\sum_{r=1}^{r_{max}} n_r \frac{\gamma_{r-h_i}^{(i)}\gamma_{r-h_l}^{(l)}}{\gamma_r^2} \notag \end{align} for $a=b$. To solve the likelihood equations with respect to $\hat{\bm{\eta}}$, a Newton-Raphson algorithm is applied. The update within each iteration step $s$ is performed by \begin{equation}\label{eq:iter} \hat{\bm{\eta}}_s=\hat{\bm{\eta}}_{s-1}-\bm{H}_{s-1}^{-1}\bm{\delta}_{s-1}. \end{equation} The starting values are $\hat{\bm{\eta}}_0=\bm{0}$. $\bm{H}_{s-1}^{-1}$ is the inverse of the Hessian matrix composed by the elements given in Equation \ref{eq:2dcml} and \ref{eq:2dcmlab} and $\bm{\delta}_{s-1}$ is the gradient at iteration $s-1$ as specified in Equation \ref{eq:dcml}. The iteration stops if the likelihood difference $\left|\log L_c^{(s)} - \log L_c^{(s-1)} \right|\leq \varphi$ where $\varphi$ is a predefined (small) iteration limit. Note that in the current version (\Sexpr{packageDescription("eRm", fields = "Version")}) $\bm{H}$ is approximated numerically by using the \pkg{nlm} Newton-type algorithm provided in the \pkg{stats} package. The analytical solution as given in Equation \ref{eq:2dcml} and \ref{eq:2dcmlab} will be implemented in the subsequent version of \pkg{eRm}. % % % \subsection[Mathematical properties of the CML estimates]{Mathematical properties of the \acronym{CML} estimates} \label{sec:mpcml} A variety of estimation approaches for \acronym{IRT} models in general and for the Rasch model in particular are available: The \emph{joint maximum likelihood} \acronym{(JML)} estimation as proposed by \citet{Wright+Panchapakesan:1969} which is not recommended since the estimates are not consistent \citep[see e.g.][]{Haberman:77}. The basic reason for that is that the person parameters $\bm{\theta}$ are nuisance parameters; the larger the sample size, the larger the number of parameters. A well-known alternative is the \emph{marginal maximum likelihood} \acronym{(MML)} estimation \citep{Bock+Aitkin:1981}: A distribution $g(\theta)$ for the person parameters is assumed and the resulting situation corresponds to a mixed-effects \acronym{ANOVA}: Item difficulties can be regarded as fixed effects and person abilities as random effects. Thus, \acronym{IRT} models fit into the framework of \emph{generalized linear mixed models} \acronym{(GLMM)} as elaborated in \citet{deBoeck+Wilson:2004}. By integrating over the ability distribution the random nuisance parameters can be removed from the likelihood equations. This leads to consistent estimates of the item parameters. Further discussions of the \acronym{MML} approach with respect to the \acronym{CML} method will follow. For the sake of completeness, some other methods for the estimation of the item parameters are the following: \citet{CAnd:07} propose a Pseudo-\acronym{ML} approach, \citet{Molenaar:1995} and \citet{Linacre:2004} give an overview of various (heuristic) non-\acronym{ML} methods, Bayesian techniques can be found in \citet[Chapter 7]{BaKi:04}, and for non-parameteric approaches it is referred to \citet{LeVe:86}. However, back to \acronym{CML}, the main idea behind this approach is the assumption that the raw score $r_v$ is a minimal sufficient statistic for $\theta_v$. Starting from the equivalent multiplicative expression of Equation \ref{eq1} with $\xi_v=\exp(\theta_v)$ and $\epsilon_i=\exp(-\beta_i)$, i.e., \begin{equation}\label{eq7} \P(X_{vi}=1)=\frac{\xi_v \epsilon_i}{1+\xi_v \epsilon_i}, \end{equation} the following likelihood for the response pattern $\bm{x}_v$ for a certain subject $v$ results: \begin{equation}\label{eq8} \P(\bm{x}_v|\xi_v,\bm{\epsilon})=\prod_{i=1}^k \frac{(\xi_v \epsilon_i)^{x_{vi}}}{1+\xi_v \epsilon_i}= \frac{{\theta_v}^{r_v} \prod_{i=1}^k {\epsilon_i}^{x_{vi}}}{\prod_{i=1}^k (1+\xi_v \epsilon_i)}. \end{equation} Using the notation $\bm{y}=(y_1,\ldots ,y_k)$ for all possible response patterns with $\sum_{i=1}^k y_i=r_v$, the probability for a fixed raw score $r_v$ is \begin{equation}\label{eq9} \P(r_v|\xi_v,\bm{\epsilon})=\sum_{\bm{y}|r_v} \prod_{i=1}^k \frac{(\xi_v \epsilon_i)^{x_{vi}}}{1+\xi_v \epsilon_i}=\frac{{\theta_v}^{r_v} \sum_{\bm{y}|r_v} \prod_{i=1}^k {\epsilon_i}^{x_{vi}}}{\prod_{i=1}^k (1+\xi_v \epsilon_i)}. \end{equation} The crucial term with respect to numerical solutions of the likelihood equations is the second term in the numerator: \begin{equation}\label{eq:gamma} \gamma_r(\epsilon_i) \equiv \sum_{\bm{y}|r_v} \prod_{i=1}^k {\epsilon_i}^{x_{vi}} \end{equation} These are the \emph{elementary symmetric functions} (of order $r$). An overview of efficient computational algorithms and corresponding simulation studies can be found in \citet{Li:94}. The \pkg{eRm} package uses the summation algorithm as proposed by \citet{And:72}. Finally, by collecting the different raw scores into the vector $\bm{r}$ the conditional probability of observing response pattern $\bm{x}_v$ with given raw score $r_v$ is \begin{equation}\label{eq:xraw} \P(\bm{x}_v|r_v,\bm{\epsilon})=\frac{\P(\bm{x}_v|\xi_v,\bm{\epsilon})}{\P(r_v|\xi_v,\bm{\epsilon})} \,. \end{equation} By taking the product over the persons (independence assumption), the (conditional) likelihood expression for the whole sample becomes \begin{equation}\label{eq:likall} L(\bm{\epsilon}|\bm{r})=\P(\bm{x}|\bm{r},\bm{\epsilon})=\prod_{v=1}^n \frac{\prod_{i=1}^k {\epsilon_i}^{x_{vi}}}{\gamma_{r_v}}. \end{equation} With respect to raw score frequencies $n_r$ and by reintroducing the $\beta$-parameters, (\ref{eq:likall}) can be reformulated as \begin{equation}\label{eq12a} L(\bm{\beta}|\bm{r})= \frac{\exp \left(\sum_{i=1}^k x_{+i}\beta_i \right)}{\prod_{r=0}^k\gamma_r^{n_r}}\,, \end{equation} where $x_{+i}$ are the item raw scores. It is obvious that by conditioning the likelihood on the raw scores $\bm{r}$, the person parameters completely vanished from the expression. As a consequence, the parameters $\bm{\hat{\beta}}$ can be estimated without knowledge of the subject's abilities. This issue is referred as \emph{person-free item assessment} and we will discuss this topic within the context of specific objectivity in the next section. Pertaining to asymptotical issues, it can be shown that under mild regularity conditions \citep{Pf:94} the \acronym{CML} estimates are consistent for $n\rightarrow \infty$ and $k$ fixed, unbiased, asymptotically efficient, and normally distributed \citep{Andersen:1970}. For the computation of a Rasch model, comparatively small samples are sufficient to get reliable estimates \citep{Fischer:1988}. Whether the \acronym{MML} estimates are unbiased depends on the correct specification of the ability distribution $g(\theta)$. In case of an incorrect assumption, the estimates are biased which is surely a drawback of this method. If $g(\theta)$ is specified appropriately, the \acronym{CML} and \acronym{MML} estimates are asymptotically equivalent \citep{Pf:94}. \citet{Fischer:1981} elaborates on the conditions for the existence and the uniqueness of the \acronym{CML} estimates. The crucial condition for the data matrix is that $\bm{X}$ has to be \emph{well-conditioned}. To introduce this issue it is convenient to look at a matrix which is \emph{ill-conditioned}: A matrix is ill-conditioned if there exists a partition of the items into two nonempty subsets such that all of a group of subjects responded correctly to items $i+1,\ldots,k$ ($\bm{X}_2$) and all of all other subjects failed for items $1,\ldots,i$ ($\bm{X}_3$), i.e., \begin{table}[h]\centering% \[ \bm{X}= \left( \begin{array}{c|c} \bm{X}_1 & \bm{X}_2\\ \hline \bm{X}_3 & \bm{X}_4\\ \end{array} \right) = \left( \begin{array}{ccc|ccc} & & & 1 & \ldots & 1 \\ & \bm{X}_1 & & \vdots & \ddots & \vdots \\ & & & 1 & \ldots & 1 \\ \hline 0 & \ldots & 0 & & & \\ \vdots & \ddots & \vdots & & \bm{X}_4 & \\ 0 & \ldots & 0 & & & \\ \end{array} \right) \] \end{table} Thus, following the definition in \citet{Fischer:1981}: $\bm{X}$ will be called \emph{well-conditioned} iff in every possible partition of the items into two nonempty subsets some subjects has given response 1 on some item in the first set and response 0 on some item in the second set. In this case a unique solution for the \acronym{CML} estimates $\hat{\bm{\beta}}$ exists. This issue is important for structurally incomplete designs which often occur in practice; different subsets of items are presented to different groups of persons $g=1,\ldots,G$ where $G\leq n$. As a consequence, the likelihood values have to be computed for each group separately and the joint likelihood is the product over the single group likelihoods. Hence, the likelihood in Equation \ref{eq12a} becomes \begin{equation}\label{eq:glik} L(\bm{\beta}|\bm{r})=\prod_{g=1}^G \frac{\exp \left(\sum_{i=1}^k x_{+i}\beta_i \right)}{\prod_{r=0}^k {\gamma_{g,r}}^{n_{g,r}}} \end{equation} This also implies the necessity to compute the elementary symmetric functions separately for each group. The \pkg{eRm} package can handle such structurally incomplete designs. From the elaborations above it is obvious that from an asymptotical point of view the \acronym{CML} estimates are at least as good as the \acronym{MML} estimates. In the past, computational problems (speed, numerical accuracy) involved in calculating the elementary symmetric functions limited the practical usage of the \acronym{CML} approach \citep[see e.g.][]{Gustafsson:1980}. Nowadays, these issues are less crucial due to increased computer power. In some cases \acronym{MML} estimation has advantages not shared by \acronym{CML}: \acronym{MML} leads to finite person parameters even for persons with zero and perfect raw score, and such persons are not removed from the estimation process \citep{Molenaar:1995}. On he other hand the consideration of such persons does not seem meaningful from a substantial point of view since the person parameters are not reliable anymore -- for such subjects the test is too difficult or too easy, respectively. Thus, due to these covering effects, a corresponding ability estimation is not feasible. However, if the research goal is to find ability distributions such persons should be regarded and \acronym{MML} can handle this. When estimates for the person parameters are of interest some care has to be taken if the \acronym{CML} method is used since person parameters cancel from the estimation equations. Usually, they are estimated (once having obtained values for the item parameters) by inserting $\hat{\bm{\beta}}$ (or equivalently $\hat{\bm{\epsilon}}$) into Equation \ref {eq8} and solving with respect to $\bm{\theta}$. Alternatively, Bayesian procedures are applicable \citep{Hoijtink+Boomsma:1995}. It is again pointed out that each person in the sample gets an own parameter even though limited by the number of different raw scores. % % % \subsection[CML and specific objectivity]{\acronym{CML} and specific objectivity} In general, the Rasch model can be regarded as a measurement model: Starting from the (nominally scaled) 0/1-data matrix $\bm{X}$, the person raw scores $r_v$ are on an ordinal level. They, in turn, are used to estimate the item parameters $\bm{\beta}$ which are on an interval scale provided that the Rasch model holds. Thus, Rasch models allow for comparisons between objects on an interval level. Rasch reasoned on requirements to be fulfilled such that a specific proposition within this context can be regarded as ``scientific''. His conclusions were that a basic requirement is the ``objectivity'' of comparisons \citep{Ra:61}. This claim contrasts assumptions met in \emph{classical test theory} \acronym{(CTT)}. A major advantage of the Rasch model over \acronym{CTT} models is the \emph{sample independence} of the results. The relevant concepts in \acronym{CTT} are based on a linear model for the ``true score'' leading to some indices, often correlation coefficients, which in turn depend on the observed data. This is a major drawback in \acronym{CTT}. According to \citet{Fisch:74}, sample independence in \acronym{IRT} models has the following implications: \begin{itemize} \item The person-specific results (i.e., essentially $\bm{\theta}$) do not depend on the assignment of a person to a certain subject group nor on the selected test items from an item pool $\Psi$. \item Changes in the skills of a person on the latent trait can be determined independently from its base level and independently from the selected item subset $\psi \subset \Psi$. \item From both theoretical and practical perspective the requirement for representativeness of the sample is obsolete in terms of a true random selection process. \end{itemize} Based on these requirements for parameter comparisons, \citet{Ra:77} introduced the term \emph{specific objectivity}: \emph{objective} because any comparison of a pair of parameters is independent of any other parameters or comparisons; \emph{specifically objective} because the comparison made was relative to some specified frame of reference \citep{Andrich:88}. In other words, if specific objectivity holds, two persons $v$ and $w$ with corresponding parameters $\theta_v$ and $\theta_w$, are comparable independently from the remaining persons in the sample and independently from the presented item subset $\psi$. In turn, for two items $i$ and $j$ with parameters $\beta_i$ and $\beta_j$, the comparison of these items can be accomplished independently from the remaining items in $\Psi$ and independently from the persons in the sample. The latter is crucial since it reflects completely what is called sample independence. If we think not only of comparing $\beta_i$ and $\beta_j$ but rather to estimate these parameters, we achieve a point where specific objectivity requires a procedure which is able to provide estimates $\hat{\bm{\beta}}$ that do not depend on the sample. This implies that $\hat{\bm{\beta}}$ should be computable without the involvement of $\bm{\theta}$. \acronym{CML} estimation fulfills this requirement: By conditioning on the sufficient raw score vector $\bm{r}$, $\bm{\theta}$ disappears from the likelihood equation and $L(\bm{\beta}|\bm{r})$ can be solved without knowledge of $\bm{\theta}$. This issue is referred to as \emph{separability of item and person parameters} \citep[see e.g.][]{Wright+Masters:1982}. Furthermore, separability implies that no specific distribution should be assumed neither for the person nor for the item parameters \citep{Rost:2001}. \acronym{MML} estimation requires such assumptions. At this point it is clear that \acronym{CML} estimation is the only estimation method within the Rasch measurement context fulfilling the requirement of \emph{person-free item calibration} and, thus, it maps the epistemological theory of specific objectivity to a statistical maximum likelihood framework. Note that strictly speaking any statistical result based on sample observations is sample-dependent because any result depends at least on the sample size \citep{Fischer:1987}. The estimation of the item parameters is ``sample-independent'', a term indicating the fact that the actually obtained sample of a certain population is not of relevance for the statistical inference on these parameters \citep[][p.\ 23]{Kubinger:1989}. % % % \subsection{Estimation of person parameters} \acronym{CML} estimation for person parameters is not recommended due to computational issues. The \pkg{eRm} package provides two methods for this estimation. The first is ordinary \acronym{ML} where the \acronym{CML}-based item parameters are plugged into the joint \acronym{ML} equation. The likelihood is optimized with respect to $\bm{\theta}$. \citet{And:95} gives a general formulation of this \acronym{ML} estimate with $r_v=r$ and $\theta_v=\theta$: \begin{equation}\label{eq17} r - \sum_{i=1}^k \sum_{h=1}^{m_i} \frac{h \exp(h \theta+\hat{\beta}_{ih})}{\sum_{l=0}^{m_i}\exp(h \theta_v+\hat{\beta}_{il})}=0 \end{equation} \citet{Warm:1989} proposed a weighted likelihood estimation \acronym{(WLE)} which is more accurate compared to \acronym{ML}. For the dichotomous Rasch model the expression to be solved with respect to $\bm{\theta}$ is \begin{equation} \P(\theta_v|\bm{x}_v, \hat{\bm{\beta}}) \propto \frac{exp(r_v\theta_v)}{\prod_i (1+exp(\theta_v-\hat{\beta}_i)}\sum_i p_{vi}(1-p_{vi}) \end{equation} Again, the item parameter vector $\hat{\bm{\beta}}$ is used from \acronym{CML}. This approach will implemented in a subsequent \pkg{eRm} version. Additional explanations and simulation studies regarding person parameter estimation can be found in \citet{Hoijtink+Boomsma:1995}. % % % % %----------------- end parameter estimation ----------------- \section{Testing extended Rasch models} \label{Gof} Testing \acronym{IRT} models involves two parts: First, item- and person-wise statistics can be examined; in particular item-fit and person-fit statistics. Secondly, based on \acronym{CML} properties, various model tests can be derived \citep[see][]{Glas+Verhelst:1995a, Glas+Verhelst:1995b}. % % % \subsection{Item-fit and person-fit statistics} Commonly in \acronym{IRT}, items and persons are excluded due to item-fit and person-fit statistics. Both are residual based measures: The observed data matrix $\bm{X}$ is compared with the model probability matrix $\bm{P}$. Computing standardized residuals for all observations gives the $n \times k$ residual matrix $\bm{R}$. The squared column sums correspond to item-fit statistics and the squared row sums to person-fit statistics both of which are $\chi^2$-distributed with the corresponding degrees of freedom. Based on these quantities unweighted (\textsl{outfit}) and weighted (\textsl{infit}) mean-square statistics can also be used to evaluate item and person fit \citep[see e.g.][]{Wright+Masters:1982}. % % % \subsection{A Wald test for item elimination} A helpful implication of \acronym{CML} estimates is that subsequent test statistics are readily obtained and model tests are easy to carry out. Basically, we have to distinguish between test on item level and global model tests. On item level, sample independence reflects the property that by splitting up the sample in, e.g., two parts, the corresponding parameter vectors $\hat{\bm{\beta}}^{(1)}$ and $\hat{\bm{\beta}}^{(2)}$ should be the same. Thus, when we want to achieve Rasch model fit those items have to be eliminated from the test which differ in the subsamples. This important issue in test calibration can be examined, e.g., by using a graphical model test. \citet{FiSch:70} propose a $\mathcal{N}(0,\,1)$-distributed test statistic which compares the item parameters for two subgroups: \begin{equation}\label{eq:wald} z=\frac{\beta_i^{(1)}-\beta_i^{(2)}}{\sqrt{Var_i^{(1)}-Var_i^{(2)}}} \end{equation} The variance term in the denominator is based on Fisher's function of ``information in the sample''. However, as \citet{Glas+Verhelst:1995a} point out discussing their Wald-type test that this term can be extracted directly from the variance-covariance matrix of the \acronym{CML} estimates. This Wald approach is provided in \pkg{eRm} by means of the function \code{Waldtest()}. % % % \subsection{Andersen's likelihood-ratio test} In the \pkg{eRm} package the likelihood ratio test statistic $LR$, initially proposed by \citet{And:73} is computed for the \acronym{RM}, the \acronym{RSM}, and the \acronym{PCM}. For the models with linear extensions, $LR$ has to be computed separately for each measurement point and subgroup. \begin{equation} \label{eq15} LR = 2\left(\sum_{g=1}^G \log L_c(\hat{\bm{\eta}}_g;\bm{X}_g)-\log L_c(\hat{\bm{\eta}};\bm{X})\right) \end{equation} The underlying principle of this test statistic is that of \textit{subgroup homogeneity} in Rasch models: for arbitrary disjoint subgroups $g=1,\,\ldots,\,G$ the parameter estimates $\hat{\bm{\eta}}_g$ have to be the same. $LR$ is asymptotically $\chi^2$-distributed with $df$ equal to the number of parameters estimated in the subgroups minus the number of parameters in the total data set. For the sake of computational efficiency, the \pkg {eRm} package performs a person raw score median split into two subgroups. In addition, a graphical model test \citep{Ra:60} based on these estimates is produced by plotting $\hat{\bm{\beta}}_1$ against $\hat{\bm{\beta}}_2$. Thus, critical items (i.e., those fairly apart from the diagonal) can be identified and eliminated. Further elaborations and additional test statistics for polytomous Rasch models can be found, e.g., in \citet{Glas+Verhelst:1995a}. \subsection{Non-parametric (``quasi-exact'') Tests} Based on the package \pkg{RaschSampler} by \citet{Verhelst+Hatzinger+Mair:2007} several Rasch model tests as proposed by \citep{Ponocny:2001} are provided. \subsection{Martin-Löf Test} Applying the LR-principle to subsets of items, Martin-Löf \citep[1973, see][]{Glas+Verhelst:1995a} suggested a statistic to evaluate if two groups of items are homogeneous, i.e., to test the unidimensionality axiom. %-------------------------- end goodness-of-fit ------------------ %---------------------------- APPLIED SECTION ---------------------------- \section{The eRm package and application examples} \label{sec:pack} The underlying idea of the \pkg{eRm} package is to provide a user-friendly flexible tool to compute extended Rasch models. This implies, amongst others, an automatic generation of the design matrix $\bm{W}$. However, in order to test specific hypotheses the user may specify $\bm{W}$ allowing the package to be flexible enough for computing \acronym{IRT}-models beyond their regular applications. In the following subsections, various examples are provided pertaining to different model and design matrix scenarios. Due to intelligibility matters, the artificial data sets are kept rather small. A detailed description in German of applications of various extendend Rasch models using the \pkg{eRm} package can be found in \citet{Poinstingl+Mair+Hatzinger:07}. \subsection{Structure of the eRm package} Embedding \pkg{eRm} into the flexible framework of \proglang{R} is a crucial benefit over existing stand-alone programs like WINMIRA \citep{Davier:1998}, LPCM-WIN \citep{FiPS:98}, and others. Another important issue in the development phase was that the package should be flexible enough to allow for \acronym{CML} compatible polytomous generalizations of the basic Rasch model such as the \acronym{RSM} and the \acronym{PCM}. In addition, by introducing a design matrix concept linear extensions of these basic models should be applicable. This approach resulted in including the \acronym{LLTM}, the \acronym{LRSM} and the \acronym{LPCM} as the most general model into the \pkg{eRm} package. For the latter model the \acronym{CML} estimation was implemented which can be used for the remaining models as well. A corresponding graphical representation is given in Figure \ref{fig:body}. \begin{figure}[hbt]\centering% \includegraphics[width=157mm, keepaspectratio=true]{UCML}% \caption{Bodywork of the \pkg{eRm} routine}% \label{fig:body}% \end{figure} An important benefit of the package with respect to linearly extended models is that for certain models the design matrix $\bm{W}$ can be generated automatically \citep[LPCM-WIN;][]{FiPS:98} also allows for specifying design matrices but in case of more complex models this can become a tedious task and the user must have a thorough understanding of establishing proper design structures). For repeated measurement models time contrasts in the \pkg{eRm} can be simply specified by defining the number of measurement points, i.e., {\tt mpoints}. To regard group contrasts like, e.g., treatment and control groups, a corresponding vector ({\tt groupvec}) can be specified that denotes which person belongs to which group. However, $\bm{W}$ can also be defined by the user. A recently added feature of the routine is the option to allow for structurally missing values. This is required, e.g., in situations when different subsets of items are presented to different groups of subjects as described in Section \ref{sec:mpcml}. These person groups are identified automatically: In the data matrix $\bm{X}$, those items which are not presented to a certain subject are declared as \code{NA}s, as usual in \proglang{R}. After solving the \acronym{CML} equations by the Newton-Raphson method, the output of the routine consists of the ``basic'' parameter estimates $\hat{\bm{\eta}}$, the corresponding variance-covariance matrix, and consequently the vector with the standard errors. Furthermore, the ordinary item parameter estimates $\hat{\bm{\beta}}$ are computed by using the linear transformation $\hat{\bm{\beta}}=\bm{W}\hat{\bm{\eta}}$. For ordinary Rasch models these basic parameters correspond to the item easiness. For the \acronym{RM}, the \acronym{RSM}, and the \acronym{PCM}, however, we display $\hat{\bm{\eta}}$ as $-\hat{\bm{\eta}}$, i.e., as difficulty. It has to be mentioned that the \acronym{CML} equation is solved with the restriction that one item parameter has to be fixed to zero (we use $\beta_1=0$). For the sake of interpretability, the resulting estimates $\hat{\bm{\beta}}$ can easily be transformed into ``sum-zero'' restricted $\hat{\bm{\beta}^*}$ by applying $\hat{\beta}_i^*=\hat{\beta}_i-\sum_i{\hat{\beta}_i}/k$. This transformation is also used for the graphical model test. % % % \subsection{Example 1: Rasch model} We start the example section with a simple Rasch model based on a $100 \times 30$ data matrix. First, we estimate the item parameters using the function \code{RM()} and then the person parameters with \code{person.parameters()}. <<>>= library("eRm") res.rasch <- RM(raschdat1) pres.rasch <- person.parameter(res.rasch) @ Then we use Andersen's LR-test for goodness-of-fit with mean split criterion: <<>>= lrres.rasch <- LRtest(res.rasch, splitcr = "mean") lrres.rasch @ We see that the model fits and a graphical representation of this result (subset of items only) is given in Figure \ref{fig:GOF} by means of a goodness-of-fit plot with confidence ellipses. <>= plotGOF(lrres.rasch, beta.subset=c(14,5,18,7,1), tlab="item", conf=list(ia=FALSE,col="blue",lty="dotted")) @ \begin{figure}[hbt]\centering% <>= <> @ \caption{Goodness-of-fit plot for some items with confidence ellipses.} \label{fig:GOF} \end{figure} To be able to draw confidence ellipses it is needed to set \code{se = TRUE} when computing the LR-test. % % % \subsection[Example 2: LLTM as a restricted Rasch model]{Example 2: \acronym{LLTM} as a restricted Rasch model} As mentioned in Section \ref{Rep}, also the models with the linear extensions on the item parameters can be seen as special cases of their underlying basic model. In fact, the \acronym{LLTM} as presented below and following the original idea by \citet{Scheib:72}, is a restricted \acronym{RM}, i.e. the number of estimated parameters is smaller compared to a Rasch model. The data matrix $\bm{X}$ consists of $n=15$ persons and $k=5$ items. Furthermore, we specify a design matrix $\bm{W}$ (following Equation \ref{eq4}) with specific weight elements $w_{ij}$. <<>>= W <- matrix(c(1,2,1,3,2,2,2,1,1,1),ncol=2) res.lltm <- LLTM(lltmdat2, W) summary(res.lltm) @ The \code{summary()} method provides point estimates and standard errors for the basic parameters and for the resulting item parameters. Note that item parameters in \pkg{eRm} are always estimated as easiness parameters according to equations \ref{eq1} and \ref{eq2} but not \ref{eq:rasch}. If the sign is switched, the user gets difficulty parameters (the standard errors remain the same, of course). However, all plotting functions \code{plotGOF}, \code{plotICC}, \code{plotjointICC}, and \code{plotPImap}, as well as the function \code{thresholds} display the difficulty parameters. The same applies for the basic parameters $\eta$ in the output of the \acronym{RM}, \acronym{RSM}, and \acronym{PCM}. % % % \subsection[Example 3: RSM and PCM]{Example 3: \protect\acronym{RSM} and \protect\acronym{PCM}} Again, we provide an artificial data set now with $n=300$ persons and $k=4$ items; each of them with $m+1=3$ categories. We start with the estimation of an \acronym{RSM} and, subsequently, we calculate the corresponding category-intersection parameters using the function \code{thresholds()}. <<>>= data(pcmdat2) res.rsm <- RSM(pcmdat2) thresholds(res.rsm) @ The location parameter is basically the item difficulty and the thesholds are the points in the \acronym{ICC} plot given in Figure \ref{fig:ICC} where the category curves intersect: <>= plotICC(res.rsm, mplot=TRUE, legpos=FALSE,ask=FALSE) @ \begin{figure}[hbt]\centering% <>= <> @ \caption{\acronym{ICC} plot for an \acronym{RSM}.} \label{fig:ICC} \end{figure} The \acronym{RSM} restricts the threshold distances to be the same across all items. This strong assumption can be relaxed using a \acronym{PCM}. The results are represented in a person-item map (see Figure \ref{fig:PImap}). <>= res.pcm <- PCM(pcmdat2) plotPImap(res.pcm, sorted = TRUE) @ \begin{figure}[hbt]\centering% <>= <> @ \caption{Person-Item map for a \acronym{PCM}.} \label{fig:PImap} \end{figure} After estimating the person parameters we can check the item-fit statistics. <<>>= pres.pcm <- person.parameter(res.pcm) itemfit(pres.pcm) @ A likelihood ratio test comparing the \acronym{RSM} and the \acronym{PCM} indicates that the \acronym{PCM} provides a better fit. %Since none of the items is significant we can conclude that the data fit the \acronym{PCM}. <<>>= lr<- 2*(res.pcm$loglik-res.rsm$loglik) df<- res.pcm$npar-res.rsm$npar pvalue<-1-pchisq(lr,df) cat("LR statistic: ", lr, " df =",df, " p =",pvalue, "\n") @ % % % \subsection[An LPCM for repeated measurements in different groups]{An \protect\acronym{LPCM} for repeated measurements in different groups} The most complex example refers to an \acronym{LPCM} with two measurement points. In addition, the hypothesis is of interest whether the treatment has an effect. The corresponding contrast is the last column in $\bm{W}$ below. First, the data matrix $\bm{X}$ is specified. We assume an artificial test consisting of $k=3$ items which was presented twice to the subjects. The first 3 columns in $\bm{X}$ correspond to the first test occasion, whereas the last 3 to the second occasion. Generally, the first $k$ columns correspond to the first test occasion, the next $k$ columns for the second, etc. In total, there are $n=20$ subjects. Among these, the first 10 persons belong to the first group (e.g., control), and the next 10 persons to the second group (e.g., treatment). This is specified by a group vector: <<>>= grouplpcm <- rep(1:2, each = 10) @ Again, $\bm{W}$ is generated automatically. In general, for such designs the generation of $\bm{W}$ consists first of the item contrasts, followed by the time contrasts and finally by the group main effects except for the first measurement point (due to identifiability issues, as already described). <<>>= reslpcm <- LPCM(lpcmdat, mpoints = 2, groupvec = grouplpcm, sum0 = FALSE) model.matrix(reslpcm) @ The parameter estimates are the following: <<>>= coef(reslpcm, parm="eta") @ Testing whether the $\eta$-parameters equal 0 is mostly not of relevance for those parameters referring to the items (in this example $\eta_1,\,\ldots,\,\eta_8$). But for the remaining contrasts, $H_0: \eta_9=0$ (implying no general time effect) can not be rejected ($p=.44$), whereas hypothesis $H_0: \eta_{10}=0$ has to be rejected ($p=.004$) when applying a $z$-test. This suggests that there is a significant treatment effect over the measurement points. If a user wants to perform additional tests such as a Wald test for the equivalence of two $\eta$-parameters, the \code{vcov} method can be applied to get the variance-covariance matrix. % % % % % \section{Additional topics} This section will be extended successively with new developments and components which do not directly relate to the modeling core of \pkg{eRm} but may prove to be useful add-ons. % % % \subsection{The eRm simulation module} A recent \pkg{eRm} development is the implementation of a simulation module to generate 0-1 matrices for different Rasch scenarios. In this article we give a brief overview about the functionality and for more detailed descriptions (within the context of model testing) it is referred to \citet{Mair:2006} and \citet{Suarez+Glas:2003}. For each scenario the user has the option either to assign $\bm{\theta}$ and $\bm{\beta}$ as vectors to the simulation function (e.g., by drawing parameters from a uniform distribution) or to let the function draw the parameters from a $\mathcal{N}(0,1)$ distribution. The first scenario is the simulation of Rasch homogenous data by means of the function \code{sim.rasch()}. The parameter values are plugged into equation \ref{eq:rasch} and it results the matrix $\bm{P}$ of model probabilites which is of dimension $n \times k$. An element $p_{vi}$ indicates the probability that subject $v$ solves item $i$. In a second step the matrix $\bm{P}$ has to be transformed into the 0-1 data matrix $\bm{X}$. The recommended way to achieve this is to draw another random number $p^{\star}_{vi}$ from a uniform distribution in $[0;1]$ and perform the transformation according to the following rule: \begin{equation*} x_{vi} = \left\{ \begin{array}{rl} 1 & \text{if } p^{\star}_{vi} \leq p_{vi}\\ 0 & \text{if } p^{\star}_{vi} > p_{vi}\\ \end{array} \right. \end{equation*} Alternatively, the user can specify a fixed cutpoint $p^{\star}:=p^{\star}_{vi}$ (e.g., $p^{\star} = 0.5$) and make the decision according to the same rule. This option is provided by means of the \code{cutpoint} argument. Caution is advised when using this deterministic option since this leads likely to ill-conditioned data matrices. The second scenario in this module regards the violation of the parallel \acronym{ICC} assumption which leads to the two-parameter logistic model (2-\acronym{PLM}) proposed by \citet{Birnbaum:1968}: \begin{equation}\label{eq:2pl} \P(X_{vi}=1)=\frac{\exp(\alpha_i(\theta_v - \beta_i))}{1+\exp(\alpha_i(\theta_v-\beta_i))}. \end{equation} The parameter $\alpha_i$ denotes the item discrimination which for the Rasch model is 1 across all items. Thus, each item score gets a weight and the raw scores are not sufficient anymore. The function for simulating 2-\acronym{PL} data is \code{sim.2pl()} and if $\bm{\alpha}$ is not specified by the user by means of the argument \code{discrim}, the discrimination parameters are drawn from a log-normal distribution. The reasons for using this particular kind of distribution are the following: In the case of $\alpha_i = 1$ the \acronym{ICC} are Rasch consistent. Concerning the violations, it should be possible to achieve deviations in both directions (for $\alpha_i > 0$). If $\alpha_i > 0$ the \acronym{ICC} is steeper than in the Rasch case and, consequently, if $\alpha_i < 1$ the \acronym{ICC} is flatter. This bidirectional deviation around 1 is warranted by the lognormal distribution $LN(\mu,\sigma^2)$ with $\mu = 0$. Since it is a logarithmic distribution, $\alpha_i$ cannot be negative. The degrees of model violation can be steered by means of the dispersion parameter $\sigma^2$. A value of $\sigma^2 = .50$ already denotes a strong violation. The lower $\sigma^2$, the closer the values lie around 1. In this case the $\alpha_i$ are close to the Rasch slopes. Using the function \code{sim.xdim()} the unidimensionality assumptions is violated. This function allows for the simulation of multidimensional Rasch models as for instance given \citet{Glas:1992} and \citet{Adams+Wilson+Wang:1997}. Multidimensionality implies that one single item measures more than one latent construct. Let us denote the number of these latent traits by $D$. Consequently, each person has a vector of ability parameters $\bm{\theta}_v$ of length $D$. These vectors are drawn from a multivariate normal distribution with mean $\bm{\mu} = \bm{0}$ and VC-matrix $\bm{\Sigma}$ of dimension $D \times D$. This matrix has to be specified by the user with the argument \code{Sigma}. In order to achieve strong model violations, very low correlations such as .01 should be provided. To specify to which extend item $i$ is measuring each of the $D$ dimensions, a corresponding vector of weights $\bm{z}_i$ of length $D$ is defined. If the resulting $k \times D$ matrix $\bm{Z}$ is not provided by the user, \code{sim.xdim()} generates $\bm{Z}$ such that each $\bm{z}_i$ contains only nonzero element which indicates the assigned dimension. This corresponds to the \emph{between-item multidimensional model} \citep{Adams+Wilson+Wang:1997}. However, in any case the person part of the model is $\bm{z}_i^T \bm{\theta}_v$ which replaces $\theta_v$ in Equation \ref{eq:rasch}. Finally, locally dependent item responses can be produced by means of the function \code{sim.locdep()}. Local dependence implies the introduction of pair-wise item correlations $\delta_{ij}$. If these correlations are constant across items, the argument \code{it.cor} can be a single value $\delta$. A value $\delta = 0$ corresponds to the Rasch model whereas $\delta = 1$ leads to the strongest violation. Alternatively, for different pair-wise item correlations, the user can specify a VC-matrix $\Delta$ of dimension $k \times k$. The formal representation of the corresponding \acronym{IRT} model is \begin{equation} \P(X_{vi}=1|X_{vj}=x_{vj})=\frac{\exp(\theta_v - \beta_i + x_{vj}\delta_{ij})}{1+\exp(\theta_v-\beta_i + x_{vj}\delta_{ij})}. \end{equation} This model was proposed by \citet{Jannarone:1986} and is suited to model locally dependent item responses. % % % % % \section{Discussion and outlook} \label{sec:disc} Here we give a brief outline of future \pkg{eRm} developments. The \acronym{CML} estimation approach, in combination with the \acronym{EM}-algorithm, can also be used to estimate \textit{mixed Rasch models} (MIRA). The basic idea behind such models is that the extended Rasch model holds within subpopulations of individuals, but with different parameter values for each subgroup. Corresponding elaborations are given in \citet{RoDa:95}. In Rasch models the item discrimination parameter $\alpha_i$ is always fixed to 1 and thus it does not appear in the basic equation. Allowing for different discrimination parameters across items leads to the two-parameter logistic model as given in Equation \ref{eq:2pl}. In this model the raw scores are not sufficient statistics anymore and hence \acronym{CML} can not be applied. 2-\acronym{PL} models can be estimated by means of the \pkg{ltm} package \citep{Riz:06}. However, \citet{Verhelst+Glas:1995} formulated the one parameter logistic model \acronym{(OPLM)} where the $\alpha_i$ do not vary across the items but are unequal to one. The basic strategy to estimate \acronym{OPLM} is a three-step approach: First, the item parameters of the Rasch model are computed. Then, discrimination parameters are computed under certain restrictions. Finally, using these discrimination weights, the item parameters for the \acronym{OPLM} are estimated using \acronym{CML}. This is a more flexible version of the Rasch model in terms of different slopes. To conclude, the \pkg{eRm} package is a tool to estimate extended Rasch models for unidimensional traits. The generalizations towards different numbers of item categories, linear extensions to allow for introducing item covariates and/or trend and optionally group contrasts are important issues when examining item behavior and person performances in tests. This improves the feasibility of \acronym{IRT} models with respect to a wide variety of application areas. % % % % % \bibliography{eRmvig}% \newpage% \rotatebox[origin=c]{90}{\includegraphics[width=1.1\textheight]{eRm_object_tree.pdf}}% % % % \end{document} eRm/vignettes/UCML.pdf0000755000175100001440000011736614375241640014305 0ustar hornikusers%PDF-1.5 % 3 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream x͖o0WcJjyM@LD t@@gC!N<8ϗ}γ~o|%4qJK"hL8%ÒS2V㴥*[嬗‰JẺ*q2%'iKU8)Y/ՅS+g4srk܄%''*-U*gT'N.*N\V899TgT'V=sּYfݙcnxGPZ!6:33a&u&:P9gJ2ڦ8mSM4R׆d#0F4Rd*SQF)KWoH&oTC):G N=ΊtF0 7".:!='脡d gp5dp?mxvcj:ΧpAמYN3w9aM-v:Pli:6 [dq,aM|M7E_ endstream endobj 4 0 obj 843 endobj 2 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Font << /f-0-0 5 0 R /f-1-0 6 0 R /f-2-0 7 0 R >> >> endobj 8 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 444 152 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 2 0 R >> endobj 9 0 obj << /Length 10 0 R /Filter /FlateDecode /Length1 11276 >> stream x9kxE{$3dd2@,p#3H$"A0D^tJNdE]EVY'{g&${_SuSU9u*f~.й o_#?8*4/^w o/_wKMo>K}޹!m$8 ^b͝Cvsƶ|F8W4lXgߋ,W75o# `(Sր/j+NJ.bU_,D^-&}Y:j)!.}Ũ~ߑ|z&c姍LSҚ>j͘nfSӺ֭}EC6jI* $)$EKNXDy6Y1mbjEDԺsxnBG5J+$M4ŖD@$a9Q +Ql6,je$sݮ#߾`"'89 ~BhЕе>*EsIؐzCPVVZF+-qYNII$3=H(wFZU хnj),p@Zpߟ~7[0n߶UM3۾_A=]v0*GJ3(L.+IvY/gBW} 6j}/ V4֕q+cfI0t2KgY3KbK¬Na׌YW3&n➖μ*S_Nt-O&U!ݍX_A^oKJsl:/%6*Fh0r[3ftd0nz=@V0848QHq\c0+7?9]tZ͜c|磝SVLBw_>j;Вލy3.?E^R LJQcܕdgβ؊Ia鬧ǣyx٘rz "\6-ɚ4I4It(cѽnIaf0;--YD-M339LoaY,<̗,<=sz=DA"9l_t8y(n}늁)||y8ex4,к Y6- R\-,BzTYV(!p hAAfgaAԯBGa*.xJuEA};6?O ϐ̝NiyPUԂ{o[QQ{1iqpkc5&2%{.6J+jꔢ vbg10q^*AE+hef%fV1}sE+T_` eJ|ފ #n))Rnazt|juY~L vN%8R .8޹ &-pMG/^nND.F=ъ֞ddN@ ~1ȶ|Bn#ă(q1z*2XH9‰YD̦&B5565H|bH$6hf`X#⨌sS*=1S)b'4ه"3 1;>Bn-`x Un2Oęyx}|`H0|Y ӌ4K;f0`z3I]abKgg'3gKxdP]a4T<9x441,Mg8Esu0X+Fc495S%U;]UyyYR5˳°´HZ\Z乃&Pcɺk24[n//:K 82RADjS3218r:/>苒!u٭$e .|Nd0Kfh$ITHI] &S3xc!I?FXK?X(8q{F^G=ï _ _#T=c]aUż:40۴ē01 c6='|tOm}=j`{Ǧ4 q{߇WO>Ilo^~@ɱӰ )I424;zBߗHy+{( H_9'ȣ1|W}?|x$z)S ;4tӐ?A꾥Eg5 Gp#K98/tA' nG ތ0 _BҴNȇ?iQ;yO17qocM+a;A[ <? p4VvkOϡ{. B|OkC{F`p6AɟjD[}ԁptQT%B=,}p&0Oq'Q5KSxO<$\Ս}ehP[8K7tj(0(s`j43w ?I+} 6 tOZ:q3w,E{?@B3ܓw- =Ggb/I C>t>}~%؈_}3,|Ed,In"K=d3&gEZNk[l!b_]K}J+Q˺ 1+?Cw=N /I'r|D>%_(.c* Yjz },~ù,.čJ00!Ο5saaYË˂U7joKߞNCHE|P7 #MhtK&22 }̖?uG+\Bmԫ|M'L*-'rΥrdkp=ʽ}ƛy?ϯ??13nO,1q8SwGsΓp^IZȧ7a7b҃d tlÝx:L|m OTRMf2:*6?U)zmow V^N/s#:˝o&nKf``?(<ϭ"aZ`θ xyB ) _spuB11^\[dv@!>_nMRkt)ߊ{k'Pu%$pxsKfj>M/f%abH-= x?0ÜvWQTx0rnbc1؛)(,6$:7 jbM #0lN8H6ݍWL\9 $mmEk1p Z?l(Ӷiv/,q)\7Mm$<Ԟ| K0E4!J,m ԷbʯP&X;\)J.*,52yÆsY~ٗ9ěqRSɞdZ&(xȫ Lj`S`@#TI˨r.&TPTbJ$R('Wdte@3^jO]:nCrgIJt֪JbT4GAق1hn# DGj\ RUjZir9U3*3t C'"{ΕV"Ganm}RP. v 4tn0a'~AcN \9 n]ҫe fc9^ovSgcbbbb&yڙSaV]\.TKB_;!x=@9!NQ8gGv` Quէus((7S^'7ơI?!釰0cYK<Ne#@ ?a)Y$%(}Kv.bwQۋK t$G|9qĝG(}QA4F1. &@!՞3 ^w!߁593aBB3;]T2,%Bx @0ҳ8MiN[pOW ^N_װ}=G#·e>Bt;zf/9qcp sçz x2Y#İ/R%g/6Yܱ1V؆+wmD#Ɗe"8w>bNA (}졾N@+݁Vt7<\>%4<9J"IduAۃy$:{7J=IHyw)ǃQQY=wJ݈}:;wWg47`Kfx><++If}F 2G%O#։1b'E8DSNdL2Zf(y#51%(!,u\#UIڽف(1HTg5TLTdž6K-U⌛FJ౮.J4Fڔ.]@c V۴=2OsdR r(XDՆX#G3)Jb<3qdG`"֬mY _ >HZ> stream x]n E|,E$*YHU`\ }yDܡy0:}V@i#=vaYR7 (b(52eI5ON@y^_ױ͹\c Qq/ܽfq~!49˗:.s3#髊A#hZW:vVU۲MT\RzΉےL.oަӚ}tw$}κ} endstream endobj 12 0 obj 255 endobj 13 0 obj << /Type /FontDescriptor /FontName /SRMKFP+ArialMT /FontFamily (Arial) /Flags 32 /FontBBox [ -664 -324 2000 1039 ] /ItalicAngle 0 /Ascent 905 /Descent -211 /CapHeight 1039 /StemV 80 /StemH 80 /FontFile2 9 0 R >> endobj 5 0 obj << /Type /Font /Subtype /TrueType /BaseFont /SRMKFP+ArialMT /FirstChar 32 /LastChar 117 /FontDescriptor 13 0 R /Encoding /WinAnsiEncoding /Widths [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 277 0 0 222 0 0 0 0 556 556 0 0 0 0 277 556 ] /ToUnicode 11 0 R >> endobj 14 0 obj << /Length 15 0 R /Filter /FlateDecode /Length1 23684 >> stream xݼy|[?R7rJʳVi '-]]~M6Y"r}U()N vD΍,^|_[ז\0n#DJKEp~57,s*^JI" zV#Ov9s9v4jM+tS;۪Y*J:KU[fWE}1*FՖ^Шj% a+Ց0&kqPC0>*<>4>|6JP E#bOϪ+>,tM; VTBU-&Q]7d/J:*sJm:%p0"P#UuVh*£He UM+O|@5hW)">?"]w]ꥶ*.( 'TWۂ逖'yμ<^"(WWM0&Dد;TYfa{UMӧ;.7L9>oUDuu~XSw䯍/*_Hh=(J\ |Iyj8uJW} ϪwJhnkU{Dm^;7/߭Bn= C1SI! +.kLr.յۥH66TnL6Id'^"/ŕ+nD+IOީ[ez;UTiefkswpB'*&֞/ˁ\TըTjEʣJtM0MMzj*0T, To;V^I+ST+41 Tx_-p.;TQEdRQJE*VʕyXUj6h0J(ɫ2X]~̛ːw=qPjYPR\̔ soYiҕ&SҤm-qFՉuqZkKpfn v\q$,wanZsQhJ(JBy0; &URUQ+[mqZVh~b_?a#8GzW5" EqUZ=֐8rdNVGGyn]+j5p]ꄖۉ 9"!Y ].rnpP10ĔJDDJ'8DgufefY@U,;B@1xl+˴b@oyz|8"߰>0'y͏kI p#1iDǟh#Q[4MM$NtH֖-eGyQ,є8as^iwePů+ɗEPt4~L>U:kEw^G_Pqe.zrnIek,Gup7H@vŨ,Ŭd6.9WvZfKs iIt2lٮL_Jt=_Fr\"erD.WbJRT+q+JceH<KT&ՉxƜ0&L9챜#sv;MYlX-QK25\Z*s+nBgNB#i0@U_TCTjJ~o*QUT+L sH=ișk2`֍Xm&f&<8:yI [#%/KHMNڢUWbBojoaDJJ$1kd%z׫QEi,'L Pt zNVIpjhv>:Hw}050KLL 0=L|D&y' qEq$r0qxJob~HXYg2cB.׸Z-3V5KW`n@akz*cxHmm/ HUpCijMXUpb%*G ٍ&> O=BäDNj GvَD zaBZǍKN#,\^O7녺rڊu "0 tlPQ ,լfݸliNycZkH ޴._m2V>ĸl} K}Sr7! ec̨MFL{b=fW]}SpsŲ7y$gW=Xj ۾ 65l 2ux êS|Luי1A:I aՃuab9Y'',J, ف <<ZرoI'#ɻi0qcnhs_. T煳!Qsr XL(mRY(ζ`> v-b`G@C|cbشtFx}=C60z3~.9+(,b YX^Cιqy@.ўz7QFn\q`WrָBxNlܢޜ?8ھ9y,dNP0=Gu!CГǸ| ZaBw}: gɤ{ڜb?&cfǧ?e?uɈUQQq< T(j?{HCNo pHvB|u:r$NG:l m9R`A4'ThQ`E*#K$W :c7Ž^?#D?{.OȥXAAH?!L%tCfu` ;8i?VĶ^q! ΥII/y|Ȭ;aN/YA;b@a€ |,P9P:= c2 L=ցt875-/@9,yϱ ֟JA1|= T䜾cҟt٘z]^UNHT)k,L!Ք깍}~03Fp-%-sJ=}yv廼ozaO)N-7+Vlo\10UͰm <ڑsfײs@$^&5(l>GsҌOgZ,1vړ޷˱:ٮe_eLHIƆI!TvS |ѲoLee&}&rMaa3yN^,?\T}7#CΔSp:795v0=|?l g"Gga4DK- ׄyp* ۚ0fuhiD+PuAĪ5'Q-F&txMyf9Ijc">ImjOliGi9 @'[+:>.l;mfItva@{pXZ؟ )̗/j6MX:弁 NVWj8YA'+doG]Es}WUZ9j0&r,YeyITLȿqI3,sUHޔFCRJof'5 ; 50?]:̵:!+͉U +i,:^R eb?#~T I3D:2u c᪠21,H$k//*#Amy=|V #1 vk1zFk"n E=Ch\(;ESj.Ba.gu*+NA>|}3~OKGuyrX;ъ:G,4267n~/rcŝSg>&oԈ*ț_=' 1gC;?Ss ]W?׼zcGO-\+ >b|8ُZ˅%Ŧ ,+시:G4Yll y^8 a<7 Ѱ)^g@0|djV~(:mhAO.&XXqL#[oIޔp oվGvp3k>M>fᬁKy3?{gI'y. }j;_-WǪj.`}Fƴ/{vq`_mV@r=qp"rJ^g;4خ;嬪a)QMى0P+Cl@A2T1KkV D6_ ~0C*sp346B cC.݋Hz'WuZewrGU̕++a]WmP MQ2Y<1Y[j\{xs|ά]lթ5G6~-RzUwܕJ:)\O/`2~V2@8 cacYV|T >K!=>BOt7?fhؔc kR9,vYtZQe,O2 #G sr5qf{#17q~*2 +^DzWr&ӧ _f9E}FJ2%5p ~%VC6~ÜE[yan5ˏ?'dJk}%co<6&v_3/=˗u_//)P{3;V>lLD!-㣢Or|4Ơ0ضԾ8wIWf]ڧ*["ǝm&Z];iΖR> ɕa˧@8L;Ts tӹ H>|hsaJr8kfUga1o"vu!& K2΄!#ClV2K/66Czjp}d/>*.&ys]3S<8#vvwرC7>M>s4zCd??\#57~>lצyL{UST veĿfCf:Y-Mv6ߐcp}ͦ-ݪK'@(=5nfGS_0qm{=w?j"XqF8ɕɭuɅx>C.YB FU)hgt~?1:)QeXPM]>hh Vj)ET]U첤$\ET9W)UBհpj*T->USAuQ=gX$@lCm7Y(dgq@zԢK>0Dkb7uǷXk֋U~gv{U$\)˶NlK% N8bPp2t䎎m*6kB<ĶN:c}swƒ >tXRN{əTI \?y .Sw$=_U-N߽Eʼnu$lKp2GslmGI! 5C!AׄS6,>ngOsh{l9B ៹rP+ ԂOַwB'_3%Ic-iS-2(S2_X`b.2톧{e+P$EEM\u̐oߪ-Bw |gJ߿_?\t[_"/?p]W9c%*lM![j_p%YN/*]1*zY%ŗO~֛>,jjvNqh(GzTN>uZ[-k-:KZyB#VI\ǠkV{az`[EHlJt26-iB-,;<JTt갧UF2Vˈ*f|gD1'ͳo"f͉znf}n޷ݗVwV墼e}mk&grǓЈDY^tBWxǫ~{3,6d´*޻a ͽ{f YKRt]@/ۄW?a9&O S)j:!L~N-Gz-߫F__kyH"'O=:=9;BؿlJ?zEĀdc$b=|Px>朤F2ky~((+g EgO{:]橷ǀ$7;0VHHM H p6/W+OL"yݍ++!4!Mi>v!˜Rj*In$SO0QɅj}CjR{!GNnK=z,@V ?4פ6,ri y4ZL:΃x3}L.hsgİJRJS< iAfwXbW+qc@O#!d }cFo3|^$_85gi@ <%ZjƄұޔ>*HJڛ4W&Щ&H0f Hn_ǐ!-FFг:w1ӟ$): Cwcߥ_W+=>WX"\%<*(,Yb>OlcL׉~/S\chšIŚ4k~٫Jۮ=K{ΦE1c9vjhG1`͊B#v~N^tR~3~בУB c:FDa1$[zr | Le$~_F}Ў.̴wo» d)=7VR(%Ar  ãU5T{-ׯk&Iva3-tVR.zyJLrn6|gq1l#+;VFLɹD.J y"8ml&~Bae.4N&i}pݮ{P -n'6M@G~zkꜱs`Ӯ"5%sQ{ٳf1}9ve|5zXy[pJ %5gDY< NIKHrzNjɧTQrJꉒTHC\n ]AyΛэ9yaMG PCns-kOnKNYl}[_+ۚej ,6EVSY%[idB^[Vѫ'ږt[Ybmd׌@'Z- 'I9i"IZzF^^l\˰D-8;).a"L"I },gxN38sz_4#& VəӶ>IKtYi3um2c;mit~퉼L(- /\H' H9 O%yѰQ)THS _VNf89Y-d}uϼ^D5aayכNHJCdv(iА2'"'-}! t葻2XapC A^gFsCɼJ ׾ì)[96R(iaghmc=q!H }PrpdC/A< N͌_dgҞҚHW;A bJS'E˃A! 5 zS>fU}!eC0Urr>A_Dd)Ay Se)~ƕt8cC~r-=eH [[UzӬy%BfwokZ2Q*T"2ic0$x*!PϹ|64}vUt"o?#oe nޘe =;Cge mІ ehaC75`&?~1>5e` 0M 0 ?bGyar8-e` -2&Usa AP>ԺC 2 P]rEλP}[ر41 Оŗ08~Awh_ A C>m6om6joۼ1Q7$.ja֦Jͷ@ZB-\/1H;HT3rH3J4㕛Vl#olR: qFrN2V ՀOC+1fbĊy"ĊpjVA$C9n.P TTU(9d/^ה%}O򇦴gM61OXy G!~Z !_;m1 rdh1TfCc<1/B碇i z܀п(Y! 0Ku"̀ՀUJ@`zxF_ d@͠6 M_x#2丝z5+Ů]]{tewe?Oȵ(6k{mfw\|mvӵufO6[AX (c 878>e}a(ѡ@#PP|džq aO ԟ f, Ԁ, T4Z@_5TX}ß `iC<+˿:/I #tʜcq0ݮV7JO)o*o 77zn `2 : ._~$Ft5<, Avp 94aڬf:-s!v<6+8LM3%fO#f7G.vMKgMKΚ1{XhLN$3ytgkO2̃Ô \ gƒg(ߓ6OLF%]to{=%abI7R3֞\p%muSZe)u2xw]OmzԳiI6&LD:M5mVw2ŋe0ks u0-BG rPA7r$ʑ YbF ymmn ˴2rz-̖L1]&pJZe9(S_)2س?fd&:i I -%7YJ/$:d p ӑ`uo'װ֭dMkŭC3ՙm=:&Vqv[Kչ[WNk%㵒T;9LHsO˹iM2A=Ni`2WI׵;dEz`s2M&gYvMr];)>ɒl 67Ks7%x%孧q\KO4&g.8Bv.%]Ed5m "Ax-_r)J\J[4eF? endstream endobj 15 0 obj 15315 endobj 16 0 obj << /Length 17 0 R /Filter /FlateDecode >> stream x]j0EYGHJlijY_LH eF}iBg f2߼B2(@jEq0w۲Z3Gu g\VY>E{~};s?8]!4woyp?>*69Hjָ^:Ii"]e0P$)&pƜkG\tE\q\\%' q/|"XI=boDi"\K$%뒿>/)[*> u>ϟ&?Z|7;r jd endstream endobj 17 0 obj 321 endobj 18 0 obj << /Type /FontDescriptor /FontName /PFNLTY+CourierNewPS-BoldMT /FontFamily (Courier New Bold) /Flags 32 /FontBBox [ -191 -710 701 1221 ] /ItalicAngle 0 /Ascent 832 /Descent -300 /CapHeight 1221 /StemV 80 /StemH 80 /FontFile2 14 0 R >> endobj 6 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PFNLTY+CourierNewPS-BoldMT /FirstChar 32 /LastChar 118 /FontDescriptor 18 0 R /Encoding /WinAnsiEncoding /Widths [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 0 0 0 0 0 0 0 0 600 600 0 0 600 0 600 600 600 0 0 600 600 0 0 0 0 0 0 0 0 0 0 600 0 600 0 600 0 600 0 0 0 600 600 600 600 0 600 600 600 600 600 ] /ToUnicode 16 0 R >> endobj 19 0 obj << /Length 20 0 R /Filter /FlateDecode /Length1 17600 >> stream x{y|SU9nYo]rI۴)P-]+RVR@ Q\J,CmfpG8cGQU|Ϲ >9sXfg:# gD-3a12V(ZabM7èp֑g40#dBY8KV4%.݉ӕ+K1}mFjW a v $xb7}jH 5QL*AXX ,C^awp:7KolUFaݻWww|_u K}/[e_@(exȊ8 h:e0ӗTČ1aǵ@h7(FNlC4,#cӳn?' )N=HUZoپM6g@IyYR $'cnsPAAPa;KŦ9 tQ<GD,ȁp{w#d\RfX;s1>J'ƵgokYxEG۲kz:~>xme]Frۓ 6NՏǽsC%fWaX5Aq_{T;Z4!)WjV '{,ofs j‡ "Ciy^`#9cytAh:PK7(nHSj Dv~6tI۝ ;Ukn~<'L #US5BI yvxV>|;(n}4| xSSHkH'Zu\7p$[&ѹDbTWฃ?XwƲ2aCǛgIyØY͖4JI `jځڀFTj'D,Wa5 aI~9vT0FR"Vs26_^7Iy%KJ'ßжqv2rגּMw wnz^xЇta<e8 dG=w,•ItbN(alSQkG*oY3&ƚ;sgP}UJ[̥^Ƚ˜c0Qڄ4~KXE]zݓYْٖٙeJ xi^SDcJKEz_U.].zqڧ7^z|ʚk&usޏo[l ueE- <vedpve2&Y,rջ ,p- u{?5z7l*r?Ͽ돆?HfvHs![ g+\x2KfL*A^QL63t᥁^{AfgA[@9 uSТJbe h\Cģߥ'%:*F{Xƪac\8dlRpbc`fYM,p C6N@TL:I/gg&͡hRO]н Jjwxa4 ; 0cI;.۬,nM>vIωfOݯ\޸a:fԗMוJ:bog4lȑ3ԍm)q+, gz~r SrwrX4ic,ME6 Mzl'J?YOR\\p%bMdE:. mYgo9na- @X>N eɋ .N7&%z@q+J*5DeSf5hKF7r/}x3q5նDSj˾QTƵk ($3zoׇ& kIYLQ4%3oW^ayy}4x`5BѼO<ŝ|Z ^VpgU_Ta @Po2Ō1xɝ̀^(;A z$VQyiPʘKEcO) vD r?<'I icP1ۛ):ՠ6pTO 6aY.נv*ăO|-f6,Q\V NhDdVըEl`g̘>#d#*'l'Y> {I|Ns@'#py1ˌ!'c!%͊bNFSu0-a6f ŨA]' 2I%sLaa2-N6q)+U[Y˽3 cA*510:e.}Y\l6J/|"/+-15`F2ܛ._So`|Kԍ|&KTlrcMop$Co`-a[6c` MBS^TNWT|2+ UԓF4RGySp[u 28,33CۿWN1! d>2y&0;[ ޗ/ z+2_~?c8 3 t;-{}zگd6X6Xݖ-zeɦzxe2_,[൜Y: A >`~Fʼ?;7t⭎-̏]v%'vl/xsřqp6 pq.*Yb K؋R7y+Jz|<>=(P*4R72e<fГ\lF7vק UGCsܞޏ|(ۗ>zMM󃽞dVJ:$3Qz{}>e(gRq: pWr+!Q#f[p'>%ȵ`Vmfpl'!fO.@R:ԡԷp(9y~MjY ɍ 7I-lpY2dF247xCu*S._`[4WU!BMQO4d`AS%mV}_ݖ%n(ϱ&Ɵj퇟}nn{즥rFiqQh܌"f57@67cg2\poGstYo73%r_-`4Hs؜V5wڰ"{~}D;8//,.]X*^ů 'L ?7%?k|χl_7h V5M.^>_q]Z'ѯ51өR'^$΃t^heUj&pRfZ6pxk?X]!ίPaG GxRT"Rڜk·SJaZSRFG\5); 8^"r"sRʈ*>Gz84FwވYhbTdKV-, *N iIkM ډ_I5GRnR>tEbF2,wmغhٰ'1F!~72`4ؒ@G_glxtˈ3o|>W)ZpÑk?c !ޢc8%Վe! o. k Ѹo> OJ]JC>|v. '2]l)"-92D@p8BE 2.FA166I4Ϥ$aJSQSZKuӛanevO;W>sqY Za^U`sy.G5ŚO4lf,_W[O ?Aw˺b]lu?gu+ 鷞nUw2CcᇩE}fx{Ɔ"=bgwWGr@.x}Sᘭ7Ӡ|`# ~? U_z?A M4pH?=Z?};eǦy!A@5#_ّ~ 3 *El%N ZG1D"3 'A¹XF8#D؍a/abh:ځ-(bN Pbe t =xߚx 귢W_X~jE_0HA ccTlGs{p ߔ8Zѭ_%FՉgQ>nG!'%P %K|(~9;yuvt?v1B>c=ifj0D4-APz [p#>w*I4 sZexP?zj? W{UG}%kc@bh$p g. .M@`Wp&q8qd-mv]( ;rBG7F302<o=O11w>  ~D0Y/;#xDW{Vs`Th ^t}N7/Y_d;n,sy-cdzױorwp9B=go%^L5'p8z Hnt>Fų50rߋůJ~|d,Qe[=^|;c|(y2}qoHv2;MΔprӸ}ܯS|%?o?nk~??8/G 5G `~ x} ^yWz܀'+ոߊ7!8~Vk =D42dAyO`τDfsְYˬngb10'ϙ!5vkؽ-r<Y0`n>/xa(li8f._-"O+AA&fAoG!؇ip*8싑lŦQJ^a%+!T_Ax€^gQ Dٗ%`\^f [EO6FCx<:@*L0>jt//GO!<l[9^%vf^*x">`v>W}?؛@?ϠO%ƀ6Zf jf8g<@\C0fǮA/ QA/fe?M' )C-B‰ ij8Z%%p,4 Zo{"x8q[R;p7>Dg+osxIGK9=~ŽɏnGDY +B_iֻaaMzaFmpfsAOd9r+pa8Gl=q5z̓5Oy6;xaF<ihGo: x&=͇FF;Z%4@'>F)& ~Eb4Yn^0: OFe0w0F, ̪wI])Բ3+U.;btyY` 'ʞ̌tI4Y2 zVD0:} Dـ„Bρ9De(MTnQTRITηĒ\* :}/YS }g?"G$5MM \\T+Gq\_ik5ԣARփ㰚 1=i 0_[uk LNݜ)Mu^o kF|Ru(_at5hS0еOBs[Bsn2s"t sƭ:֜p-5M.Mg꜋e G4]XHZSUCo&6La4r{)o!eZuZ9*u][7zcnҟD:kzJGfXQ{]캸G2'c4zÅujJmNS Ss'@Dy2̤kM_Q׼ |ؑQKC)}ˑrw$?%sR%|I*'E ϥP4?P{ s VQ6IC91E~n>ͅLsJS2/1"QBkfКs5[ ${Zݢ1Qlo[ Sf5u]-)6L(}.41$"Z By4Ӥ9ǫB=?ʀPXJ-/iD}SJE?f8?Ew10_6@^TW /wtKt˒%{Zmh_h,bJ?8Gj 8)wMHO65Bi5`Ѩ:ZV-P0R40GeRr:>6YkB&Y֙ljT@L>TiLoP3) u>xPWMi\b?iIᇳ,"@2^0.~?FBG{x(^CCBNv9tӺ9Sh;OUBj&Jewfl"6h-ʊ_3Lz!pÂOƊvo5"-2Bj:!d@wYLB{j#jKdFOD冇 ӽ$"`qTtf?2cPIbcJ{K:3OS Of{M⢑*iՂS"Ld0' <@#S KW} wZvS%,ꗽK*%P-t8` !agIZ<Ad^IZbCEIh@ہl;"м!V8ReaCX"A000d7Whͽivm1YE8LJΒFjVf a[= <^T UA*%򠺚aj7xYG̘#_+ajch!V1ocLangdV1aZu%{ECɶj=399b%11{3Y*<ay78ܣRM;%Ek\X2P-26p:hEL.* uZ }`׺```R] }5M16]beCDvnI?bCW4ҙ9c4Wo,:,9_}*̊^d!&_]JA3@\@hn a21LVV{ Oك0-9ND!MoT~3ĉrG;@|:Ak| CS'/ RޘN!()z."ay鳱J=C&ɊXR%&-480c崓mòl#g*{=#Z"wE.G2PM1H2ǚ.apT 1]~(y"WGA{#*5UE0nl|$||4[qH.ŬdTn7)88Lw IVrBZ_A/L@v;uCW HsP,X / XpZ/ sOg虘}1OPs,8Uj<,%`OyfB)1OP,aMUvr$3/橠5(H7P@1 7XyX@rLE9\(4Ī=؇RgO&Cyg>  ޤ aJSYQx³sgg9c=4Q7_4Ba91ϥ9}=7zOS!E@% 9}Tga/ W ㅱ_ YB`X4ƨkװ"D++Y> stream x]n >a#tcl/>°%H=eMz|_ٕaV=X,-(`#\˄dڪu1ߖΙ9ke ;v:u;ƴi,HI?(Bp޲Ƙ68F}!yYe Og䂸B.S|E\ ׉%G~L\y V#?"+c5q r 1N1#2WXSXSL_2+K?W_&F%ޏ 2QF7-sﵺۜX/v:A?{J/ʩn endstream endobj 22 0 obj 356 endobj 23 0 obj << /Type /FontDescriptor /FontName /VVELOE+Arial-BoldMT /FontFamily (Arial Bold) /Flags 32 /FontBBox [ -627 -376 2000 1055 ] /ItalicAngle 0 /Ascent 905 /Descent -211 /CapHeight 1055 /StemV 80 /StemH 80 /FontFile2 19 0 R >> endobj 7 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VVELOE+Arial-BoldMT /FirstChar 32 /LastChar 133 /FontDescriptor 23 0 R /Encoding /WinAnsiEncoding /Widths [ 277 0 0 0 0 0 0 0 333 333 0 0 277 333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 0 666 610 0 0 0 0 0 610 833 0 0 666 0 0 666 610 722 0 0 0 0 0 0 0 0 0 0 0 556 0 0 610 556 333 610 610 277 0 556 277 889 610 610 0 0 389 556 333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 ] /ToUnicode 21 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 8 0 R ] /Count 1 >> endobj 24 0 obj << /Creator (cairo 1.11.2 (http://cairographics.org)) /Producer (cairo 1.11.2 (http://cairographics.org)) >> endobj 25 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 26 0000000000 65535 f 0000039841 00000 n 0000000957 00000 n 0000000015 00000 n 0000000935 00000 n 0000009224 00000 n 0000025766 00000 n 0000039359 00000 n 0000001104 00000 n 0000001304 00000 n 0000008582 00000 n 0000008606 00000 n 0000008940 00000 n 0000008963 00000 n 0000009622 00000 n 0000025034 00000 n 0000025059 00000 n 0000025459 00000 n 0000025482 00000 n 0000026208 00000 n 0000038604 00000 n 0000038629 00000 n 0000039064 00000 n 0000039087 00000 n 0000039906 00000 n 0000040034 00000 n trailer << /Size 26 /Root 25 0 R /Info 24 0 R >> startxref 40087 %%EOF eRm/vignettes/UCML.svg0000755000175100001440000011030014375241640014310 0ustar hornikusers image/svg+xml function RM X function LLTM X W mpoints groupvec function RSM X function LRSM X W mpoints groupvec function PCM X function LPCM X W mpoints groupvec Unified CML (Log-)Likelihood, Parameter Estimates, Standard Errors, … Tests for Model Fit eRm/vignettes/eRmvig.bib0000755000175100001440000005674314375241640014762 0ustar hornikusers% This file was created with JabRef 2.10. % Encoding: UTF8 @Manual{gnuR, Title = {{{\gnuR}: A Language and Environment for Statistical Computing}}, Address = {{Vienna, Austria}}, Author = {{{\gnuR} Core Team}}, Organization = {{{\gnuR} Foundation for Statistical Computing}}, Year = {2014}, Url = {http://www.R-project.org/} } @Article{Adams+Wilson+Wang:1997, Title = {{The Multidimensional Random Coefficients Multinomial Logit Model}}, Author = {Adams, R. J. and Wilson, M. and Wang, Wen-chung}, Journal = {{Applied Psychological Measurement}}, Year = {1997}, Number = {1}, Pages = {1--23}, Volume = {21}, Doi = {10.1177/0146621697211001} } @InCollection{And:95, Title = {{Polytomous Rasch Models and their Estimation}}, Author = {Andersen, Erling Bernhard}, Booktitle = {{Rasch Models: Foundations, Recent Developments, and Applications}}, Publisher = {Springer}, Year = {1995}, Address = {New York}, Editor = {Fischer, Gerhard H. and Molenaar, Ivo W.}, Pages = {271--292}, Doi = {10.1007/978-1-4612-4230-7_15} } @InCollection{And:83, Title = {A General Latent Structure Model for Contingency Table Data}, Author = {Andersen, Erling Bernhard}, Booktitle = {Principals of Modern Psychological Measurement}, Publisher = {Erlbaum}, Year = {1983}, Address = {Hillsdale, NJ}, Editor = {H. Wainer and S. Messik}, Pages = {117--138} } @Article{And:73, Title = {{A goodness of fit test for the Rasch model}}, Author = {Andersen, Erling Bernhard}, Journal = {{Psychometrika}}, Year = {1973}, Number = {1}, Pages = {123--140}, Volume = {38}, Doi = {10.1007/BF02291180} } @Article{And:72, Title = {{The Numerical Solution of a Set of Conditional Estimation Equations}}, Author = {Andersen, Erling Bernhard}, Journal = {{Journal of the Royal Statistical Society. Series B (Methodological)}}, Year = {1972}, Number = {1}, Pages = {42--54}, Volume = {34}, Url = {http://www.jstor.org/stable/2985049} } @Article{Andersen:1970, Title = {{Asymptotic Properties of Conditional Maximum-Likelihood Estimators}}, Author = {Andersen, Erling Bernhard}, Journal = {{Journal of the Royal Statistical Society. Series B (Methodological)}}, Year = {1970}, Number = {2}, Pages = {283--301}, Volume = {32}, Url = {http://www.jstor.org/stable/2984535} } @Article{CAnd:07, Title = {{Estimation of Models in a Rasch Family for Polytomous Items and Multiple Latent Variables}}, Author = {Anderson, Carolyn J. and Li, Zhushan and Vermunt, Jeroen K.}, Journal = {{Journal of Statistical Software}}, Year = {2007}, Number = {6}, Pages = {1--36}, Volume = {20}, Url = {http://www.jstatsoft.org/v20/i06/} } @Book{Andrich:88, Title = {{Rasch Models for Measurement}}, Author = {Andrich, David}, Publisher = {Sage Publications}, Year = {1988}, Address = {Newbury Park, CA}, Series = {{Quantitative Applications in the Social Sciences}}, Volume = {68} } @Article{And:78, Title = {{A rating formulation for ordered response categories}}, Author = {Andrich, David}, Journal = {{Psychometrika}}, Year = {1978}, Number = {4}, Pages = {561--573}, Volume = {43}, Doi = {10.1007/BF02293814} } @Book{BaKi:04, Title = {Item Response Theory: Parameter Estimation Techniques}, Author = {Baker, F. B. and Kim, S.}, Publisher = {Dekker}, Year = {2004}, Address = {New York}, Edition = {2nd} } @InCollection{Birnbaum:1968, Title = {Some latent trait models and their use in inferring an examinee's ability}, Author = {Birnbaum, A.}, Booktitle = {Statistical theories of mental test scores}, Publisher = {Addison-Wesley}, Year = {1968}, Address = {Reading, MA}, Editor = {F. M. Lord and M. R. Novick}, Pages = {395--479} } @Article{Bock+Aitkin:1981, Title = {{Marginal maximum likelihood estimation of item parameters: Application of an EM algorithm}}, Author = {Bock, R. Darrell and Aitkin, Murray}, Journal = {{Psychometrika}}, Year = {1981}, Number = {4}, Pages = {443--459}, Volume = {46}, Doi = {10.1007/BF02293801} } @Article{Bor:06, Title = {{The attack of the psychometricians}}, Author = {Borsboom, Denny}, Journal = {{Psychometrika}}, Year = {2006}, Number = {3}, Pages = {425--440}, Volume = {71}, Doi = {10.1007/s11336-006-1447-6} } @Book{deBoeck+Wilson:2004, Title = {{Explanatory item response models: A generalized linear and nonlinear approach}}, Author = {{de Boeck}, P. and Wilson, M.}, Publisher = {Springer}, Year = {2004}, Address = {New York} } @Article{LeVe:86, Title = {{Maximum Likelihood Estimation in Generalized Rasch Models}}, Author = {{de Leeuw}, J. and Verhelst, N.}, Journal = {{Journal of Educational Statistics}}, Year = {1986}, Number = {3}, Pages = {183--196}, Volume = {11}, Doi = {10.3102/10769986011003183} } @InCollection{Fisch:95a, Title = {{Derivations of the Rasch Model}}, Author = {Fischer, Gerhard H.}, Booktitle = {{Rasch Models: Foundations, Recent Developments, and Applications}}, Publisher = {Springer}, Year = {1995}, Address = {New York}, Editor = {Fischer, Gerhard H. and Molenaar, Ivo W.}, Pages = {15--38}, Doi = {10.1007/978-1-4612-4230-7_2} } @InCollection{Fisch:95b, Title = {{Linear Logistic Models for Change}}, Author = {Fischer, Gerhard H.}, Booktitle = {{Rasch Models: Foundations, Recent Developments, and Applications}}, Publisher = {Springer}, Year = {1995}, Address = {New York}, Editor = {Fischer, Gerhard H. and Molenaar, Ivo W.}, Pages = {157--180}, Doi = {10.1007/978-1-4612-4230-7_9} } @InCollection{Fischer:1988, Title = {Spezifische \uppercase{O}bjektvität: \uppercase{E}ine wissenschaftstheoretische \uppercase{G}rundlage des \uppercase{R}asch-\uppercase{M}odells [\uppercase{S}pecific objectivity: \uppercase{A}n epistemological foundation of the \uppercase{R}asch model]}, Author = {Fischer, Gerhard H.}, Booktitle = {{Moderne Testtheorie: Ein Abriss samt neuesten Beiträgen}}, Publisher = {Beltz}, Year = {1988}, Address = {Weinheim}, Editor = {Kubinger, Klaus D.}, Pages = {87--111} } @InCollection{Fisch:77, Title = {Linear Logistic Trait Models: Theory and Application}, Author = {Fischer, Gerhard H.}, Booktitle = {Structural Models of Thinking and Learning}, Publisher = {Huber}, Year = {1977}, Address = {Bern}, Editor = {H. Spada and W. F. Kempf}, Pages = {203--225} } @Article{Fischer:1987, Title = {{Applying the principles of specific objectivity and of generalizability to the measurement of change}}, Author = {Fischer, Gerhard H.}, Journal = {{Psychometrika}}, Year = {1987}, Pages = {565-587}, Volume = {52}, Doi = {10.1007/BF02294820} } @Article{Fischer:1981, Title = {{On the existence and uniqueness of maximum-likelihood estimates in the Rasch model}}, Author = {Fischer, Gerhard H.}, Journal = {{Psychometrika}}, Year = {1981}, Number = {1}, Pages = {59--77}, Volume = {46}, Doi = {10.1007/BF02293919} } @Book{Fisch:74, Title = {{Einführung in die Theorie psychologischer Tests [Introduction to Psychological Test Theory]}}, Author = {Fischer, Gerhard H.}, Publisher = {Huber}, Year = {1974}, Address = {Bern} } @Article{Fisch:73, Title = {{The linear logistic test model as an instrument in educational research}}, Author = {Fischer, Gerhard H.}, Journal = {{Acta Psychologica}}, Year = {1973}, Number = {6}, Pages = {359--374}, Volume = {37}, Doi = {10.1016/0001-6918(73)90003-6} } @Article{FiPa:91, Title = {{An extension of the rating scale model with an application to the measurement of change}}, Author = {Fischer, Gerhard H. and Parzer, P.}, Journal = {{Psychometrika}}, Year = {1991}, Number = {4}, Pages = {637--651}, Volume = {56}, Doi = {10.1007/BF02294496} } @InCollection{FischPonocny:95, Title = {{Extended Rating Scale and Partial Credit Models for Assessing Change}}, Author = {Fischer, Gerhard H. and Ponocny, Ivo}, Booktitle = {{Rasch Models: Foundations, Recent Developments, and Applications}}, Publisher = {Springer}, Year = {1995}, Address = {New York}, Editor = {Fischer, Gerhard H. and Molenaar, Ivo W.}, Pages = {353--370}, Doi = {10.1007/978-1-4612-4230-7_19} } @Article{FiPo:94, Title = {{An extension of the partial credit model with an application to the measurement of change}}, Author = {Fischer, Gerhard H. and Ponocny, Ivo}, Journal = {{Psychometrika}}, Year = {1994}, Number = {2}, Pages = {177--192}, Volume = {59}, Doi = {10.1007/BF02295182} } @Book{FiPS:98, Title = {Structural Rasch Modeling: Handbook of the Usage of LPCM-WIN 1.0}, Author = {Fischer, Gerhard H. and Ponocny-Seliger, E.}, Publisher = {ProGAMMA}, Year = {1998}, Address = {Groningen} } @Article{FiSch:70, Title = {{Algorithmen und Programme für das probabilistische Testmodell von Rasch [Algorithms and programs for Rasch's probabilistic test model]}}, Author = {Fischer, Gerhard H. and Scheiblechner, Hartmann}, Journal = {{Psychologische Beiträge}}, Year = {1970}, Pages = {23--51}, Volume = {12} } @InCollection{FiJr:92, Title = {Objectivity in Measurement: A Philosophical History of \uppercase{R}asch's Separability Theorem}, Author = {Fisher Jr., W. P.}, Booktitle = {Objective Measurement: Theory into Practice, Volume 1}, Publisher = {Ablex}, Year = {1992}, Address = {Norwood, NJ}, Editor = {M. Wilson}, Pages = {29--60} } @InCollection{Glas:1992, Title = {A Rasch Model with a Multivariate Distribution of Ability}, Author = {Glas, C. A. W.}, Booktitle = {Objective Measurement: Theory into Practice, Volume 1}, Publisher = {Ablex}, Year = {1992}, Address = {Norwood, NJ}, Editor = {M. Wilson}, Pages = {236--258} } @InCollection{Glas+Verhelst:1995a, Title = {{Testing the Rasch Model}}, Author = {Glas, Cees A. W. and Verhelst, Norman D.}, Booktitle = {{Rasch Models: Foundations, Recent Developments, and Applications}}, Publisher = {Springer}, Year = {1995}, Address = {New York}, Editor = {Fischer, Gerhard H. and Molenaar, Ivo W.}, Pages = {69--96}, Doi = {10.1007/978-1-4612-4230-7_5} } @InCollection{Glas+Verhelst:1995b, Title = {{Tests of Fit for Polytomous Rasch Models}}, Author = {Glas, Cees A. W. and Verhelst, Norman D.}, Booktitle = {{Rasch Models: Foundations, Recent Developments, and Applications}}, Publisher = {Springer}, Year = {1995}, Address = {New York}, Editor = {Fischer, Gerhard H. and Molenaar, Ivo W.}, Pages = {325--352}, Doi = {10.1007/978-1-4612-4230-7_18} } @Article{GlVe:89, Title = {{Extensions of the partial credit model}}, Author = {Glas, C. A. W. and Verhelst, Norman D.}, Journal = {{Psychometrika}}, Year = {1989}, Number = {4}, Pages = {635--659}, Volume = {54}, Doi = {10.1007/BF02296401} } @Article{Gustafsson:1980, Title = {{Testing and obtaining fit of data to the Rasch model}}, Author = {Gustafsson, J.-E.}, Journal = {{British Journal of Mathematical and Statistical Psychology}}, Year = {1980}, Number = {2}, Pages = {205--233}, Volume = {33}, Doi = {10.1111/j.2044-8317.1980.tb00609.x} } @Article{Haberman:77, Title = {{Maximum Likelihood Estimates in Exponential Response Models}}, Author = {Haberman, Shelby J.}, Journal = {{The Annals of Statistics}}, Year = {1977}, Number = {5}, Pages = {815--841}, Volume = {5}, Url = {http://www.jstor.org/stable/2958512} } @Article{HatzingerRusch:2009:IRTwLLRA, Title = {{IRT Models with Relaxed Assumptions in {\pkg{eRm}}: A manual-like instruction}}, Author = {Hatzinger, Reinhold and Rusch, Thomas}, Journal = {{Psychological Science Quarterly}}, Year = {2009}, Number = {1}, Pages = {87--120}, Volume = {51} } @InCollection{Ho:95, Title = {{Linear and Repeated Measures Models for the Person Parameters}}, Author = {Hoijtink, Herbert}, Booktitle = {{Rasch Models: Foundations, Recent Developments, and Applications}}, Publisher = {Springer}, Year = {1995}, Address = {New York}, Editor = {Fischer, Gerhard H. and Molenaar, Ivo W.}, Pages = {203--214}, Doi = {10.1007/978-1-4612-4230-7_11} } @InCollection{Hoijtink+Boomsma:1995, Title = {{On Person Parameter Estimation in the Dichotomous Rasch Model}}, Author = {Hoijtink, Herbert and Boomsma, Anne}, Booktitle = {{Rasch Models: Foundations, Recent Developments, and Applications}}, Publisher = {Springer}, Year = {1995}, Address = {New York}, Editor = {Fischer, Gerhard H. and Molenaar, Ivo W.}, Pages = {53--68}, Doi = {10.1007/978-1-4612-4230-7_4} } @Article{Jannarone:1986, Title = {{Conjunctive item response theory kernels}}, Author = {Jannarone, Robert J.}, Journal = {{Psychometrika}}, Year = {1986}, Number = {3}, Pages = {357--373}, Volume = {51}, Doi = {10.1007/BF02294060} } @InCollection{Kubinger:1989, Title = {Aktueller \uppercase{S}tand und kritische \uppercase{W}ürdigung der \uppercase{P}robabilistischen \uppercase{T}esttheorie [\uppercase{C}urrent status and critical appreciation of probabilistic test theory]}, Author = {Kubinger, Klaus D.}, Booktitle = {{Moderne Testtheorie: Ein Abriss samt neuesten Beiträgen}}, Publisher = {Beltz}, Year = {1989}, Address = {Weinheim}, Editor = {Kubinger, Klaus D.}, Pages = {19--83} } @Article{Kub:05, Title = {{Psychological Test Calibration Using the Rasch Model---Some Critical Suggestions on Traditional Approaches}}, Author = {Kubinger, Klaus D.}, Journal = {{International Journal of Testing}}, Year = {2005}, Number = {4}, Pages = {377--394}, Volume = {5}, Doi = {10.1207/s15327574ijt0504_3} } @InCollection{Linacre:2004, Title = {{Estimation Methods for Rasch Measures}}, Author = {Linacre, J. M.}, Booktitle = {{Introduction to Rasch Measurement}}, Publisher = {{JAM Press}}, Year = {2004}, Address = {Maple Grove, MN}, Editor = {Smith, Everett V. and Smith, Richard M.}, Pages = {25--48} } @Article{Li:94, Title = {{More on the Computation of Higher-Order Derivatives of the Elementary Symmetric Functions in the Rasch Model}}, Author = {Liou, M.}, Journal = {{Applied Psychological Measurement}}, Year = {1994}, Number = {1}, Pages = {53--62}, Volume = {18}, Doi = {10.1177/014662169401800105} } @MastersThesis{Mair:2006, Title = {Simulation Studies for Goodness-of-Fit Statistics in Item Response Theory}, Author = {P. Mair}, School = {Department of Psychology, University of Vienna}, Year = {2006} } @Article{Mair+Hatzinger:2007, Title = {{Extended Rasch Modeling: The {\pkg{eRm}} Package for the Application of IRT Models in {\gnuR}}}, Author = {P. Mair and R. Hatzinger}, Journal = {{Journal of Statistical Software}}, Year = {2007}, Number = {9}, Pages = {1--20}, Volume = {20}, Url = {http://www.jstatsoft.org/v20/i09} } @Article{Mair+Hatzinger:2007b, Title = {{{\acronym{CML}} based estimation of extended Rasch models with the {\pkg{eRm}} package in {\gnuR}}}, Author = {P. Mair and R. Hatzinger}, Journal = {{Psychology Science}}, Year = {2007}, Number = {1}, Pages = {26--43}, Volume = {49} } @Article{Mast:82, Title = {{A Rasch model for partial credit scoring}}, Author = {Masters, Geoff N.}, Journal = {{Psychometrika}}, Year = {1982}, Number = {2}, Pages = {149--174}, Volume = {47}, Doi = {10.1007/BF02296272} } @Article{Mi:85, Title = {{Estimation of Latent Group Effects}}, Author = {Mislevy, Robert J.}, Journal = {{Journal of the American Statistical Association}}, Year = {1985}, Number = {392}, Pages = {993--997}, Volume = {80}, Doi = {10.1080/01621459.1985.10478215} } @InCollection{Molenaar:1995, Title = {{Estimation of Item Parameters}}, Author = {Molenaar, Ivo W.}, Booktitle = {{Rasch Models: Foundations, Recent Developments, and Applications}}, Publisher = {Springer}, Year = {1995}, Address = {New York}, Editor = {Fischer, Gerhard H. and Molenaar, Ivo W.}, Pages = {39--51}, Doi = {10.1007/978-1-4612-4230-7_3} } @InCollection{Pf:94, Title = {{On Item Parameter Estimation in Certain Latent Trait Models}}, Author = {Pfanzagl, J.}, Booktitle = {{Contributions to Mathematical Psychology, Psychometrics, and Methodology}}, Publisher = {Springer}, Year = {1994}, Address = {New York}, Editor = {Fischer, Gerhard H. and Laming, Donald}, Pages = {249--263}, Doi = {10.1007/978-1-4612-4308-3_19} } @Book{Poinstingl+Mair+Hatzinger:07, Title = {{Manual zum Softwarepackage {\eRm}: Anwendung des Rasch-Modells}}, Author = {Poinstingl, H. and Mair, P. and Hatzinger, R.}, Publisher = {{Pabst Science Publishers}}, Year = {2007}, Address = {Lengerich} } @Article{Ponocny:2002:ApplicabilitysomeIRT, Title = {{On the Applicability of some IRT Models for Repeated Measurement Designs: Conditions, Consequences, and Goodness-of-Fit Tests}}, Author = {Ponocny, Ivo}, Journal = {{Methods of Psychological Research Online}}, Year = {2002}, Number = {1}, Pages = {21--40}, Volume = {7}, Url = {http://www.dgps.de/fachgruppen/methoden/mpr-online/issue16/art2/article.html} } @Article{Ponocny:2001, Title = {{Nonparametric goodness-of-fit tests for the Rasch model}}, Author = {Ponocny, Ivo}, Journal = {{Psychometrika}}, Year = {2001}, Number = {3}, Pages = {437--460}, Volume = {66}, Doi = {10.1007/BF02294444} } @Article{Ra:77, Title = {On specific objectivity: An attempt at formalising the request for generality and validity of scientific statements}, Author = {G. Rasch}, Journal = {Danish Yearbook of Philosophy}, Year = {1977}, Pages = {58--94}, Volume = {14} } @InCollection{Ra:61, Title = {On General Laws and the Meaning of Measurement in Psychology}, Author = {Rasch, G.}, Booktitle = {Proceedings of the IV. Berkeley Symposium on Mathematical Statistics and Probability, Vol. IV}, Publisher = {University of California Press}, Year = {1961}, Address = {Berkeley}, Pages = {321--333} } @Book{Ra:60, Title = {Probabilistic Models for some Intelligence and Attainment Tests}, Author = {Rasch, G.}, Publisher = {Danish Institute for Educational Research}, Year = {1960}, Address = {Copenhagen} } @Article{Riz:06, Title = {{{\pkg{ltm}}: An {\gnuR} Package for Latent Variable Modeling and Item Response Analysis}}, Author = {Rizopoulos, Dimitris}, Journal = {{Journal of Statistical Software}}, Year = {2006}, Number = {5}, Pages = {1--25}, Volume = {17}, Url = {http://www.jstatsoft.org/v17/i05} } @InCollection{Rost:2001, Title = {{The Growing Family of Rasch Models}}, Author = {Rost, Jürgen}, Booktitle = {{Essays on Item Response Theory}}, Publisher = {Springer}, Year = {2001}, Address = {New York}, Editor = {Boomsma, Anne and {van Duijn}, Marijtje A. J. and Snijders, Tom A. B.}, Pages = {25--42}, Series = {{Lecture Notes in Statistics}}, Volume = {157}, Doi = {10.1007/978-1-4613-0169-1_2} } @Article{Ro:99, Title = {{Was ist aus dem Rasch-Modell geworden? [What has become of the Rasch Model?]}}, Author = {Rost, Jürgen}, Journal = {{Psychologische Rundschau}}, Year = {1999}, Number = {3}, Pages = {140--156}, Volume = {50}, Doi = {10.1026//0033-3042.50.3.140} } @InProceedings{RuschMaierHatzinger:2013:LLRA, Title = {{Linear Logistic Models with Relaxed Assumptions in {\gnuR}}}, Author = {Rusch, Thomas and Maier, Marco Johannes and Hatzinger, Reinhold}, Booktitle = {{Algorithms from and for Nature and Life: Classification and Data Analysis}}, Year = {2013}, Address = {New York}, Editor = {Lausen, Berthold and {van den Poel}, Dirk and Ultsch, Alfred}, Pages = {337--344}, Publisher = {Springer}, Doi = {10.1007/978-3-319-00035-0_34} } @Article{Scheib:72, Title = {{Das Lernen und Lösen komplexer Denkaufgaben [The learning and solving of complex reasoning items]}}, Author = {Scheiblechner, Hartmann}, Journal = {{Zeitschrift für experimentelle und angewandte Psychologie}}, Year = {1972}, Pages = {456--506}, Volume = {3} } @InCollection{Sm:04, Title = {{Fit Analysis in Latent Trait Measurement Models}}, Author = {Smith, Richard M.}, Booktitle = {{Introduction to Rasch Measurement}}, Publisher = {{JAM Press}}, Year = {2004}, Address = {Maple Grove, MN}, Editor = {Smith, Everett V. and Smith, Richard M.}, Pages = {73--92} } @Article{Suarez+Glas:2003, Title = {{Evaluation of global testing procedures for item fit to the Rasch model}}, Author = {Suárez-Falcón, J. C. and Glas, C. A. W.}, Journal = {{British Journal of Mathematical and Statistical Psychology}}, Year = {2003}, Number = {1}, Pages = {127--143}, Volume = {56}, Doi = {10.1348/000711003321645395} } @Article{VedB:01, Title = {{Some Mantel-Haenszel tests of Rasch model assumptions}}, Author = {Verguts, T. and {de Boeck}, P.}, Journal = {{British Journal of Mathematical and Statistical Psychology}}, Year = {2001}, Number = {1}, Pages = {21--37}, Volume = {54}, Doi = {10.1348/000711001159401} } @Article{Verhelst+Hatzinger+Mair:2007, Title = {{The Rasch sampler}}, Author = {N. Verhelst and R. Hatzinger and P. Mair}, Journal = {{Journal of Statistical Software}}, Year = {2007}, Number = {4}, Pages = {1--14}, Volume = {20}, Url = {http://www.jstatsoft.org/v20/i04} } @InCollection{Verhelst+Glas:1995, Title = {{The One Parameter Logistic Model}}, Author = {Verhelst, Norman D. and Glas, Cees A. W.}, Booktitle = {{Rasch Models: Foundations, Recent Developments, and Applications}}, Publisher = {Springer}, Year = {1995}, Address = {New York}, Editor = {Fischer, Gerhard H. and Molenaar, Ivo W.}, Pages = {215--238}, Doi = {10.1007/978-1-4612-4230-7_12} } @Book{Davier:1998, Title = {{WINMIRA: A Windows program for mixed Rasch models}}, Author = {{von Davier}, M.}, Publisher = {IPN}, Year = {1998}, Address = {Kiel} } @InCollection{RoDa:95, Title = {{Polytomous Mixed Rasch Models}}, Author = {{von Davier}, Matthias and Rost, Jürgen}, Booktitle = {{Rasch Models: Foundations, Recent Developments, and Applications}}, Publisher = {Springer}, Year = {1995}, Address = {New York}, Editor = {Fischer, Gerhard H. and Molenaar, Ivo W.}, Pages = {371--382}, Doi = {10.1007/978-1-4612-4230-7_20} } @Article{Warm:1989, Title = {{Weighted likelihood estimation of ability in item response theory}}, Author = {Warm, Thomas A.}, Journal = {{Psychometrika}}, Year = {1989}, Number = {3}, Pages = {427--450}, Volume = {54}, Doi = {10.1007/BF02294627} } @Article{Wright+Panchapakesan:1969, Title = {{A Procedure for Sample-Free Item Analysis}}, Author = {B. Wright and N. Panchapakesan}, Journal = {{Educational and Psychological Measurement}}, Year = {1969}, Number = {1}, Pages = {23--48}, Volume = {29}, Doi = {10.1177/001316446902900102} } @Book{Wright+Masters:1982, Title = {{Rating Scale Analysis: Rasch Measurement}}, Author = {Wright, B. D. and Masters, G. N.}, Publisher = {Mesa Press}, Year = {1982}, Address = {Chicago} } eRm/vignettes/modelhierarchy.pdf0000755000175100001440000001672614375241640016542 0ustar hornikusers%PDF-1.4 % 6 0 obj <> endobj xref 6 10 0000000016 00000 n 0000000647 00000 n 0000000723 00000 n 0000000847 00000 n 0000000929 00000 n 0000001124 00000 n 0000002119 00000 n 0000003279 00000 n 0000003483 00000 n 0000000496 00000 n trailer <]>> startxref 0 %%EOF 15 0 obj<>stream xb```g``anT,  bP aB7H320H ! endstream endobj 7 0 obj<> endobj 8 0 obj<> endobj 9 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 10 0 obj<> endobj 11 0 obj<>stream HV=o1+\ ǟ-"!"!n;DP"PRQy36.7=oQI8yg?Yg[V_락߾;Ӽ9yx˚L5do= >82e<MD/XVj%f1C8D\}{!jaYo֘;W?b~D;v7ZD:;VN3l'`8r\o_#|XG3q{O W<)6~!EVǔ5pZw:JX'>7V-QHCX;ksē׮{J ml LM$8],n͞t*,x:v8Ej~UWLųL=)nXyS!CNP_5dh=lYMI%tMQJTa ܐKaCԺD5[Xsay*n^%uJ9J0;ɇ߻jmx"^Or\qϘ%'޳WhG5n[ڹب\ǙU\ ʼn6*uK,TS ]7e&*Ϡ/ ^>stream HlkLSgi9E+`ݖ=!\ +8d hpʨV`P.]@ۖJ ,E-x O!#H>23D7e)/va_I?6$5-c{R22n¹׶q$#Zw@/`kB0OO).і>/HU(˓/*KUyE\MboTJ-yZ-ܜ(g*˔xcX,ŰL+„X16gC\bY|f3@8jL&%t9IO; F`<?08jtAoaЛ$I&a?]et6ML69š|E=Ni1YWBPu2pPG8G}ٌ|h+`ֽd.֨>"x?/F@cJ(tDC=d$KZM[ǨQ<Űd1Z&55]hd= ZD pS͋ta5d9p^r|HQ ҬϋUs {=^[ ]j .?{-H6u{H&!^r2B?# Av6_P<+AM\l [cBu\IGhQjtFN@ q߯(թ gTI'Ľ| Q].y: ޫҰaN_"1l%Wia(@sN]?s׋åy!WPH=i[Ο{<5Kqi229]FxaWdiYIqCv[@J}LVjum];׏Q0x?f*n`vwblaj NW٭FZCC8|y. D^K=}0̭Lek}X|A(7|5 2l>nuxx[Z}1"hgzro:a@\$ݝ I}qǵfdCD~Nu)> endstream endobj 13 0 obj<> endobj 14 0 obj<> endobj 1 0 obj<> endobj 2 0 obj<> endobj 3 0 obj<> endobj 4 0 obj<>stream Acrobat Distiller 7.0.5 (Windows) 2006-12-07T19:28:41+01:00 2006-12-07T19:29:59+01:00 dvips(k) 5.94b Copyright 2004 Radical Eye Software 2006-12-07T19:29:59+01:00 application/pdf modelhierarchy.dvi uuid:24a41332-332e-48aa-8039-01a80649f082 uuid:04394476-4020-4118-8bcb-0f6f46e95be8 endstream endobj 5 0 obj<> endobj xref 0 6 0000000000 65535 f 0000003559 00000 n 0000003592 00000 n 0000003615 00000 n 0000003665 00000 n 0000007238 00000 n trailer <> startxref 116 %%EOF eRm/vignettes/eRm_object_tree.pdf0000755000175100001440000006570214375241640016631 0ustar hornikusers%PDF-1.4 % 1 0 obj << /Title (eRm.dvi) /Creator (dvips\(k\) 5.99 Copyright 2010 Radical Eye Software) /ModDate (D:20110414120412+02'00') /Producer (PDF-XChange Viewer [Version: 2.0 \(Build 54.0\) \(Jul 9 2010; 16:47:37\)]) /CreationDate (D:20110405114134+02'00') >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R /Metadata 4 0 R >> endobj 3 0 obj << /Kids [5 0 R] /Type /Pages /Count 1 >> endobj 4 0 obj << /Type /Metadata /Length 3299 /Subtype /XML >> stream 2011-04-05T11:41:34+02:00 dvips(k) 5.99 Copyright 2010 Radical Eye Software 2011-04-14T12:04:12+02:00 6491a0bc-61c4-11e0-0000-bd0b9bb047cc 6491a0bc-61c4-11e0-0000-bd0b9bb047cc application/pdf eRm.dvi PDF-XChange Viewer [Version: 2.0 (Build 54.0) (Jul 9 2010; 16:47:37)] endstream endobj 5 0 obj << /Type /Page /Parent 3 0 R /Rotate 90 /Contents 6 0 R /MediaBox [0 0 595 842] /Resources << /Font 7 0 R /ProcSet [/PDF /Text] /ExtGState 8 0 R >> >> endobj 6 0 obj << /Filter [/FlateDecode] /Length 10699 >> stream x][,q~_G~y $ CGvk)O}E3g䙆%ebXZ9)+?>?Wb'>9)Nx!%GS8AiXOE}m\thkƢQJ}i>=%8z>tg_=>i c4!:RE_Jb}%Zriwj[MA}:({o Ƹ=`0j?;刺P:%O>})@X9CUEp?yY}Eӌ!>ӯ ?>O&BMEkm1)k: [u6mɤb@(nAD=^D8Ps 71UDe!=76 ^n 0)^"Fkץ}zĞzܾ Ou(/_>| FEMsTۓ7&O*&+Q2 Hbivm)&JcQEw>LC},!&˺Q%81тi!J.ï~vCi٬)&ZO?R.m|qAJ-u! #,RezDZ=NJDtB#ڵޣ\XvuX7io@-_49t !h(>Gh+yă\!MyD!a Ʋ`7(Ezk8&"h῾|^矾|o (>B0w(;P<0-t>nK%P(Gk٣\X6`10w Ͱ jh2~&W29T4b&bX7Vi#d[=vs15P:BEz8`i!zFhJ/kQq,Gs2nOR^{ tXFʦPh -l#WeA͆G)XC$6>F+/k[v|(`]-R6;(j AYA۶qS k2X7JXR8I3ghwȧyl@'ц1+nc+`.u~h ;}1)~-ޔZHyJ%Z M'UX v4o=`-bBaF@RGuNJ6_ϿnVKl_KS_f9 SG9'!tRDޣla~ bX 1ZnFi qe!|õeo7 K4X0Eb4VR)t2#D .d7uP\u>+$"Nv(;=QJxmTaPБ ;/ 6ZM(`jbX *.ɌXJGN]9ݖX\ժ8ϪP`rMmrX=Tz[@ [P܂%5 tL`i&1 ao4lT'Yӡ)c(4U9_a#+v^0CJwֽ!UX" 㟌{B7}^,,BC0f`. [~_c D~5o,F@˙%d+ZՃ|ؽu0:a(L(/!gx!E,[`3K{h,sl&\&5ga u/wtٿ; G-|͙$]>Ց|zuq ؄"Tlm6Jͭ:&$[+QJmTxދxuu>g$P8ޙ<Sz{NVs*άZ p iƯc=Hq[w]9A9ec@m#W :&PNOJ(o|:-f乳JmT \uaYػ&iA4\|QR P ¢OBB+۠乱A*6z׃o7]%MLBT||cì4Ui_W|~oOߩvS`K3 C>sSO"9j3n+9>>/UsNNe;rvr~dNm)bh`?{EH1@3q)9d#y!"3.rÆ^ٜ޵+Vmƍy\9u5,0xS1l/ޛXo:T%Ňfչ,G&w6.)GS??j?+\=}vV!Ra*\Pv 0&;-˽`qJh–p`v~o;a\vK`>vuQkAW: hBǘl)[TT~r@W(m|~C8GE/{3\ S=<K_ `//߿@ 6DC֤`.@€"LEA_@SkRӭF(m - {õ1@@1Є6})%I@yPM0ʑLacz?8UEvGk |õw1e6a7u+Б3y0,ݱ pDcsBq*&!\&dCe$`wz08+! T))chK䢁e="@EsFR'Ap8- &lX2=B9_ A# /x춥XrꄸNyS8$Shye2kMj6- ߲-5~r82r­x(_?|Jmhz6>%Tzd)%V7=Zφޱ͏keމ۔ViuViuViuViuViuViuViuViuq[$H.3 nMs~v 6Pp (_(u.!_Fq;/_l;a R{h7]jo擉ۯc j/na{n{l;a,ޡ`0\CfCjo46Jj9 4r(7!:.8Ik{7mFu#7M\pH1qRHBI9Vg5eK{u ІU(}v'=X=:@Qn*u<0k+Vs-YC.CW6ő=p٧[ \6bEQ .Fv `K b ne<DzE?-xvTxp uh4L'@ܑێץxP]NJSX*3{t!:J> [akp-Ocqiי <'[hE0p?qk>xvx,f9tT*.GjwHz3)ޮ"l;@Oگb5fkgl|;xeJ6bXn؆H"hbɻGeù+SE:<P[GqlxRxdTաf)f Wwv(#0 sZ ?2oX`C5A?*A~]@Um5MD QV@Rv$q,@ys]` 5ڈi r>Gq pW"h-|¢, ڷ.ϗsxM;b~=_QVw(]awCQp=`&D+5Ja,תQjGF ;R&3-8KG [X I %!QIY[bqz}2q4" ڵi8fqs[< t8)%, %q=iJ1KB)CfO#PY^, -}PMP2Lgr5"xpS1"]  $)] ~rDt9c;RuGए wv]Ӹt}{Xh2&^lx1AgGAc e{1*b\ϴҞ%K#\-˥h^ᬄAZyn, m ^HG]?B~ݒǓ3sX7}V.Mo֎ &Ь[8npRcY6E$3oP)FsVqlpB5s!@ڸdzC`rtNcbZ U/q<Ӳ tR4!S+P6J8(jC( 6M=dߺSmH3!! dC_[S~^ג0҇#BG[-6Ą)^8Mpr]¢T1 – N 0JP8p@;H i {5~$OKF D85bEUQV¢>Is44)_i.5sc!iT m\]Ty -miG;qLouYڜgJ-g5 mVZM"#Os(h}0Cyzqe5طFHC1_>x:Q Ͼ$^A @z&,!^WEm_@[htPbkFPUDֹfP);=+s cu`O>ƕ҇Fdmk@{udc-$N8#Miy)Ǎvs2:&jJ[sTEaja$Ȅ H&\cdSMC^E0rݢR~W/`ЬxݎB NPvyLWDc }\҇Fy"kyuc1W 2O,.Nr Vʄakw:M)q1WҰcgŦ\WVaЩ%(AGۦBPrJ SX4f,IH J-UPp(i66i;tg ӝa3Lw0;tg ӝa3Lw0Nӝa3Lw0;AOw0;tgxtw2|JzzXc y&XԠm H )sg!iD@ڸ-A;bF`C xO;)˞s1XxXT[7%Y] 36G}FpVMn}CIÔrMm0'+Ef ZxiaG.!5s!i \cl&ۀ$ƙss.!Z3gDp mA;H+iM=l{xl3q ԸMT\ %59Y\Qs\6OOd .pnr/HjRjXPN\B0)BTK GN VBk*5ƣQj+Z ~T{ucٖpOEt3h$@+B:@Io$W_ιc8RgsFm2u]xgzDPKH yEZ!5H+WvI9DIVbQBqŅ͜l/1E#2!2' yF^B/ǽVߚX\<8ҵR!g;k}˵QB Pxo]/R%o-eڇp@}K^; *ed}Y;֔k}˵Qns4,mw7xMu1P(P.;*cΖ8\8@ q>Na w(W fk}E8M@{?~.bŧ bZii`(kqT~ ّv:rh>~BIx]XSQep#m,mQ ~Fuv`0X)o햲X\;@ШuK퇱\{~p*^FFb#A fږnQQWQ n4); ȿg]$?┏?^<M ^^rfpd7:HBBVCN EE~k~{HvpEgȆ+l`ָ~AvRqGE_X |Pv~/:%!C($١\8dQ nE wɼ(;ogX y+v{tl԰;8 Sa= ǡQXP;+y˵(@6u5|=n]窏mAWbjG3MBlH|;;6x\=Q;UnE:,2%;֗'ޝ&AnXZb>@/ OȫzBHcQBPϮ] @B^7[;3to9vWQ 07~n] $4kvIц˸TҢn N4{O4{_afifififififififߞ|9p endstream endobj 7 0 obj << /R8 9 0 R /R10 10 0 R /R12 11 0 R >> endobj 8 0 obj << /R7 12 0 R >> endobj 9 0 obj << /Type /Font /Widths [555 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 277 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 0 0 0 0 0 361 0 0 625 916 0 0 680 0 736 555 722 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 555 444 305 500 555 277 0 527 277 833 0 500 555 0 391 394 388 0 0 722] /Subtype /Type1 /BaseFont /QAHJTD+CMR10 /Encoding 13 0 R /LastChar 119 /FirstChar 12 /FontDescriptor 14 0 R >> endobj 10 0 obj << /Type /Font /Widths [570 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 399 399 0 0 0 0 285 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 742 0 0 670 806 0 370 0 0 642 941 0 799 0 0 756 0 742 0 0 1056 0 0 0 0 0 0 0 0 0 513 0 456 570 457 314 513 570 285 314 542 285 856 570 513 570 0 402 405 399 570 0 742 0 542] /Subtype /Type1 /BaseFont /EOSVXO+CMR9 /Encoding 15 0 R /LastChar 121 /FirstChar 12 /FontDescriptor 16 0 R >> endobj 11 0 obj << /Type /Font /Widths [590 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 413 413 0 0 0 0 295 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 781 0 0 0 0 0 0 0 0 0 0 0 0 0 0 531 0 472 590 472 324 0 0 295 0 0 295 885 590 531 590 0 414 419 413 590 560 0 560 560] /Subtype /Type1 /BaseFont /YYTCCC+CMR8 /Encoding 17 0 R /LastChar 121 /FirstChar 12 /FontDescriptor 18 0 R >> endobj 12 0 obj << /OPM 1 /Type /ExtGState >> endobj 13 0 obj << /Type /Encoding /Differences [12 /fi] /BaseEncoding /WinAnsiEncoding >> endobj 14 0 obj << /Type /FontDescriptor /Flags 6 /StemV 106 /Ascent 705 /CharSet (/C/I/L/M/P/R/S/T/a/d/e/f/fi/g/h/i/k/l/m/o/p/period/r/s/t/w) /Descent -206 /XHeight 453 /FontBBox [0 -206 879 705] /FontName /QAHJTD+CMR10 /CapHeight 705 /FontFile3 19 0 R /ItalicAngle 0 /MissingWidth 500 >> endobj 15 0 obj << /Type /Encoding /Differences [12 /fi] /BaseEncoding /WinAnsiEncoding >> endobj 16 0 obj << /Type /FontDescriptor /Flags 6 /StemV 108 /Ascent 750 /CharSet (/C/F/G/I/L/M/O/R/T/W/a/c/d/e/f/fi/g/h/i/j/k/l/m/n/o/p/parenleft/parenright/period/r/s/t/u/w/y) /Descent -249 /XHeight 453 /FontBBox [-39 -249 1036 750] /FontName /EOSVXO+CMR9 /CapHeight 705 /FontFile3 20 0 R /ItalicAngle 0 /MissingWidth 500 >> endobj 17 0 obj << /Type /Encoding /Differences [12 /fi] /BaseEncoding /WinAnsiEncoding >> endobj 18 0 obj << /Type /FontDescriptor /Flags 4 /StemV 128 /Ascent 750 /CharSet (/R/a/c/d/e/f/fi/i/l/m/n/o/p/parenleft/parenright/period/r/s/t/u/v/x/y) /Descent -250 /XHeight 446 /FontBBox [0 -250 857 750] /FontName /YYTCCC+CMR8 /CapHeight 683 /FontFile3 21 0 R /ItalicAngle 0 /MissingWidth 500 >> endobj 19 0 obj << /Filter [/FlateDecode] /Length 3141 /Subtype /Type1C >> stream xW{TSg?!sTLdsSuZJ".Uux @!Iv$<@xGP[.t,:o3j[-5s&YY9η=/"ۋD,|z#%xb׻ 9?l}Տa/(HUNIJ._$$$xQشd*V#(S˓5{.;;;(VNzuMr&EBS:=M!V,.h=,](ԁ4fe4kc׭OP$)%|7ޢQpj3zVRUjwj ZJA@-Q z#t򦒩lzx]/6yI[+i.O!6oș;yb_;0_'3yi8(H&@=\7MZNc996`6ZD5߹ns9 KE7`m#S:(kS!DمrwxigA`jb^*tPPm MtG~d7ɛdYJbR p"Чv`Y[dGI_(ˮOtS]3fhCS.zq9}.ݷ3`pƽȢ;[.bb1no K*84^a͐6Fӧu_%WKh"TIe68?餹I8T5Xr }Va Iq;;:m1lt%$ɋvtN85f0#XG!L_8}l/0P#'t.[Mls}ñFp8j/v$TV2p뚚󳻛{W3305P n}({ K8 *ք'צh岱֒? 8߆.|&7b <c*pa)䱛՛iAȉk?8) KOQϺ-+\K_.04CE觲b%7Izr.S)\@d3zuv~KT?* Ӯn㢵4 ʼ&6:r0_L/jZsiHC ͤ2OZCU~yUUkm=\24P +NCzYj~nIOU@ XU1;r]|c7'~}|# rT زؓ/*?7Kt9NCII8`BVo_6ۚu$ov~DZ`~~ͼ|K'l2 '6d%v>(,%j[\a~N:.$`S_A+~'¶톊N9Nwp.I~1 @5Oiнe)zS4l囮db![ЃF e= b6;Jln%?yVA,eV4N7ݿ(Mc@#1L&~#Tv\dsHk9}|a,kioqѫ*~ޔQMZQi-Bӟ\HX"%rٞ!8`Mbi.WN6 9pf}mÝg` o SqO g0wȜ9)ba-lAQPUdWh()2p^ )7#t _T:D=Wb XdO:f9ŇҜ|P3얶CΈU/F\yox %.Z:\fH 7'1GX\!A_~{{Wr23~`L0\2)4Xb#i8ɍIp)ݶE FOq/Zd_•D%|b8WV7+0أhLʠv$W͑ў=F]^/B9X}:(`rk j* :KbXի_v(;{rR!MPQL؝(.w Dra!M;v@ <2>z`c ˶ug NW^#g$ݦs 4Cףs}⹡[6q$W-alg0RRm!U0xQ%H'4ZϸFݿ6ϒgFvXm`z_z,j|.3%/||OH\Ep?J܏4-VI5*z+ir*b5lֹAPAd~W WX?P"HM&A۴lڞfdf82]N{'#ŭ~3CBC>yҵPY8 y)j?g*ԤObKޤj}8xܗW^ΐ[K >ed7[ۋ[Uʼ5,8Ƴ!XU9bd0,AWPҘ#6ze·k?yВ;NJx"h"]De:Y8Se4X =+% O. 8X_f$D7=0>xgw pxwߥ9rKw 絚>0ۡ ڌmK-( o4(aUG}f'+!]HyBJWPTL?{2!&㪉7G~_G\ Nar<:ğB^d腷ؿGbԝU5 V4MY.LZK.cnOvu߼!4^ቊ89iiW(> stream xX XT^"$۵%R|TJye``DP`7 : 0xB$D#NISY۶f <93352e#\׬s+I&=3LzVJL?82]Mn.x=h`2YL_L 3oT3g, SG Dk?J0MϤM3$LW#MYLy-8&yUL\&LFef\?N,!@")xurȚа#"EKʌp wJbJ`n;hM(q,S)@.4JEWo+8sֈfgQS؈USYhQ T4$רp&kZYk/4wb4AU* h{w/ .K[G{3{3jS{! ??. BVHdS h:( J,]'tVlubԡ%eϵu|L]8%_]X_ZS):~3𳷬yZX>WA7[$SXX '"ڳ)k:y5SW;Y#"frI'9Hw6SujW ]oe#āZ6B@P+^}`jv#E[#=mU;ސ;F|_5FΆ Bk8H }.{E06M ;t`(!V@$H[:jGbYNyT95W,D ՗F!O~gT@K9ì_l.ViM:֦[=;m \nM/ঈN+6Z'+g;VR֤4ت:wZ dQpasݬWQ8wydf]3\Sܾu om,U o*$Y]_*JsWB] !@ uM>  V~&ih>J) Vhn') t.җ[6qSlJ2-c[5Ԩuk{g\!-(i8i)! T4LO!@K2ݥFlQzwޒK,'/)b꤆_=:<Mq-8T TAl}| pN$y\iK~Eq]jDr:pw˿@ RW 5"=_=b**BȆdhsYS8m1{ܨ0MZX 04sf)-K{Iozi!i, {A;PawwB t5miAc +-{d“ȿuubG uj ;(h0/.ʥtZiXp6PW.&lufdMq4}'}=ִrx[7B.+9m޺⚪T{Hl6"R -i^j% +߭'Ǿ{~Rό,Sl^mφokmbE0E)d߂MLe7ġx:4Ј*J1& Tq?.4˺;tV{k>+,4Eze۶kg H|Nѝ8D_4^覸 -aps<~J(153 V&()sϼ@9w<_!12Kloj5wAQMx52߆Jמ+,DQ9>FQ֩6uhP[" -#:thY"71@ BK14Bu䤸?>^S][$$'4mH'GdGXr*Hkp TA3(Qy!Thai Q(AO#4Gqׇ$Xм%s1)u ] &>qYlwA.'aSȾDF+5uofX+ؒZUG\)p[6Zvm7' endstream endobj 21 0 obj << /Filter [/FlateDecode] /Length 2454 /Subtype /Type1C >> stream xV TTuÅ$[Xvgt- ւ%ȀRTaanD\++)-,-konoirw߱-&5}' #C; epf\j kFIqaL#Tkc"%y5xXzQy[{ړEa-A'i:E t9TUMYbuhs?oxV,d-pvyZ•ej&>GDa1w([Ƞ 'B2)tm>ѷ>fd5$:9Xt[aj"6},KNaSr, ! rRkC"Ǎp8 <>SkT;ra/EF-A%xNja;xflN!*uPZ]vf_@ɉn C#áaϤ='oQM͝d[ގQK ɨ uՊG{7@*'me-R.Dڗ'jؕ#LpxFB໧ϢP O8LSN! cwu8Ny"<M -h@j# |򪖇keC" 8 fӫ`Pq2iJTNC3@SV`ptغ.6xXeE7MpEA%gps8-H>s1;@)lL4]ӨAGR1'.ްWx@[ WW "kY[ t\F/itj PYa7:|[BWIΓ[(JUӛrkcØijpK\|jk5`MV|r1Qщ@^dG~ ]G漣ooKo<9dw9EZعS+o*ݗLqО՛~D?'፪cm `#`Caz{Xk%Mm/s9AbMmjMQWb^aPBkwAmL_l xYEsJDF~L\BwWuKxyhT{ACg4ulI<|Şɛ9v I\x @_04_KW8<b񧩭seI$cSlvby1l)cM0 ?g+/ ;'%黀@g#JNQэ=zhL5iCBk˫̇+(bLuB%nHfT UZrWecq0NU /?2 Pok֗Z81733oZX~nh|iPV~8<"yÍ!h?P|:~w#g9[n4 9CK_ &NGL  14 7rl m)潴b XuC Ө/0 l<BKX!1w?8QјLᑪ,h _zfI_p/|npk&|FW_v8t{:Xcb4[^k}Oձb woBEZZz:nJDOri$:ӓުLNWtf{Z;_N р[XRC9}&g>7z-w^ endstream endobj xref 0 22 0000000000 65535 f 0000000015 00000 n 0000000278 00000 n 0000000343 00000 n 0000000400 00000 n 0000003781 00000 n 0000003947 00000 n 0000014722 00000 n 0000014777 00000 n 0000014809 00000 n 0000015228 00000 n 0000015670 00000 n 0000016087 00000 n 0000016133 00000 n 0000016224 00000 n 0000016514 00000 n 0000016605 00000 n 0000016932 00000 n 0000017023 00000 n 0000017323 00000 n 0000020557 00000 n 0000024445 00000 n trailer << /ID [<85128482BB9A8BB909F565CBB49F5E9C> <85128482BB9A8BB909F565CBB49F5E9C>] /Info 1 0 R /Root 2 0 R /Size 22 >> startxref 26992 %%EOFeRm/R/0000755000175100001440000000000014473203752011223 5ustar hornikuserseRm/R/rsunpack.R0000755000175100001440000000220014375241642013172 0ustar hornikusers"rsunpack" <- function(x,n,k,nwords,userfunc,...){ # check for NAs (-2^31 not defined in R) in simulated matrices # set value to 0 nas<-FALSE if (k>=32) { idx<-(1:length(x))[is.na(x)] # indexvector for NAs nas<-(length(idx)>0) x[idx]<-0 } t<-vector(length=n*k) # calls unpacking routine out<-.Fortran("unpack", as.integer(x), as.integer(nwords), mat=as.integer(t), as.integer(n), as.integer(k) ) m<-matrix(out$mat,nrow=n) # replace NAs with bitpattern corresponding to -2^31, # i.e., 0 0 0.... 0 1 if (nas) { idx1 <- ceiling(idx/nwords) # index for rows targetbyte <- idx%%nwords # which byte in row is affected last <- k%%32 # last column in targetbyte idx2 <- (targetbyte - 1*(last!=0))*32 + last # index for column m[idx1,idx2]<-1 } # calls user function to calculate statistic(s) RET<-userfunc(m,...) RET } eRm/R/rserror.R0000755000175100001440000000156514375241642013057 0ustar hornikusers"rserror" <- function(err) { bin2int<-function(x){ r<-vector(mode="integer",length=0) while(x>1){ r<-c(x%%2,r) x<-floor(x/2) } r<-c(1,r) rev(r) } errortxt<-c("\tn < 0 or n > 4096\n", "\tk < 0 or k > 256\n", "\tn_eff < 0 or n_eff > 8191\n", "\tburn_in < 0\n", "\tstep <= 0\n", "\tone or more entries in the input matrix are different from 1 or 0\n", "\tthe input matrix is of Guttman form; the sample space has only one element\n", "\tseed < 0 or seed > 2147483646\n" ) if (err == 0) { cat("\nno error\n") } else { x <- bin2int(err) errstring <- paste("\n",paste(errortxt[(1:length(x))*x],sep="",collapse="")) stop(errstring, call.=FALSE) } invisible(err) } eRm/R/stepwiseIt.eRm.R0000755000175100001440000001352714375241642014244 0ustar hornikusers#function for stepwise item elimination stepwiseIt.eRm <- function(object, criterion = list("itemfit"), alpha = 0.05, verbose = TRUE, maxstep = NA) { # object of class dRm # criterion: either list("itemfit") or list("LRtest", splitcr) od list("Waldtest", splitcr) #-------- sanity checks --------- dummy <- match.arg(criterion[[1]], c("itemfit","LRtest","Waldtest")) if (!is.list(criterion)) stop("Criterion must be provided as list!") if (!any(class(object) == "dRm")) stop("Stepwise elimination implemented for dichotomous Rasch models only!") #------- end sanity checks ------ X.new <- object$X K <- dim(X.new)[2] if (is.na(maxstep)) maxstep <- K if (length(criterion) == 2) { splitcr <- criterion[[2]] } else { splitcr <- "median" } #---------------- start elimination ---------------- i <- 0 it.el <- rep(NA, K) #initialize outputs el.names <- rep(NA, K) wald.mat <- matrix(NA, ncol = 2, nrow = K) itemfit.mat <- matrix(NA, ncol = 3, nrow = K) LR.mat <- matrix(NA, ncol = 3, nrow = K) repeat { if((dim(X.new)[2]) == 2) { warning("Only 2 items left: No Rasch homogeneous itemset found!", call. = FALSE) break } if (i == maxstep) { warning("Maximum number of steps reached!", call. = FALSE) break } i <- i + 1 res <- RM(X.new) #fit Rasch #---------------- itemfit criterion ------------ if (criterion[[1]] == "itemfit") { pres <- person.parameter(res) #person parameters it.res <- itemfit(pres) #compute itemfit pvalvec <- 1-pchisq(it.res$i.fit, it.res$i.df) #vector with pvalues pvalsig <- which(pvalvec < alpha) #significant p-values if (length(pvalsig) > 0) { it.el[i] <- which(it.res$i.fit == max(it.res$i.fit))[1] ie <- it.el[i] itemfit.mat[i,] <- c(it.res$i.fit[ie], it.res$i.df[ie], pvalvec[ie]) if (verbose) cat("Eliminated item - Step ",i,": ",colnames(X.new)[it.el[i]],"\n", sep = "") el.names[i] <- colnames(X.new)[it.el[i]] X.new <- X.new[,-it.el[i]] } else break } #-------------- end itemfit criterion ----------- #------------------ Waldtest criterion ---------- if (criterion[[1]] == "Waldtest") { wald.res <- Waldtest(res, splitcr = splitcr) #compute Waldtest zvalvec <- abs(wald.res$coef.table[,1]) #absolute z-values pvalvec <- wald.res$coef.table[,2] #vector with pvalues pvalsig <- which(pvalvec < alpha) #significant p-values if (length(pvalsig) > 0) { elpos <- which(zvalvec == max(zvalvec))[1] #exclude maximum z-value Waldtest wald.mat[i,] <- wald.res$coef.table[elpos,] if (length(wald.res$it.ex) > 0) elpos <- elpos + sum(wald.res$it.ex <= elpos) #if items couldn't computed in Waldtest it.el[i] <- elpos el.names[i] <- colnames(X.new)[it.el[i]] if (verbose) cat("Eliminated item - Step ",i,": ",el.names[i],"\n", sep = "") X.new <- X.new[,-it.el[i]] } else break } #-------------- LRtest criterion ---------------- if (criterion[[1]] == "LRtest") #uses Waldtest but stops when LRtest is sig. { lr.res <- LRtest(res, splitcr = splitcr) if(lr.res$pvalue < alpha) { wald.res <- Waldtest(res, splitcr = splitcr) #compute Waldtest zvalvec <- abs(wald.res$coef.table[,1]) #absolute z-values elpos <- which(zvalvec == max(zvalvec))[1] #exclude maximum z-value Waldtest if (length(wald.res$it.ex) > 0) elpos <- elpos + sum(wald.res$it.ex <= elpos) #if items couldn't computed in Waldtest it.el[i] <- elpos LR.mat[i,] <- c(lr.res$LR, lr.res$df, lr.res$pvalue) el.names[i] <- colnames(X.new)[it.el[i]] if (verbose) cat("Eliminated item - Step ",i,": ",el.names[i],"\n", sep = "") X.new <- X.new[,-it.el[i]] } else break } #----------- end LRtest criterion --------- } #--------------------- end stepwise------------------ #labeling el.names <- el.names[!is.na(el.names)] if (all(is.na(el.names))) { warning("No items eliminated! Each of them fits the Rasch model!", call. = FALSE) itemfit.mat <- NULL LR.mat <- NULL wald.mat <- NULL criterion[[1]] <- "none" } if (criterion[[1]] == "itemfit") { itemfit.mat <- rbind(itemfit.mat[!is.na(rowSums(itemfit.mat)),]) rownames(itemfit.mat) <- paste("Step ",1:length(el.names),": ",el.names,sep = "") colnames(itemfit.mat) <- c("Chisq", "df","p-value") } else { itemfit.mat <- NULL } if (criterion[[1]] == "Waldtest") { wald.mat <- rbind(wald.mat[!is.na(rowSums(wald.mat)),]) rownames(wald.mat) <- paste("Step ",1:length(el.names),": ",el.names,sep = "") colnames(wald.mat) <- c("z-statistic", "p-value") } else { wald.mat <- NULL } if (criterion[[1]] == "LRtest") { if (i == maxstep) { LR.mat <- rbind(LR.mat[!is.na(rowSums(LR.mat)),]) rownames(LR.mat) <- paste("Step ",1:length(el.names),": ",el.names,sep = "") } else { LR.mat <- rbind(LR.mat[!is.na(rowSums(LR.mat)),], c(lr.res$LR, lr.res$df, lr.res$pvalue)) rownames(LR.mat) <- c(paste("Step ",1:length(el.names),": ",el.names,sep = ""), paste("Step ", i,": None", sep = "")) } colnames(LR.mat) <- c("LR-value", "Chisq df", "p-value") } else { LR.mat <- NULL } result <- list(X = X.new, fit = res, it.elim = el.names, res.wald = wald.mat, res.itemfit = itemfit.mat, res.LR = LR.mat, nsteps = i-1) class(result) <- "step" result } eRm/R/rostdeviance.r0000755000175100001440000000220614375241642014100 0ustar hornikusersrostdeviance <- function(object) { # Analysis of Deviance Table (Test against a saturated model) # object... object of class ppar #---------------saturated model--------------------- X <- object$X N <- dim(X)[1] #number of subjects K <- dim(X)[2] #number of items x.ch <- apply(X,1,toString) #response patters as string vectors nx <- as.vector(table(x.ch)) #pattern frequencies lsat <- sum(nx*(log(nx/N))) #log-likelihood of saturated model (Rost, p.334) #npar.sat <- length(nx) npar.sat <- prod(apply(X, 2, max) + 1) - 1 #number of possible response patterns - 1 #------------end saturated model-------------------- rv <- rowSums(X, na.rm = TRUE) #person raw scores lmml <- sum(table(rv)*log(table(rv)/N))+object$loglik.cml #MML likelihood npar.mml <- dim(object$W)[2] #+ length(table(rv)) ... not sure about that dev <- -2*(lmml - lsat) #deviance df.chi <- npar.sat - npar.mml p.value <- 1-pchisq(dev,df.chi) result <- list(value = dev, df = df.chi, p.value = p.value) return(result) } eRm/R/llra.internals.R0000755000175100001440000001237114375241642014306 0ustar hornikusers#internal functions get_item_cats <- function(X, nitems, grp_n){ # returns list of vectors with length max(categories) for each item; # 1:number categories are the first few entries and the rest is filed with zeros # This later corresponds to the necessary setup in LPCM where the superfluous categories must be set to 0 its <- rep(seq_len(nitems), each = sum(grp_n)) ###mjm fix 2014-09-24: split() works differently with matrices (column-wise) and data.frames (row-wise), so: as.matrix() to be sure. ###mjm fix 2014-09-24: if NAs in raw data X, results would be NA, so: added na.rm = TRUE to the routine cats <- lapply(split(as.matrix(X), its), max, na.rm = TRUE) #splits the data matrix according to items and finds the maximum category ###mjm fix 2014-09-24: fix for NAs, see above max.cat <- max(X, na.rm = TRUE) #overall maximum category vec.cat <- lapply(cats, function(x){ c(seq_len(x), rep(0, max.cat-x)) }) vec.cat #the ominous list of form c(1:categories, 0, 0, 0) } build_effdes <- function(nitems, mpoints, pplgrps, categos, groupvec){ #builds treatment design structure for W # #mpoints>nitems>treat>catego #build group design tmp1 <- diag(pplgrps) tmp1[pplgrps, pplgrps] <- 0 eff.tmp1 <- lapply(categos, function(x)(tmp1%x%x)) #list with categories per item, replicated per group eff.tmp2 <- as.matrix(bdiag(eff.tmp1)) #blockdiagonal with blocks equal to the categories eff.tmp3 <- diag(mpoints-1)%x%eff.tmp2 #blow up to mpoints nuller <- matrix(0, nrow=dim(eff.tmp2)[1], ncol=dim(eff.tmp3)[2]) #baseline (tp=1) gr.bu <- rbind(nuller, eff.tmp3) #combine baseline and effects #labelling of effects names1 <- unique(names(groupvec)) #names1 <- paste0("G", pplgrps:1) names2 <- paste(names1, "I", sep=".") names3 <- paste0(names2, rep(1:nitems, each=pplgrps)) names4 <- paste(names3, "t", sep=".") names5 <- paste0(names4, rep(2:mpoints, each=pplgrps*nitems)) colnames(gr.bu) <- names5 #columns with zeros (baseline group) are removed now rem.0 <- NA for(i in 1:dim(gr.bu)[2]) {rem.0[i] <- all(gr.bu[, i]==0)} gr.bu.red <- gr.bu[, which(rem.0==0)] return(gr.bu.red) } build_trdes <- function(nitems, mpoints, pplgrps, categos){ #builds trend design structure for W # #mpoints>nitems>treat>catego tr.tmp1 <- lapply(categos, function(x) rep(x, pplgrps)) #replicate number of categories per item times the groups tr.tmp2 <- as.matrix(bdiag(tr.tmp1)) #build the blockdiaginal for all items tr.tmp3 <- diag(mpoints-1)%x%tr.tmp2 #blow it up to the time points necessary nuller <- matrix(0, nrow=dim(tr.tmp2)[1], ncol=dim(tr.tmp3)[2]) #baseline tr.bu <- rbind(nuller, tr.tmp3) #combine mpoints and baseline #structure: for each category multiply it with a vector of group indicators #hence the grouping is: #tau1 t2-t1, tau2 t2-t1, ..., tauk t2-t1, tau1 t3-t1, tau2 t3-t1, .. tauk t3-t1 #cat("Design matrix columns are:","\n","tau_1^(t2-t1), tau_2^(t2-t1), ..., tau_k^(t2-t1), tau_1^(t3-t1), tau_2(t3-t1), ..., tau_k^(t3-t1), etc.","\n") #labeling names1 <- paste0("trend.I", 1:nitems) names2 <- paste(names1, "t", sep=".") names3 <- paste0(names2, rep(2:mpoints, each=nitems)) colnames(tr.bu) <- names3 return(tr.bu) } build_catdes <- function(nitems, mpoints, pplgrps, categos){ #builds category design matrix #FIX ME: is a bit ugly, we might get the loops out somehow # #check if there are just binary items if(max(unlist(categos))<2) stop("items are (at most) binary and need no design") #currently equates cat.0 and cat.1 warning("Currently c0 and c1 are equated for each item", "\n") max.all <- max(unlist(categos)) #maximum category number ls.ct.des <- list() #list of designs for each item #here we walk through each item and build up the category design for(i in 1:nitems){ max.it <- sum(categos[[i]]!=0) #maximum category number of item i ct.des <- rbind(rep(0, dim(diag(max.all-1))[2]), diag(max.all-1)) #the design for the maximum number of categories in X rems <- max.all-max.it #the number of superfluous columns #here the superfluous columns are removed as the step from W to W* #the necessary rows with zeros however are maintained: #for a dichotomous item the structure is slightly different than for any other, since it returns an empty matrix of appropriate dimensions #for a polytomous item the superfluous columns are removed from the back ifelse(rems==max.all-1, ct.des<- as.matrix(ct.des[, -(1:max.all-1)]), ct.des<- as.matrix(ct.des[, 1:((max.all-1)-rems)])) ct.des.gr <- rep(1, pplgrps)%x%ct.des #blow it up to the number of groups ls.ct.des[[i]] <- ct.des.gr #list with all category designs for each item } ct.tmp2 <- as.matrix(bdiag(ls.ct.des)) #blockdiagonal matrix for a single mpoints ct.bu <- rep(1, mpoints)%x%ct.tmp2 #blow up to number of times points #try to first build first item, then second and so on, then blow up #labeling: pretty unelegant too names <- NA for(i in 1:nitems){ cat <- max(categos[[i]]) ifelse(cat==1, names1 <- "remove", names1 <- paste0("c", 2:cat)) names2 <- paste0("I", i) names3 <- paste(names1, names2, sep=".") names<- c(names, names3) } names <- names[-1] if(length(grep("remove", names)>0)) names <- names[-grep("remove", names)] colnames(ct.bu) <- names return(ct.bu) } eRm/R/performance_measures.R0000755000175100001440000003740514375241642015570 0ustar hornikusers## ------------------------------------------------------------------------ ## classical machine learning contingency table measures ## ------------------------------------------------------------------------ .performance.accuracy <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { list( cutoffs, (tn+tp) / length(predictions) ) } .performance.error.rate <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { list( cutoffs, (fn+fp) / length(predictions) ) } .performance.false.positive.rate <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { list( cutoffs, fp / n.neg ) } .performance.true.positive.rate <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { list( cutoffs, tp / n.pos ) } .performance.false.negative.rate <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { list( cutoffs, fn / n.pos ) } .performance.true.negative.rate <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { list( cutoffs, tn / n.neg ) } .performance.positive.predictive.value <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { ppv <- tp / (fp + tp) list( cutoffs, ppv ) } .performance.negative.predictive.value <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { npv <- tn / (tn + fn) list( cutoffs, npv ) } .performance.prediction.conditioned.fallout <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { ppv <- .performance.positive.predictive.value(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred)[[2]] list( cutoffs, 1 - ppv ) } .performance.prediction.conditioned.miss <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { npv <- .performance.negative.predictive.value(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred)[[2]] list( cutoffs, 1 - npv ) } ## ------------------------------------------------------------------------ ## ...not actually performance measures, but very useful as a second axis ## against which to plot a "real" performance measure ## (popular example: lift charts) ## ------------------------------------------------------------------------ .performance.rate.of.positive.predictions <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { list( cutoffs, n.pos.pred / (n.pos + n.neg) ) } .performance.rate.of.negative.predictions <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { list( cutoffs, n.neg.pred / (n.pos + n.neg) ) } ## ------------------------------------------------------------------------ ## Classical statistical contingency table measures ## ------------------------------------------------------------------------ .performance.phi <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { list(cutoffs, (tn*tp - fn*fp) / sqrt(n.pos * n.neg * n.pos.pred * n.neg.pred) ) } .performance.mutual.information <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { n.samples <- n.pos + n.neg mi <- c() for (k in 1:length(cutoffs)) { kij <- rbind( c(tn[k],fn[k]), c(fp[k],tp[k]) ) ki.j. <- rbind(c(n.neg * n.neg.pred[k], n.neg.pred[k] * n.pos), c(n.neg * n.pos.pred[k], n.pos * n.pos.pred[k])) log.matrix <- log2( kij / ki.j.) log.matrix[kij/ki.j.==0] <- 0 mi <- c(mi, log2(n.samples) + sum( kij * log.matrix) / n.samples ) } list( cutoffs, mi ) } .performance.chisq <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { chisq <- c() for (i in 1:length(cutoffs)) { A <- rbind( c( tn[i], fn[i]), c(fp[i], tp[i]) ) chisq <- c(chisq, chisq.test(A,correct=F)$statistic ) } list( cutoffs, chisq ) } .performance.odds.ratio <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { list( cutoffs, tp * tn / (fn * fp) ) } ## ------------------------------------------------------------------------ ## Other measures based on contingency tables ## ------------------------------------------------------------------------ .performance.lift <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { n.samples <- n.pos + n.neg list( cutoffs, (tp / n.pos) / (n.pos.pred / n.samples) ) } .performance.f <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred, alpha) { prec <- .performance.positive.predictive.value(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred)[[2]] list( cutoffs, 1/ ( alpha*(1/prec) + (1-alpha)*(1/(tp/n.pos)) ) ) } .performance.rocconvexhull <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { x <- fp / n.neg y <- tp / n.pos finite.bool <- is.finite(x) & is.finite(y) x <- x[ finite.bool ] y <- y[ finite.bool ] if (length(x) < 2) { stop("Not enough distinct predictions to compute ROC convex hull.") } ## keep only points on the convex hull ind <- chull(x, y) x.ch <- x[ind] y.ch <- y[ind] ## keep only convex hull points above the diagonal, except (0,0) ## and (1,1) ind.upper.triangle <- x.ch < y.ch x.ch <- c(0, x.ch[ind.upper.triangle], 1) y.ch <- c(0, y.ch[ind.upper.triangle], 1) ## sort remaining points by ascending x value ind <- order(x.ch) x.ch <- x.ch[ind] y.ch <- y.ch[ind] list( x.ch, y.ch ) } ## ---------------------------------------------------------------------------- ## Cutoff-independent measures ## ---------------------------------------------------------------------------- .performance.auc <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred, fpr.stop) { x <- fp / n.neg y <- tp / n.pos finite.bool <- is.finite(x) & is.finite(y) x <- x[ finite.bool ] y <- y[ finite.bool ] if (length(x) < 2) { stop(paste("Not enough distinct predictions to compute area", "under the ROC curve.")) } if (fpr.stop < 1) { ind <- max(which( x <= fpr.stop )) tpr.stop <- approxfun( x[ind:(ind+1)], y[ind:(ind+1)] )(fpr.stop) x <- c(x[1:ind], fpr.stop) y <- c(y[1:ind], tpr.stop) } ans <- list() auc <- 0 for (i in 2:length(x)) { auc <- auc + 0.5 * (x[i] - x[i-1]) * (y[i] + y[i-1]) } ans <- list( c(), auc) names(ans) <- c("x.values","y.values") return(ans) } .performance.precision.recall.break.even.point <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { pred <- prediction( predictions, labels) perf <- performance( pred, measure="prec", x.measure="rec") x <- rev(perf@x.values[[1]]) y <- rev(perf@y.values[[1]]) alpha <- rev(perf@alpha.values[[1]]) finite.bool <- is.finite(alpha) & is.finite(x) & is.finite(y) x <- x[ finite.bool ] y <- y[ finite.bool ] alpha <- alpha[ finite.bool ] if (length(x) < 2) { stop(paste("Not enough distinct predictions to compute", "precision/recall intersections.")) } intersection.cutoff <- c() intersection.pr <- c() ## find all intersection points by looking at all intervals (i,i+1): ## if the difference function between x and y has different signs at the ## interval boundaries, then an intersection point is in the interval; ## compute as the root of the difference function if ( (x[1]-y[1]) == 0) { intersection.cutoff <- c( alpha[1] ) intersection.pr <- c( x[1] ) } for (i in (1:(length(alpha)-1))) { if ((x[i+1]-y[i+1]) == 0) { intersection.cutoff <- c( intersection.cutoff, alpha[i+1] ) intersection.pr <- c( intersection.pr, x[i+1] ) } else if ((x[i]-y[i])*(x[i+1]-y[i+1]) < 0 ) { ans <- uniroot(approxfun(c(alpha[i], alpha[i+1] ), c(x[i]-y[i], x[i+1]-y[i+1])), c(alpha[i],alpha[i+1])) intersection.cutoff <- c(intersection.cutoff, ans$root) intersection.pr <- c(intersection.pr, ans$f.root) } } list( rev(intersection.cutoff), rev(intersection.pr) ) } .performance.calibration.error <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred, window.size) { if (window.size > length(predictions)) { stop("Window size exceeds number of predictions.") } if (min(predictions)<0 || max(predictions)>1) { stop("Calibration error needs predictions between 0 and 1") } pos.label <- levels(labels)[2] neg.label <- levels(labels)[1] ordering <- rev(order( predictions )) predictions <- predictions[ ordering ] labels <- labels[ ordering ] median.cutoffs <- c() calibration.errors <- c() for (left.index in 1 : (length(predictions) - window.size+1) ) { right.index <- left.index + window.size - 1 pos.fraction <- sum(labels[left.index : right.index] == pos.label) / window.size mean.prediction <- mean( predictions[ left.index : right.index ] ) calibration.errors <- c(calibration.errors, abs(pos.fraction - mean.prediction)) median.cutoffs <- c(median.cutoffs, median(predictions[left.index:right.index])) } list( median.cutoffs, calibration.errors ) } .performance.mean.cross.entropy <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { if (! all(levels(labels)==c(0,1)) || any(predictions<0) || any(predictions>1) ) { stop(paste("Class labels need to be 0 and 1 and predictions between", "0 and 1 for mean cross entropy.")) } pos.label <- levels(labels)[2] neg.label <- levels(labels)[1] list( c(), - 1/length(predictions) * (sum( log( predictions[which(labels==pos.label)] )) + sum( log( 1 - predictions[which(labels==neg.label)] ))) ) } .performance.root.mean.squared.error <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { ## convert labels from factor to numeric values labels <- as.numeric(levels(labels))[labels] if (any(is.na(labels))) { stop("For rmse predictions have to be numeric.") } list( c(), sqrt( 1/length(predictions) * sum( (predictions - labels)^2 )) ) } ## ---------------------------------------------------------------------------- ## Derived measures: ## ---------------------------------------------------------------------------- .performance.sar <- function( predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { pred <- prediction( predictions, labels) perf.acc <- performance( pred, measure="acc") perf.rmse <- performance( pred, measure="rmse") perf.auc <- performance( pred, measure="auc") list(cutoffs, 1/3 * (perf.acc@y.values[[1]] + (1 - perf.rmse@y.values[[1]]) + perf.auc@y.values[[1]])) } ## ---------------------------------------------------------------------------- ## Measures taking into account actual cost considerations ## ---------------------------------------------------------------------------- .performance.expected.cost <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred) { ## kick out suboptimal values (i.e. fpr/tpr pair for which another one ## with same fpr and higher tpr exists, ## or one for which one with same tpr but lower fpr exists if (n.neg==0 || n.pos==0) { stop(paste("At least one positive and one negative sample are", "needed to compute a cost curve.")) } fpr <- fp / n.neg tpr <- tp / n.pos ## sort by fpr (ascending), in case of ties by descending tpr ind <- order(fpr,-tpr) fpr <- fpr[ind] tpr <- tpr[ind] ## for tied fprs, only the one with the highest tpr is kept ind <- !duplicated(fpr) fpr <- fpr[ind] tpr <- tpr[ind] ## for tied tprs, only keep the one with the lowest fpr ind <- order(-tpr,fpr) fpr <- fpr[ind] tpr <- tpr[ind] ind <- !duplicated(tpr) fpr <- fpr[ind] tpr <- tpr[ind] if (!any(0==fpr & 0==tpr)) { fpr <- c(0,fpr) tpr <- c(0,tpr) } if (!any(1==fpr & 1==tpr)) { fpr <- c(fpr,1) tpr <- c(tpr,1) } ## compute all functions f <- list() for (i in 1:length(fpr)) { f <- c(f, .construct.linefunct( 0, fpr[i], 1, 1-tpr[i] )) } ## compute all intersection points x.values <- c() y.values <- c() for (i in 1:(length(fpr)-1)) { for (j in (i+1):length(fpr)) { ans <- .intersection.point( f[[i]], f[[j]] ) if (all(is.finite(ans))) { y.values.at.current.x <- c() for (k in 1:length(f)) { y.values.at.current.x <- c(y.values.at.current.x, f[[k]](ans[1])) } if (abs(ans[2] - min(y.values.at.current.x )) < sqrt(.Machine$double.eps)) { x.values <- c(x.values, ans[1]) y.values <- c(y.values, ans[2]) } } } } if (!any(0==x.values & 0==y.values)) { x.values <- c(0,x.values) y.values <- c(0,y.values) } if (!any(1==x.values & 0==y.values)) { x.values <- c(x.values,1) y.values <- c(y.values,0) } ind <- order( x.values) list( x.values[ind], y.values[ind] ) } .performance.cost <- function(predictions, labels, cutoffs, fp, tp, fn, tn, n.pos, n.neg, n.pos.pred, n.neg.pred, cost.fp, cost.fn) { n.samples <- n.pos + n.neg cost <- ((n.pos / n.samples) * (fn / n.pos) * cost.fn + (n.neg / n.samples) * (fp / n.neg) * cost.fp) list( cutoffs, cost ) } eRm/R/plotGOF.LR.R0000755000175100001440000002430714375241642013206 0ustar hornikusersplotGOF.LR <- function( x, beta.subset = "all", main = "Graphical Model Check", xlab, ylab, tlab = "item", xlim, ylim, type = "p", pos = 4, conf = NULL, ctrline = NULL, smooline = NULL, asp = 1, x_axis = TRUE, y_axis = TRUE, set_par = TRUE, reset_par = TRUE, ... ){ # graphical model check # beta.subset...plot only a subset of beta-parameters; either "all" or an index vector # x...object of class LR (from LRtest) # tlab ... labelling: "item" abbreviated beta parameter name, "number" number from beta par list, # "identify" interactive, "none" # pos ... (where the textlabel appears) # conf ... confidence ellipses: NULL or # list(gamma=0.95, col="red", ia=TRUE, lty="dashed", which=all items in beta.subset) # ctrline ... control lines (confidence bands): NULL or list(gamma=0.95,lty="solid", col="blue") # smooline ... smoothed control lines (confidence bands): NULL or list(gamma=0.95,lty="solid", col="blue", spar=0.5) # ... additional graphic parameters # save current options() and par() values and restore them on exit old_options <- options(locatorBell = FALSE) if(set_par){ old_par <- par(mar=c(4,4,3,0)+.5, no.readonly = TRUE) } on.exit({ if(set_par && reset_par){ par(old_par) } options(old_options) }) if(length(x$likgroup) > 2L) warning("Only the parameters for the first two subgroups are plotted!") if(missing(xlab)) xlab <- paste0("Beta for Group: ", x$spl.gr[1L]) if(missing(ylab)) ylab <- paste0("Beta for Group: ", x$spl.gr[2L]) nparg1 <- length(x$betalist[[1L]]) nparg2 <- length(x$betalist[[2L]]) if(nparg1 != nparg2) stop("Unequal number of parameters in the subgroups! Plot cannot be produced, choose another split in LRtest!") beta1 <- -x$betalist[[1L]] # -1 to obtain difficulty parameters beta2 <- -x$betalist[[2L]] if(is.character(beta.subset)) { if(beta.subset == "all"){ beta.subset <- seq_along(beta1) #textlab <- names(beta1) switch(EXPR = tlab, item = textlab <- gsub("^beta\\ I", "", names(beta1)), # remove "beta I" from names number = textlab <- seq_along(beta1), identify = labs <- gsub("^beta\\ I", "", names(beta1)) ) } else { textlab <- beta.subset } } else { switch(EXPR = tlab, item = textlab <- gsub("^beta\\ I", "", names(beta1)[beta.subset]), # remove "beta I" from names number = textlab <- beta.subset, identify = labs <- gsub("^beta\\ I", "", names(beta1)[beta.subset]) ) } # se's needed for ellipses and control lines if(is.list(conf) || is.list(ctrline) || is.list(smooline)){ if(any(is.na(unlist(x$selist)))) { warning('Confidence ellipses or control lines cannot be plotted.\n LR object without standard errors.\n Use option "se = TRUE" in LRtest()') conf <- ctrline <- NULL } else { s1 <- x$selist[[1L]] s2 <- x$selist[[2L]] v1 <- s1^2 v2 <- s2^2 suspicious.se <- any(cbind(s1, s2)[beta.subset] > 10) if(suspicious.se) warning("Suspicious size of standard error(s).\n Check model specification, split criterion, data.") } #if(any(abs(cbind(beta1,beta2)[beta.subset])>8)){ # warning("Suspicious size of parameter estimate(s).\n Check model specification, split criterion, data.") # if(is.null(conf)) conf$ia <- FALSE } ### confidence ellipses #################################################### ### COMPUTATIONS ########################################################### if(is.list(conf)){ # simple ellipse to replace the function ellipse() from the car package simple_ellipse <- function(center, a, b, n = 200L, border_col){ angle_t <- seq(0, 2*pi, length.out = n)[-1L] polygon(center[1L] + a * cos(angle_t), center[2L] + b * sin(angle_t), lwd = 1.0, border = border_col) } # select items for which ellipses are drawn ## rh 2011-05-31 if(is.null(conf$which)) conf$which <- beta.subset#seq_along(beta.subset) if(!all(conf$which %in% beta.subset)) stop("Incorrect item number(s) for which ellipses are to be drawn") if(is.null(conf$col)){ conf$c <- rep("red", length.out = length(beta1)) } else if(!is.null(conf$which)){ # conf$c <- rep(NA,length.out=length(beta.subset)) conf$c <- rep(NA, length.out = length(conf$which)) if(length(conf$c)!=length(conf$which)){ stop('"which" and "col" must have the same length in specification of "conf"') } else { conf$c[conf$which] <- conf$col } } conf$col <- conf$c if(is.null(conf$gamma)) conf$gamma <- 0.95 if(is.null(conf$lty)) conf$lty <- "dotted" if(is.null(conf$ia)) conf$ia <- FALSE z <- qnorm((1.0-conf$gamma)/2.0, lower.tail = FALSE) ci1u <- beta1 + z*s1 ci1l <- beta1 - z*s1 ci2u <- beta2 + z*s2 ci2l <- beta2 - z*s2 } ################################################################################ ### 95% control lines (Wright) ############################################# ### COMPUTATIONS ########################################################### if(is.list(ctrline)){ if(is.null(ctrline$gamma)) ctrline$gamma <- 0.95 if(is.null(ctrline$col)) ctrline$col <- "blue" if(is.null(ctrline$lty)) ctrline$lty <- "solid" z <- qnorm((1.0 - ctrline$gamma)/2.0, lower.tail = FALSE) d <- (beta1 + beta2)/2 se.d <- sqrt(v1 + v2) d <- sort(d) se.d <- se.d[order(d)] upperx <- d - z*se.d/2 uppery <- d + z*se.d/2 } ################################################################################ ################################################################################ ### 95% smooth control lines (Wright) ###################################### ### COMPUTATIONS ########################################################### if(is.list(smooline)){ if(is.null(smooline$gamma)) smooline$gamma <- 0.95 if(is.null(smooline$col)) smooline$col <- "blue" if(is.null(smooline$lty)) smooline$lty <- "solid" if(is.null(smooline$spar)) smooline$spar <- 0.5 z <- qnorm((1.0 - smooline$gamma)/2.0, lower.tail = FALSE) d <- (beta1 + beta2)/2 se.d <- sqrt(v1 + v2) d <- sort(d) se.d <- se.d[order(d)] upperx <- d - z*se.d/2 uppery <- d + z*se.d/2 } ################################################################################ if(!exists("ci1l", inherits = FALSE)) ci1l <- NA if(!exists("ci1u", inherits = FALSE)) ci1u <- NA if(!exists("ci2l", inherits = FALSE)) ci2l <- NA if(!exists("ci2u", inherits = FALSE)) ci2u <- NA if(!exists("upperx", inherits = FALSE)) upperx <- NA if(!exists("uppery", inherits = FALSE)) uppery <- NA if(missing(xlim)){ xlim <- range(beta1[beta.subset], ci1l, ci1u, upperx, uppery, na.rm = TRUE) } if(missing(ylim)){ ylim <- range(beta2[beta.subset], ci2l, ci2u, upperx, uppery, na.rm = TRUE) } plot.new() plot.window(xlim = xlim, ylim = ylim, asp = asp) title(main = main, xlab = xlab, ylab = ylab) if(x_axis) axis(1) if(y_axis) axis(2) abline(0, 1) # confidence ellipses - if not interactive if(is.list(conf) && !conf$ia){ # non-interactive: plot of all ellipses at once x <- beta1 y <- beta2 for(i in beta.subset){ if(i %in% conf$which){ segments( x0 = c(x[i], ci1l[i]), y0 = c(ci2l[i], y[i]), x1 = c(x[i], ci1u[i]), y1 = c(ci2u[i], y[i]), col = conf$col[i], lty = conf$lty ) simple_ellipse( center = c(x[i],y[i]), a = abs(diff(c(ci1u[i],ci1l[i])))/2, b = abs(diff(c(ci2u[i],ci2l[i])))/2, n = 200L, border_col = conf$col[i] ) } } } # 95% control lines (Wright) - plotting if(is.list(ctrline)){ lines(upperx, uppery, col = ctrline$col, lty = ctrline$lty) lines(uppery, upperx, col = ctrline$col, lty = ctrline$lty) } # 95% smooth lines (Wright) - plotting if(is.list(smooline)){ lines(smooth.spline(upperx, uppery, spar = smooline$spar), col = smooline$col, lty = smooline$lty) lines(smooth.spline(uppery, upperx, spar = smooline$spar), col = smooline$col, lty = smooline$lty) } if(exists("textlab", inherits = FALSE)){ text(beta1[beta.subset], beta2[beta.subset], labels = textlab, pos = pos, ...) } points(x = beta1[beta.subset], y = beta2[beta.subset], type = type, ...) if(exists("labs", inherits = FALSE)){ xycoords <- cbind(beta1[beta.subset], beta2[beta.subset]) nothing <- identify(xycoords, labels = labs, atpen = TRUE, offset = 1) } box() # interactive confidence ellipses if(is.list(conf) && conf$ia){ identifyEll <- function(x, y, ci1u, ci1l, ci2u,ci2l, v1, v2, conf, n=length(x), ...){ ## source: example from help("identify") ## a function to use identify to select points, and overplot the ## points with a confidence ellipse as they are selected xy <- xy.coords(x, y) x <- xy$x y <- xy$y sel <- rep(FALSE, length(x)) res <- integer(0) while(sum(sel) < n){ ans <- identify(x[!sel], y[!sel], n=1, plot=FALSE, ...) if(!length(ans)) break ans <- which(!sel)[ans] i <- ans segments( x0 = c(x[i], ci1l[i]), y0 = c(ci2l[i], y[i]), x1 = c(x[i], ci1u[i]), y1 = c(ci2u[i], y[i]), col = conf$col[i], lty = conf$lty ) simple_ellipse( center = c(x[i],y[i]), a = abs(diff(c(ci1u[i],ci1l[i])))/2, b = abs(diff(c(ci2u[i],ci2l[i])))/2, n = 200L, border_col = conf$col[i] ) sel[ans] <- TRUE res <- c(res, ans) } #res } identifyEll(beta1[beta.subset],beta2[beta.subset], ci1u[beta.subset], ci1l[beta.subset], ci2u[beta.subset], ci2l[beta.subset], v1[beta.subset], v2[beta.subset], conf) } }eRm/R/rsextrmat.R0000755000175100001440000000104614473215462013404 0ustar hornikusers"rsextrmat" <- function(RSobj, mat.no = 1) { obj.name <- deparse(substitute(RSobj)) if (!("RSmpl" %in% class(RSobj) || "RSmplext" %in% class(RSobj))){ err.text<-paste(obj.name," is not a sample object - see help(\"rsextrobj\")",sep ="",collapse="") stop(err.text) } if(mat.no > RSobj$n_tot) stop("\n\tElement ",mat.no," not available (",obj.name," has ", RSobj$n_tot, " elements).") obj<-rsextrobj(RSobj, start = mat.no, end = mat.no) RET<-rstats(obj, function(x) matrix(x, nrow = obj$n))[[1]] RET } eRm/R/SepRel.R0000755000175100001440000000436214375241642012551 0ustar hornikusersSepRel <- function (pobject){ # requires an object of class "ppar" if(!("ppar" %in% class(pobject))) stop('"pobject" must be of class "ppar"') # get person scores from theta table (which is generated by the person.parameter function) PersonScoresFull <- pobject[["theta.table"]][["Person Parameter"]] names(PersonScoresFull) <- rownames(pobject[["theta.table"]]) PersonScoresFull <- PersonScoresFull[pobject[["theta.table"]][["Interpolated"]] == FALSE] ## disregard full/0 responses PersonScores <- PersonScoresFull[complete.cases(PersonScoresFull)] # get standard errors se_vec <- unlist(pobject[["se.theta"]]) names(se_vec) <- gsub("NAgroup[0-9]+.", "", names(se_vec)) ind <- match(names(PersonScores), names(se_vec)) ## put them in right order StandardErrors <- se_vec[ind] # ============================== # compute seperation reliability # ============================== # compute the Observed Variance (also known as Total Person Variability or Squared Standard Deviation) SSD.PersonScores <- var(PersonScores) # compute the Mean Square Measurement error (also known as Model Error variance) MSE <- sum((StandardErrors)^2) / length(StandardErrors) separation.reliability <- (SSD.PersonScores-MSE) / SSD.PersonScores # define the outcome of the function "SepRel" as an object of class "separation" result <- structure( list( "sep.rel" = separation.reliability, "SSD.PS" = SSD.PersonScores, "MSE" = MSE ), class="eRm_SepRel" ) return(result) } print.eRm_SepRel <- function(x, ...){ if(interactive()) writeLines("") writeLines(paste0("Separation Reliability: ", round(x$sep.rel, 4L))) if(interactive()) writeLines("") } summary.eRm_SepRel <- function(object, ...){ txt1 <- format(c( "Separation Reliability: ", "Observed Variance: ", "Mean Square Measurement Error: " ), justify = "right") txt2 <- c( " (Squared Standard Deviation)", " (Model Error Variance)" ) if(interactive()) writeLines("") writeLines(paste0(txt1[1L], round(object$sep.rel, 4L))) writeLines("") writeLines(paste0(txt1[2L], round(object$SSD.PS, 4L), txt2[1L])) writeLines(paste0(txt1[3L], round(object$MSE, 4L), txt2[2L])) if(interactive()) writeLines("") } eRm/R/print.LR.R0000755000175100001440000000041014375241642013015 0ustar hornikusers`print.LR` <- function(x,...) { #print method for object of class "LR" (LRtest) cat("\n") cat("Andersen LR-test: \n") cat("LR-value:", round(x$LR,3),"\n") cat("Chi-square df:",x$df,"\n") cat("p-value: ",round(x$pvalue,3),"\n") cat("\n") } eRm/R/LRSM.R0000755000175100001440000000333614375241642012134 0ustar hornikusers`LRSM` <- function(X, W, mpoints = 1, groupvec = 1, se = TRUE, sum0 = TRUE, etaStart) { model <- "LRSM" call<-match.call() if (missing(W)) W <- NA else W <- as.matrix(W) if (missing(etaStart)) etaStart <- NA else etaStart <- as.vector(etaStart) XWcheck <- datcheck(X,W,mpoints,groupvec,model) #inital check of X and W X <- XWcheck$X lres <- likLR(X,W,mpoints,groupvec,model,st.err=se,sum0,etaStart) parest <- lres$parest #full groups for parameter estimation loglik <- -parest$minimum #log-likelihood value iter <- parest$iterations #number of iterations convergence <- parest$code etapar <- parest$estimate #eta estimates betapar <- as.vector(lres$W%*% etapar) #beta estimates if (se) { se.eta <- sqrt(diag(solve(parest$hessian))) #standard errors se.beta <- sqrt(diag(lres$W%*%solve(parest$hessian)%*%t(lres$W))) #se beta } else { se.eta <- rep(NA,length(etapar)) se.beta <- rep(NA,length(betapar)) } X01 <- lres$X01 labs <- labeling.internal(model,X,X01,lres$W,etapar,betapar,mpoints,max(groupvec)) #labeling for L-models W <- labs$W etapar <- labs$etapar betapar <- labs$betapar npar <- dim(lres$W)[2] #number of parameters result <- list(X=X,X01=X01,model=model,loglik=loglik,npar=npar,iter=iter,convergence=convergence, etapar=etapar,se.eta=se.eta,hessian=parest$hessian,betapar=betapar, se.beta=se.beta,W=W,mpoints=mpoints,ngroups=max(groupvec),groupvec=groupvec,call=call) class(result) <- "eRm" #classes: simple RM and extended RM result } eRm/R/anova.llra.R0000755000175100001440000000221614375241642013410 0ustar hornikusersanova.llra <- function(object, ...) UseMethod("anova.llra") anova.llra <- function(object,...) { objets <- list(object, ...) isllra <- unlist(lapply(objets, function(x) "llra" %in% class(x))) ## checks if (!all(isllra)) { objets <- objets[isllra] warning("non-LLRA-model(s) removed") } dimdata <- dim(objets[[1L]]$X) samedata <- unlist(lapply(objets, function(x) all(dim(x$X)==dimdata))) if (!all(samedata)) stop("models were not all fitted to the same size of dataset") nmodels <- length(objets) logliks <- as.numeric(lapply(objets, function(x) x$loglik)) npars <- as.numeric(lapply(objets, function(x) x$npar)) nparsS <- npars[order(npars)] logliksS <- logliks[order(npars)] lrstat <-c(NA,2*abs(diff(logliksS))) dfs <- c(NA,abs(diff(nparsS))) ps <- 1-pchisq(lrstat,dfs) tbl <- data.frame(nparsS, logliksS, dfs, lrstat, ps) dimnames(tbl) <- list(1L:nmodels, c("Npar", "logLik", "df", "-2LR","Asymp.p-Value")) title <- "Analysis of Deviance Table\n" structure(tbl, heading = title, class = c("anova", "data.frame")) } eRm/R/summary.RSctr.R0000755000175100001440000000055214375241642014105 0ustar hornikusers"summary.RSctr" <- function(object,...) { cat("\nCurrent sampler control specifications in ",deparse(substitute(object)),":\n", sep="") cat("\tburn_in =",object$burn_in,"\n") cat("\tn_eff =",object$n_eff,"\n") cat("\tstep =",object$step,"\n") cat("\tseed =",object$seed,"\n") cat("\ttfixed =",object$tfixed,"\n\n") invisible(object) } eRm/R/cmlprep.R0000755000175100001440000000765614375241642013032 0ustar hornikusers`cmlprep` <- function(X01,mt_vek,mpoints,Groups,W,gmemb) { levs <- (gmemb-1)*max(Groups)+Groups #merge Groups and gmemb vector into level vector if (length(Groups)==1) { #if no group contrast x_mt <- colSums(X01,na.rm=TRUE) #item category raw scores as vector #eventuell x_mtlist auf NA gruppen aufbrechen x_mtlist <- list(x_mt) ngroups <- 1 } else { #if groups defined ngroups <- max(Groups) #number of groups x_mtlist <- by(X01,levs,colSums,na.rm=TRUE) #item-category raw scores for each group (as list) x_mtlist.G <- by(X01,Groups,colSums,na.rm=TRUE) #item-category raw scores for each group (as list) #FIXME!!! use x_mtlist?? x_mt <- as.vector(unlist(x_mtlist.G)) #as vector: g1|g2|... } end1 <- length(mt_vek)*mpoints*ngroups mt_ind <- rep(1:end1,rep(mt_vek,mpoints*ngroups)) #category index vector (for converting x_mt into list) x_tmt <- split(x_mt,mt_ind) #list for likelihood: item-wise * ngroups rtot <- sum(mt_vek)*mpoints ics <- rep(sequence(mt_vek),mpoints) #item category scores for each item as vector rv <- apply(X01,1,function(x) { #person raw scores of 0/1 matrix ics[!is.na(x)]%*%na.exclude(x)}) #--- preparing index vector for item parameters --- if (ngroups > 1) { #groups seglen <- sum(mt_vek) #length of beta vector (segment) gind <- rep(rep(1:ngroups,rep(seglen,ngroups)),mpoints) #parameter index vector for group extraction } else { gind <- rep(1,dim(W)[1]) } #--- preparing lists for person splits --- rvlist <- split(rv,levs) #split person raw scores due to levels (NAgroup AND treatment) nrlist <- lapply(rvlist,function(rvel) { #list with item raw score frequencies for each group (transposed) rvtab <- table(rvel) #raw score frequencies dnamevek <- as.numeric(unlist(dimnames(rvtab))) #different raw scores for 0 fill up nr <- rep (0,rtot+1) #setting 0 raw score frequencies nr[dnamevek+1] <- rvtab #vector with person raw scores from 1:rtot (with 0 fill up) nr <- nr[-1] return(nr) }) if ((ngroups > 1) && (length(unique(gmemb)) > 1)) { #NA groups AND Groups gg <- table(Groups,gmemb) #gg[gg > 0] <- 1 g_NA <- as.vector(rowSums(gg)) #How many NA-sub groups in each Group #grgm <- cbind(Groups, gmemb) #grgmst <- apply(grgm,1,function(x) { #merge indexes to characters # paste(x[1],x[2]) }) #GGind <- rank(unique(grgmst)) #levtab <- table(levs) #frequencies of levels #FIXME!!! following line wrong index #gby <- rep(GGind,levtab) #ordering by NAgroups nested in Group #this probably does the job gby <- levs } else { g_NA <- 1 gby <- gmemb } NAstruc <- by(!is.na(X01),gby,function(x) { #list of unique NA structures for each Group x.u <- unique(x) as.numeric(as.matrix(x.u))}) #NA's are coded with 0 NAcheck <- sapply(NAstruc,sum) #if for certain NAgroups only 1 item was presented list(x_mt=x_mt,mt_ind=mt_ind,x_tmt=x_tmt,rtot=rtot,nrlist=nrlist,gind=gind,x_mtlist=x_mtlist, NAstruc=NAstruc,g_NA=g_NA,gby=gby) } eRm/R/stepwiseIt.R0000755000175100001440000000020414375241642013506 0ustar hornikusers`stepwiseIt` <- function(object, criterion = list("itemfit"), alpha = 0.05, verbose = TRUE, maxstep = NA)UseMethod("stepwiseIt") eRm/R/checkdata.R0000755000175100001440000001224014375241642013260 0ustar hornikusers# uses # component.dist # reachability # geodist # symmetrize # components.c # geodist.c # # from R package sna # function to check for ill-conditioned data in the RM # requires package sna ##checkdata<-function(x) ##{ ## k<-ncol(x) ## adj<-matrix(0,nc=k,nr=k) ## for (i in 1:k) for(j in 1:k) { ## adj[i,j]<- 1*any(x[,i]>x[,j],na.rm=TRUE) ## } ## ## #library(sna) ## #adj <- diag.remove(adj) ## # %print(adj) # adjacency marix ## cd <- component.dist(adj, connected = "strong") ## cm <- cd$membership ## cmp <- max(cm) ## ## ## if(cmp>1) { ## cat("Data:",deparse(substitute(x)),"are ill-conditioned\n") ## cat("Number of strong components",cmp,"\n") ## cat("Component membership of items: ",cm,"\n") ## } else ## cat("Data:",deparse(substitute(x)),"are well-conditioned\n") ##} ## ###################################################### component.dist<- function (dat, connected = c("strong", "weak", "unilateral", "recursive")) { # dat <- as.sociomatrix.sna(dat) # if (is.list(dat)) # return(lapply(dat, component.dist, connected = connected)) # else if (length(dim(dat)) > 2) # return(apply(dat, 1, component.dist, connected = connected)) n <- dim(dat)[2] if (any(dat != t(dat))) dat <- switch(match.arg(connected), weak = symmetrize(dat, rule = "weak"), unilateral = reachability(dat), strong = symmetrize(reachability(dat), rule = "strong"), recursive = symmetrize(dat, rule = "strong")) # if (match.arg(connected) == "unilateral") # if (any(dat != t(dat))) # warning("Nonunique unilateral component partition detected in component.dist. Problem vertices will be arbitrarily assigned to one of their components.\n") membership <- rep(0, n) membership <- .C("component_dist_R", as.double(dat), as.double(n), membership = as.double(membership), PACKAGE="eRm")$membership o <- list() o$membership <- membership o$csize <- vector() for (i in 1:max(membership)) o$csize[i] <- length(membership[membership == i]) o$cdist <- vector() for (i in 1:n) o$cdist[i] <- length(o$csize[o$csize == i]) o } #reachability - Find the reachability matrix of a graph. reachability<-function(dat,geodist.precomp=NULL){ #Pre-process the raw input # dat<-as.sociomatrix.sna(dat) # if(is.list(dat)) # return(lapply(dat,reachability,geodist.precomp=geodist.precomp)) # else if(length(dim(dat))>2) # return(apply(dat,1,reachability,geodist.precomp=geodist.precomp)) # return(unlist(apply(dat,1,function(x,geodist.precomp){list(reachability(x, geodist.precomp=geodist.precomp))},geodist.precomp=geodist.precomp),recursive=FALSE)) #End pre-processing #Get the counts matrix if(is.null(geodist.precomp)) cnt<-geodist(dat)$counts else cnt<-geodist.precomp$counts #Dichotomize and return apply(cnt>0,c(1,2),as.numeric) } #geodist - Find the numbers and lengths of geodesics among nodes in a graph #using a BFS, a la Brandes (2000). (Thanks, Ulrik!) geodist<-function(dat,inf.replace=Inf){ #Pre-process the raw input # dat<-as.sociomatrix.sna(dat) # if(is.list(dat)) # return(lapply(dat,geodist,inf.replace=inf.replace)) # else if(length(dim(dat))>2) # return(apply(dat,1,geodist,inf.replace=inf.replace)) #End pre-processing n<-dim(dat)[2] #Initialize the matrices sigma<-matrix(0,nrow=n,ncol=n) gd<-matrix(Inf,nrow=n,ncol=n) #Perform the calculation geo<-.C("geodist_R",as.double(dat),as.double(n),gd=as.double(gd), sigma=as.double(sigma),NAOK=TRUE,PACKAGE="eRm") #Return the results o<-list() o$counts<-matrix(geo$sigma,n,n) o$gdist<-matrix(geo$gd,n,n) o$gdist[o$gdist==Inf]<-inf.replace #Patch Infs, if desired o } #symmetrize - Convert a graph or graph stack to a symmetric form. Current rules #for symmetrizing include "upper" and "lower" diagonals, "weak" connectedness #rule, and a "strong" connectedness rule. symmetrize<-function(mats,rule="weak"){ #Pre-process the raw input # mats<-as.sociomatrix.sna(mats) # if(is.list(mats)) # return(lapply(mats,symmetrize,rule=rule)) #End pre-processing #Build the input data structures # if(length(dim(mats))>2){ # m<-dim(mats)[1] # n<-dim(mats)[2] # o<-dim(mats)[3] # d<-mats # }else{ m<-1 n<-dim(mats)[1] o<-dim(mats)[2] d<-array(dim=c(1,n,o)) d[1,,]<-mats # } #Apply the symmetry rule for(i in 1:m){ if(rule=="upper"){ # temp<-d[i,,] # for(j in 1:n) # temp[j:n,j]<-temp[j,j:n] # d[i,,]<-temp # }else if(rule=="lower"){ # temp<-d[i,,] # for(j in 1:n) # temp[j,j:n]<-temp[j:n,j] # d[i,,]<-temp # }else if(rule=="weak"){ # d[i,,]<-matrix(as.numeric(d[i,,]|t(d[i,,])),nrow=n,ncol=o) }else if(rule=="strong"){ d[i,,]<-matrix(as.numeric(d[i,,]&t(d[i,,])),nrow=n,ncol=o) } } #Return the symmetrized matrix if(m==1) out<-d[1,,] else out<-d out } eRm/R/datprep_LRSM.R0000755000175100001440000001066414375241642013655 0ustar hornikusers`datprep_LRSM` <- function(X,W,mpoints,Groups,sum0) { #TFrow <- (rowSums(X)==0) #el. persons with 0 rawscore #X <- X[!TFrow,] ngroups <- max(Groups) #number of groups N <- dim(X)[1] #number of persons K <- dim(X)[2]/mpoints #number of items hmax <- max(X,na.rm=TRUE) #highest category mt_vek <- rep(hmax,K) #number of categories - 1 for each item mt_vek_0 <- mt_vek+1 #number of categories for each item X01_0 <- matrix(rep(0,(N*sum(mt_vek_0)*mpoints)),nrow=N) #empty 0/1 matrix K1 <- dim(X)[2] cummt0 <- c(0,cumsum(rep(mt_vek_0,mpoints))[1:(K1-1)])+1 #index vector for 0th category indmatp <- apply(X,1,function(xi) {xi+cummt0}) #preparing index matrix for 1 responses imp1 <- as.vector(indmatp) imp2 <- rep(1:N,rep(K1,N)) indmat <- cbind(imp2,imp1) #final index matrix for 1 responses X01_0[indmat] <- 1 #0/1 matrix with 0th category d1 <- 1:N d2 <- 1:K1 coor <- expand.grid(d2,d1)[,c(2:1)] #X coordinates resvec <- as.vector(t(X)) #X as vector (rowwise) NAind <- as.matrix(coor[is.na(resvec),]) #index matrix for NA's in X mt_vek.t <- rep(mt_vek,mpoints) if (length(NAind) > 0) { NAindlist <- apply(NAind,1,function(x){ co <- seq(cummt0[x[2]],cummt0[x[2]]+mt_vek.t[x[2]]) NAind01 <- cbind(rep(x[1],length(co)),co) rownames(NAind01) <- NULL data.frame(NAind01,row.names=NULL) #list with NA indices }) indmatNA <- matrix(unlist(lapply(NAindlist, function(x) {t(as.matrix(x))})),ncol=2,byrow=TRUE) #matrix with NA indices X01_0[indmatNA] <- NA } X01 <- X01_0[,-cummt0] #automatized generation of the design matrix W if (length(W)==1) { #generating design matrix e_it <- gl(K,hmax) #factor for item parameters e_cat <- gl(hmax,1,K*hmax) #factor for category par if (sum0) { Xm <- model.matrix(~e_it+e_cat)[,-1] #dummy coding Xm[1:hmax,1:(K-1)] <- -1 #first item to be sum0 normalized } else { Xm <- model.matrix(~e_it+e_cat)[,-1] #design matrix with 0/1 contrasts (without intercept) } catvek <- 1:hmax #preparing the item design vectors e_itnew <- catvek*Xm[,1:(K-1)] Xm[,1:(K-1)] <- e_itnew W11 <- Xm #first part (same as RSM) without virtual items ZW <- dim(W11)[1] W1 <- NULL for (i in 1:(mpoints*ngroups)) W1 <- rbind(W1,W11) #first part with virtual items if (mpoints > 1) { #more than 1 measurement points if (ngroups > 1) { #more than 1 group/more mpoints t_mp1 <- rep(1:mpoints,rep(ZW*ngroups,mpoints)) t_mp <- factor(t_mp1) g_ng1 <- rep(rep(1:ngroups,rep(ZW,ngroups)),mpoints) g_ng <- factor(g_ng1) W2 <- model.matrix(~t_mp+g_ng)[,-1] #main effects g and mp W2[1:(ZW*ngroups),] <- 0 #remove main effects for the first test occasion } else { #1 group/more mpoints mp <- gl(mpoints,ZW) #factor for measurement points W2 <- model.matrix(~mp)[,-1] } } else if (ngroups > 1) { #1 mpoint/more groups g <- gl(ngroups,ZW) W2 <- model.matrix(~g)[,-1] warning("Group contrasts without repeated measures can not be estimated!") } else if (ngroups == 1) W2 <- NULL #1 mpoint/1 group contr <- W2*catvek #imposing item categories if (is.matrix(contr)==TRUE) { contrrow <- apply(contr,1,function(x) {x*1:dim(contr)[2]}) #imposing multiplicative factor over time & group contrasts W <- cbind(W1,t(contrrow)) #design matrix completed } else {W <- cbind(W1,contr)} colnames(W) <- NULL rownames(W) <- NULL } list(X=X,X01=X01,mt_vek=mt_vek,W=W) } eRm/R/logLik.ppar.r0000755000175100001440000000036014375241642013573 0ustar hornikuserslogLik.ppar <- function(object,...) { #object of class ppar # val <- object$loglik # attr(val, "df") <- object$npar val <- list(loglik = object$loglik, df = object$npar) # rh 26-03-2010 class(val) <- "logLik.ppar" val } eRm/R/zzz.R0000755000175100001440000000220614375241642012207 0ustar hornikuserssetClass("prediction", representation(predictions = "list", labels = "list", cutoffs = "list", fp = "list", tp = "list", tn = "list", fn = "list", n.pos = "list", n.neg = "list", n.pos.pred = "list", n.neg.pred = "list")) setClass("performance", representation(x.name = "character", y.name = "character", alpha.name = "character", x.values = "list", y.values = "list", alpha.values = "list" )) #setMethod("plot",signature(x="performance",y="missing"), # function(x,y,...) { # .plot.performance(x,...) # }) prettyPaste <- function(...){ paste(strwrap(paste0(..., collapse = ""), width = getOption("width")), sep="\n", collapse="\n") } eRm/R/confint.eRm.r0000755000175100001440000000100714375241642013572 0ustar hornikusersconfint.eRm <- function(object, parm="beta", level = 0.95, ...) { #parm...either "beta" or "eta" #object of class "eRm" a <- (1 - level)/2 a <- c(a, 1 - a) pct <- paste(a*100,"%") fac <- qnorm(a) if (parm=="eta") { cf <- object$etapar ses <- object$se.eta dn <- names(object$etapar) } if (parm=="beta") { cf <- object$betapar ses <- object$se.beta dn <- names(object$betapar) } ci <- array(NA, dim = c(length(cf), 2), dimnames = list(dn,pct)) ci[] <- cf + ses %o% fac ci } eRm/R/plot.ppar.r0000755000175100001440000000271614375241642013337 0ustar hornikusersplot.ppar <- function(x, xlab = "Person Raw Scores", ylab = "Person Parameters (Theta)", main = NULL, ...){ ### function (x, y = NULL, type = "p", xlim = NULL, ylim = NULL, ### log = "", main = NULL, sub = NULL, ### xlab = "Person Raw Scores", ### ylab = "Person Parameters (Theta)", ### ann = par("ann"), axes = TRUE, frame.plot = axes, panel.first = NULL, ### panel.last = NULL, asp = NA, ...) # plot of the person raw scores against the person parameters # x...object of class "ppar" (resulting from person.parameter.eRm) pl <- x$pred.list #list with spline interpolations if(is.null(pl)) stop("Spline interpolation required in person.parameter.eRm!") X <- x$X if(length(x$pers.ex) > 0L){ X <- X[-x$pers.ex, ] #gmemb <- x$gmemb[-x$pers.ex] } gmemb <- x$gmemb X.list <- split(as.data.frame(X), as.factor(gmemb)) if(length(pl) > 1L){ for(i in seq_along(pl)) main.text <- paste("Person Parameter Plot of Group",i) } else { main.text <- "Plot of the Person Parameters" } if(!is.null(main)) main.text <- main for(i in seq_along(pl)){ # plotting without duplicates plot( unique(cbind( rowSums(X.list[[i]], na.rm = TRUE), x$thetapar[[i]] )), xlim = range(pl[[i]]$x), ylim = range(pl[[i]]$y), xlab = xlab, ylab = ylab, main = main.text, ...) lines(pl[[i]]$x, pl[[i]]$y) } } eRm/R/pmat.default.R0000755000175100001440000000024714375241642013741 0ustar hornikusers`pmat.default` <- function(object) # error message for using incorrect object { stop("pmat() requires object of class 'ppar', obtained from person.parameter()") } eRm/R/print.MLoef.r0000755000175100001440000000171514375241642013553 0ustar hornikusersprint.MLoef <- function(x,...) { #print method for object of class "MLoef" (MLoef) # prepare message for split criteria if( length(x$splitcr) == 1){ if( (x$splitcr == "median") | (x$splitcr == "mean")){ spl <- x$splitcr } } else{ spl <- "user-defined" } # # if(!is.null(x$warning)){ # if(x$splitcr == "median") cat("Warning: Item(s)",paste(names(x$warning),collapse=", "),"with raw score equal to the median assigned to the lower raw score group!\n") # if(x$splitcr == "mean") cat("Warning: Item(s)",paste(names(x$warning),collapse=", "),"with raw score equal to the mean assigned to the lower raw score group!\n") # } cat("\n") cat("Martin-Loef-Test (split criterion: ",spl,")\n",sep="") cat(paste("LR-value:",round(x$LR,3),"\n")) cat(paste("Chi-square df:",round(x$df,3),"\n")) cat(paste("p-value:",round(x$p.value,3)),"\n") if (!("MLx" %in% class(x))) cat("\n") # no blank line if called from print.MLobj (NPtest) } eRm/R/anova.eRm.R0000755000175100001440000000353614375241642013207 0ustar hornikusersanova.eRm <- function(object, ...){ models <- c(list(object), list(...)) #browser() # exclude LLRAs if(any(unlist(lapply(models, function(m){ "llra" %in% class(m) })))) stop("At least one model is an LLRA; comparison to other models not possible.") # check if models' data matrices are identical for(i in seq_along(models)[-1L]){ if(!identical(unname(models[[1L]][["X"]]), unname(models[[i]][["X"]]))) stop("Models are not nested.") } # sort by number of parameters models <- models[order(unlist(lapply(models, function(m){ m[["npar"]] })), decreasing = TRUE)] # extract information calls <- unlist(lapply(models, function(m){ deparse(m[["call"]]) })) LLs <- unlist(lapply(models, function(m){ m[["loglik"]] })) npar <- unlist(lapply(models, function(m){ m[["npar"]] })) dev <- -2*LLs LR <- abs(c(NA, LLs[1L] - LLs[-1L])) df <- c(NA, npar[1L] - npar[-1L]) p <- pchisq(LR, df, lower.tail = FALSE) return( structure( list( calls = calls, statistics = data.frame(LLs=LLs, dev=dev, npar=npar, LR=LR, df=df, p=p) ), class="eRm_anova") ) } print.eRm_anova <- function(x, ...){ if(interactive()) writeLines("") writeLines("Analysis of Deviances Table\n") for(i in seq_along(x[[1L]])){ writeLines(strwrap(paste0("Model ", i, ": ", x[[1L]][[i]]), width = getOption("width"), exdent = 4L)) } writeLines("") x_print <- as.matrix(x[[2L]]) rownames(x_print) <- paste0("Model ", seq_along(x[[1L]])) colnames(x_print) <- c("cond. LL", "Deviance", "npar", "LR", "df", "p-value") printCoefmat(as.matrix(x_print), cs.ind=c(1,2), tst.ind=4, has.Pvalue=TRUE, na.print = "") writeLines("") message("Note: The models appear to be nested, please check this assumption.") if(interactive()) writeLines("") invisible(x) } eRm/R/plotDIF.R0000755000175100001440000001431014473216354012653 0ustar hornikusersplotDIF <- function(object, item.subset=NULL, gamma = 0.95, main=NULL, xlim=NULL, xlab=" ", ylab=" ", col=NULL, distance, splitnames=NULL, leg=FALSE, legpos="bottomleft", ...){ if("LR" %in% class(object)){ object <- list(object) } else if(is.list(object)) { checklr <- sapply(object,class) if(!all(checklr=="LR")) stop("Elements of '",deparse(substitute(object)), "' must must be LRtest objects!") } else if(!is.list(object)) { stop(deparse(substitute(object)), "must be a list of LRtest objects!") } # extract number of LRtest objects M <- length(sapply(object, function(x) length(x))) # Confidence plot only for LRtest objects for(p in 1:M){ if((object[[p]]$model == "LLTM") || (object[[p]]$model == "LRSM") || (object[[p]]$model == "LPCM")){ stop("Confidence Plot is computed only for LRtest objects (RM, PCM, RSM)!") } else if(is.na(sum(unlist(object[[p]]$selist))) == TRUE){ stop("Confidence Plot is computed only for LRtest objects (RM) with standard errors (se=TRUE)!") } } # confidences list for storing confints confidences1 <- vector("list") # for labeling list entries nam.lab <- vector("character") # subgroups splits n2 <- sapply(object, function(x) length(x$spl.gr)) # loops for computing thresholds on LRtest objects for(m in 1:M){ # confidences for dichotomous items if(object[[m]]$model == "RM"){ confidences1[[m]] <- lapply(object[[m]]$fitobj,function(x){-confint(x, level=gamma)}) } else { # confidences for polytomous items confidences1[[m]] <- lapply(object[[m]]$fitobj, function(x){confint(thresholds(x),level=gamma)}) } } if(is.null(names(object)) == TRUE){ names(confidences1) <- paste("LRtest", 1:M, sep="") } else { names(confidences1) <- names(object) } confidences <- do.call(c,lapply(confidences1,function(x) x[1:length(x)])) if(missing(distance)) distance <- .7/(length(confidences)) if((distance <= 0) | (distance >= .5)) stop("distance must not be >= .5 or <= 0") model.vec <- vector("character") for(p in 1:M) model.vec[p] <- object[[p]]$model if(any(model.vec == "PCM") || any(model.vec == "RSM")){ model <- "PCM" } else { model <- "RM" } # extracting the longest element of confidences for definition of tickpositions and ticklabels # (snatches at the confidences-object index) factorlist <- (unique(unlist(lapply(confidences, function(x) dimnames(x)[[1]])))) #maxlist <- max(order(factorlist)) if(is.null(item.subset)){ if(model == "PCM"){ y.lab <- sub("thresh beta ", "", factorlist) } else { y.lab <- sub("beta ", "", factorlist) } } else if(is.character(item.subset)){ # item subset specified as character if(model == "PCM"){ y.lab <- sub("(.+)[.][^.]+$", "\\1", sub("thresh beta ", "", factorlist)) # search only for a "." separation after item label categ <- gsub("^.*\\.(.*)$","\\1", factorlist) # extract item categories - search only for a "." separation y.lab.id <- y.lab %in% item.subset y.lab1 <- y.lab[y.lab.id] categ1 <- categ[y.lab.id] y.lab <- paste(y.lab1, categ1, sep=".") # stick item categories and names together again factorlist <- factorlist[y.lab.id] } else { y.lab <- sub("beta ", "", factorlist) # search only for a "." separation after item label y.lab.id <- y.lab %in% item.subset y.lab <- y.lab[y.lab.id] factorlist <- factorlist[y.lab.id] } } else { # item subset specified as position number (index in data matrix) if(model == "PCM"){ y.lab <- sub("(.+)[.][^.]+$", "\\1", sub("thresh beta ", "", factorlist)) # search only for a "." separation after item label categ <- gsub("^.*\\.(.*)$","\\1", factorlist) # extract item categories - search only for a "." separation y.lab2 <- unique(y.lab)[item.subset] y.lab.id <- y.lab %in% y.lab2 y.lab1 <- y.lab[y.lab.id] categ1 <- categ[y.lab.id] y.lab <- paste(y.lab1, categ1, sep=".") # stick item categories and names together again factorlist <- factorlist[y.lab.id] } else { y.lab <- sub("beta ", "", factorlist) y.lab2 <- unique(y.lab)[item.subset] y.lab.id <- y.lab %in% y.lab2 y.lab <- y.lab[y.lab.id] factorlist <- factorlist[y.lab.id] } } # setting range of xaxis if(is.null(xlim)){ xlim <- range(unlist(confidences)) } # setting tickpositions tickpos <- 1:(length(y.lab)) # + 3.5/distance mm 2011-06-03 lty <- unlist(lapply(n2, function(i)1:i)) # defining the plot if(is.null(main)){ main<-paste("Confidence plot") } plot(xlim, xlim=xlim, ylim=c(1,length(factorlist))+c(-.5,+.5), type="n", yaxt="n", main=main, xlab=xlab,ylab=ylab,...) # rh 2011-03-23 reverse ylim added axis(2, at=tickpos, labels=y.lab, cex.axis=0.7, las=2) if(is.null(col)){ for(k in 1:length(confidences)) { for(l in 1:length(factorlist)) { lines(as.data.frame(confidences[[k]])[factorlist[l],], rep(seq(l-.5+distance, l+.5-distance, length.out=length(confidences))[k], 2), type="b", pch=20, col=length(cumsum(n2)[cumsum(n2) < k])+1, lty=lty[k]) } } } else { col <- rep(col, n2) for(k in 1:length(confidences)) { for(l in 1:length(factorlist)) { lines(as.data.frame(confidences[[k]])[factorlist[l],], rep(seq(l-.5+distance, l+.5-distance, length.out=length(confidences))[k], 2), type="b", pch=20, col=col[k], lty=lty[k]) } } } # doing nicer legend labels if(is.null(splitnames)==FALSE){ names(confidences) <- splitnames } if(leg == TRUE){ linespread <- .7 + .3 * (1/length(confidences)) if(is.null(col)){ #col <- rep(1:length(n2), each=n2) rh 2011-03-18 col <- rep(1:length(n2), n2) # legend(legpos, rev(paste(names(confidences))), col=rev(col), lty=rev(lty)) legend(legpos, rev(paste(names(confidences))), y.intersp=linespread, col=rev(col), lty=rev(lty)) } else { # legend(legpos, rev(paste(names(confidences))), col=rev(col), lty=rev(lty)) legend(legpos, rev(paste(names(confidences))), y.intersp=linespread, col=rev(col), lty=rev(lty)) } } invisible(list(confints=confidences1)) #rh 2011-03-18 } eRm/R/summary.threshold.r0000755000175100001440000000052014375241642015077 0ustar hornikuserssummary.threshold <- function(object,...) { #object of class "threshold" coef.table <- cbind(round(object$threshpar,5),round(object$se.thresh,5),round(confint(object),5)) dimnames(coef.table) <- list(names(object$threshpar),c("Estimate","Std. Err.",colnames(confint(object)))) cat("\n") print(coef.table) cat("\n") }eRm/R/summary.MLoef.r0000755000175100001440000000247014375241642014113 0ustar hornikuserssummary.MLoef <- function(object, ...) { # summary method for object of class "MLoef" (MLoef) # prepare message for split criteria if( length(object$splitcr) == 1){ if( (object$splitcr == "median") | (object$splitcr == "mean") ){ spl <- object$splitcr } } else { spl <- "user-defined" } # if(!is.null(object$warning)){ # if(object$splitcr == "median") cat("Warning: Item(s)",paste(names(object$warning),collapse=", "),"with raw score equal to the median assigned to the lower raw score group!\n") # if(object$splitcr == "mean") cat("Warning: Item(s)",paste(names(object$warning),collapse=", "),"with raw score equal to the mean assigned to the lower raw score group!\n") # } cat("\n") cat("Martin-Loef-Test (split criterion: ",spl,")\n",sep="") for(i in 1:length(object$i.groups)){ cat("\n") cat("Group ",i,":\nItems: ",sep="") cat(paste(object$i.groups[[i]]),sep=", ") cat("\nLog-Likelihood:",round(object$subModels[[i]]$loglik,3),"\n") } cat("\n") cat("Overall Rasch-Model:\n") cat("Log-Likelihood:",round(object$fullModel$loglik,3),"\n") cat("\n") cat(paste("LR-value:",round(object$LR,3),"\n")) cat(paste("Chi-square df:",round(object$df,3),"\n")) cat(paste("p-value:",round(object$p.value,3)),"\n") cat("\n") } eRm/R/plotjointICC.dRm.R0000755000175100001440000000412314375241642014434 0ustar hornikusersplotjointICC.dRm <- function( object, item.subset = "all", legend = TRUE, xlim = c(-4, 4), ylim = c(0, 1), xlab = "Latent Dimension", ylab = "Probability to Solve", lty = 1, legpos="topleft", main = "ICC plot", col = NULL, ... ){ # produces one common ICC plot for Rasch models only # object of class "dRm" # item.subset...specify items that have to be plotted; if NA, all items are used # legend...if legend should be plotted theta <- seq(xlim[1L], xlim[2L], length.out = 201L) if(any(item.subset=="all")){ it.legend <- 1:dim(object$X)[2] } else { if(is.character(item.subset)){ it.legend <- item.subset betatemp <- t(as.matrix(object$betapar)) colnames(betatemp) <- colnames(object$X) object$betapar <- betatemp[,item.subset] } else { it.legend <- colnames(object$X)[item.subset] object$betapar <- object$betapar[item.subset] } object$X <- object$X[,item.subset] #pick out items defined in itemvec } th.ord <- order(theta) p.list <- plist.internal(object, theta) p.list <- lapply(p.list, function(x){ x[,-1L] }) #Delete 0-probabilites p.mat <- matrix(unlist(p.list), ncol = length(p.list)) text.ylab <- p.mat[(1:length(theta))[theta==median(theta)],] if(is.null(main)) main="" if(is.null(col)) col <- rainbow_hcl(dim(p.mat)[2]) matplot(sort(theta),p.mat[th.ord,],type="l",lty=lty,col=col, main=main,xlim=xlim,ylim=ylim,xlab=xlab,ylab=ylab,...) if(length(object$betapar)>20) old_par <- par(cex=0.7) else old_par <- par(cex=1) on.exit(par(old_par)) if(is.character(legpos)){ if(!legend){ sq <- seq(0.65,0.35,length.out=length(object$betapar)) x <- qlogis(sq,sort(-object$betapar)) text(x=x,y=sq,labels=it.legend[order(-object$betapar)],col=col[order(-object$betapar)],...) } else { #legend(legpos,legend=paste("Item",it.legend[order(-object$betapar)]),lty=lty, col=col[order(-object$betapar)],...) legend(legpos,legend= colnames(object$X)[order(-object$betapar)],lty=lty, col=col[order(-object$betapar)],...) } } } eRm/R/print.pfit.R0000755000175100001440000000121714375241642013450 0ustar hornikusers`print.pfit` <- function(x, visible=TRUE, ...) # print method for personfit # x...object of class "pfit" from (personfit) { pvalues <- 1-pchisq(x$p.fit,x$p.df-1) # df correction rh 10-01-20 coef.table <- cbind(round(x$p.fit,3),x$p.df-1,round(pvalues,3),round(x$p.outfitMSQ,3),round(x$p.infitMSQ,3),round(x$p.outfitZ,2),round(x$p.infitZ,2)) colnames(coef.table) <- c("Chisq","df","p-value","Outfit MSQ", "Infit MSQ", "Outfit t", "Infit t" ) rownames(coef.table) <- names(x$p.fit) if (visible){ # added rh 10-01-20 cat("\nPersonfit Statistics: \n") print(coef.table) cat("\n") } invisible(coef.table) } eRm/R/Waldtest.R0000755000175100001440000000011114375241642013132 0ustar hornikusers`Waldtest` <- function(object,splitcr="median")UseMethod("Waldtest") eRm/R/likLR.R0000755000175100001440000000333514375241642012373 0ustar hornikuserslikLR <- function(X, W, mpoints, Groups, model, st.err, sum0, etaStart){ if (any(is.na(X))) { dichX <- ifelse(is.na(X),1,0) strdata <- apply(dichX,1,function(x) {paste(x,collapse="")}) gmemb <- as.vector(data.matrix(data.frame(strdata))) } else { gmemb <- rep(1,dim(X)[1]) } #data preparation, design matrix generation for various models if (model=="RM") { Xprep <- datprep_RM(X,W,sum0) } else if (model=="LLTM") { Xprep <- datprep_LLTM(X,W,mpoints,Groups,sum0) } else if (model=="RSM") { Xprep <- datprep_RSM(X,W,sum0) } else if (model=="PCM") { Xprep <- datprep_PCM(X,W,sum0) } else if (model=="LRSM") { Xprep <- datprep_LRSM(X,W,mpoints,Groups,sum0) } else if (model=="LPCM") {Xprep <- datprep_LPCM(X,W,mpoints,Groups,sum0) } if (any(is.na(etaStart))) etaStart <- rep(0,dim(Xprep$W)[2]) #check starting vector if (length(etaStart) != dim(Xprep$W)[2]) stop("Vector with starting values does not match number of parameters!") ng <- max(Groups) if ((dim(Xprep$W)[1]) != ((dim(Xprep$X01)[2])*ng)) stop("Mismatch between number of rows (beta's) in W and number of items (categories) in X!") Lprep <- cmlprep(Xprep$X01,Xprep$mt_vek,mpoints,Groups,Xprep$W,gmemb) parest <- fitcml(Lprep$mt_ind,Lprep$nrlist,Lprep$x_mt,Lprep$rtot,Xprep$W, max(Groups),gind=Lprep$gind,x_mtlist=Lprep$x_mtlist, Lprep$NAstruc,g_NA=Lprep$g_NA,st.err,etaStart,gby=Lprep$gby) W1 <- Xprep$W #rownames(W1) <- NULL #colnames(W1) <- paste("eta",1:dim(W1)[2],sep="") return(list("W" = W1, "parest" = parest, "X01" = Xprep$X01)) #returns design matrix and results } eRm/R/collapse_W.R0000755000175100001440000000061214375241642013441 0ustar hornikuserscollapse_W <- function(W,listItems,newNames) { if(missing(newNames)) newNames <- paste("collapsedEffect",1:length(listItems),sep="") Wtmp1 <- W[,-unlist(listItems)] collapsed <- lapply(listItems, function(x) rowSums(W[,x])) Wtmp2 <- matrix(unlist(collapsed),ncol=length(collapsed)) Wout <- cbind(Wtmp1,Wtmp2) colnames(Wout) <- c(colnames(Wtmp1),newNames) Wout } eRm/R/LLRA.R0000755000175100001440000000136014375241642012104 0ustar hornikusersLLRA <- function(X, W, mpoints, groups, baseline=NULL, itmgrps=NULL,...) { if(missing(mpoints)) stop("Please specify the number of time points. If there are none, you might want to try PCM() or LPCM().") Xprep <- llra.datprep(X,mpoints,groups,baseline) itmgrps <- rep(1:Xprep$nitems) groupvec <- Xprep$assign.vec pplgrps <- length(Xprep$grp_n) if(missing(W)) W <- build_W(Xprep$X,length(unique(itmgrps)),mpoints,Xprep$grp_n,groupvec,itmgrps) fit <- LPCM(Xprep$X,W,mpoints=mpoints,groupvec=groupvec,sum0=FALSE) refg <- unique(names(which(groupvec==max(groupvec)))) out <- c(fit,"itms"=Xprep$nitems,"refGroup"=refg) out$call <- match.call() class(out) <- c("llra","Rm","eRm") cat("Reference group: ",refg,"\n\n") return(out) } eRm/R/person.parameter.R0000755000175100001440000000010114375241642014627 0ustar hornikusersperson.parameter <- function(object)UseMethod("person.parameter")eRm/R/LRtest.R0000755000175100001440000000012114375241642012561 0ustar hornikusers`LRtest` <- function(object, splitcr = "median", se = TRUE) UseMethod("LRtest") eRm/R/datprep_RM.R0000755000175100001440000000177014375241642013414 0ustar hornikusers`datprep_RM` <- function(X,W,sum0) #prepares data matrix for Rasch model { X01 <- X #X is already X(0,1) mt_vek <- rep(1,dim(X01)[2]) #number of categories for each item K <- length(mt_vek) #automatized generation of the design matrix W if (length(W)==1) { W1 <- diag(1,(K-1)) #build up design matrix if (sum0) { w1 <- rep(-1,(K-1)) #sum0 restriction } else { w1 <- rep(0,(K-1)) #first item parameter set to 0 } W <- rbind(w1,W1) #RM design matrix colnames(W) <- NULL rownames(W) <- NULL } list(X=X,X01=X01,mt_vek=mt_vek,W=W) #Output: X01 ... 0/1 response matrix of dimension N*rtot # mt_vek ... 1-vector of length K # W ... design matrix of dimension K*K } eRm/R/plotINFO.R0000755000175100001440000000376014473203752013011 0ustar hornikusersplotINFO <- function(ermobject, type = "both", theta = seq(-6, 6, length.out = 1001L), legpos = "topright", ...){ ddd <- list(...) get_dots <- function(element, default){ ifelse(!is.null(ddd[[element]]), ddd[[element]], default) } extraVars <- c("mainI", "mainT", "ylabI", "ylabT", "xlab", "legpos") if(any(!(names(ddd) %in% extraVars))){ warning("additional argument(s) ignored.") } type <- match.arg(type, c("item", "test", "scale","both", "category")) if(type == "both"){ old_pars <- par(mfrow=c(2L, 1L), no.readonly = TRUE) on.exit(par(old_pars)) } if(type %in% c("category")){ iinfo <- item_info(ermobject, theta) info <- lapply(iinfo, function(x) x$c.info) par(ask = TRUE) lapply(info,function(infos) { catnames <-paste("C",0:(ncol(infos)-1)) matplot(x=theta,y=infos,type="l",main = get_dots("mainI", "Item-Category Information"), xlab = get_dots("xlab", "Latent Trait"), ylab = get_dots("ylabI", "Information")) if(is.character(legpos)) legend(legpos, legend = catnames, pch = NULL, lty = 1:5, col = 1:6) } ) par(ask=FALSE) } if(type %in% c("item", "both")){ iinfo <- item_info(ermobject, theta) info <- lapply(iinfo, function(x) x$i.info) pltinfo <- matrix(unlist(info), ncol = ncol(ermobject$X)) matplot(x = theta, y = pltinfo, type = "l", main = get_dots("mainI", "Item Information"), xlab = get_dots("xlab", "Latent Trait"), ylab = get_dots("ylabI", "Information")) itmnames <- colnames(ermobject$X) if (is.null(itmnames)) itmnames <- paste("Item", 1:ncol(ermobject$X)) if(is.character(legpos)) legend(legpos, legend = itmnames, pch = NULL, lty = 1:5, col = 1:6) } if(type %in% c("test", "scale", "both")){ tinfo <- test_info(ermobject, theta) plot(x = theta, y = tinfo, type = "l", main = get_dots("mainT", "Scale Information"), xlab = get_dots("xlab", "Latent Trait"), ylab = get_dots("ylabT", "Scale Information")) } } eRm/R/print.llra.R0000755000175100001440000000033514375241642013440 0ustar hornikusersprint.llra <- function(x,...) { cat("Call:\n") print(x$call) cat("\n") cat("\nParameters:\n") outmat <- rbind(x$etapar,x$se.eta) rownames(outmat) <- c("Estimate","Std.Err") print(outmat) } eRm/R/labeling.internal.r0000755000175100001440000001146414375241642015010 0ustar hornikuserslabeling.internal <- function(model,X,X01,W,etapar,betapar,mpoints,ngroups) { #labeling for W, eta, beta. if (is.null(colnames(W))) { #eta labels names(etapar) <- paste("eta",1:dim(W)[2]) colnames(W) <- names(etapar) } else { names(etapar) <- colnames(W) } if(model=="RM"){ # new labelling of if (!is.null(colnames(X))) # eta parameters for names(etapar) <- colnames(X)[2:ncol(X)] # RM, RSM, PCM else # rh, 25-03-2010 names(etapar) <- paste("I",2:ncol(X),sep="") # } # gives estimated # item (RM) if(model=="RSM"){ # item + category (RSM) if (!is.null(colnames(X))) { # item x category (PCM) names(etapar)[1:(ncol(X)-1)] <- colnames(X)[2:ncol(X)] # parameters } else { # names(etapar[1:(ncol(X)-1)]) <- paste("I",2:ncol(X),sep="") # } # maxcat <- max(X,na.rm=TRUE) # if (maxcat>1) # names(etapar)[ncol(X):length(etapar)] <- paste("Cat ",2:maxcat,sep="") # } # # # if(model=="PCM"){ # indmt <- apply(X,2,max,na.rm=TRUE) # number of categories # catnames <- sequence(indmt) # # if (!is.null(colnames(X))) { # itnames <- colnames(X) # } else { # itnames <- paste("I",1:ncol(X),sep="") # } # etanames <- rep(itnames, indmt) # etanames <- paste(etanames[-1],catnames[-1],sep=".c") # names(etapar) <- etanames # } # if (mpoints == 1) { #no mpoints labels if ((model=="RM") || (model=="LLTM")) { #no category labels betanames <- paste("beta",colnames(X)) } else { indmt <- apply(X,2,max,na.rm=TRUE) catnames <- sequence(indmt) itnames <- rep(colnames(X),indmt) betanames <- paste("beta",paste(itnames,catnames,sep=".c")) } } else { #repeated measurement models indmt0 <- apply(X,2,max,na.rm=TRUE) indmt <- rep(apply(X,2,max,na.rm=TRUE),ngroups) catnames <- sequence(indmt) #category names if (substr(colnames(X)[1],1,2)=="I1") { #if item names specified by user itemind <- rep(paste("I",1:(dim(X)[2]/mpoints),sep=""),mpoints) #item labels } else { itemind <- colnames(X) } itnames <- rep(itemind,indmt0) if (ngroups > 1) { ind.it <- rep(1:mpoints,each = length(itnames)/mpoints) #item label index itnames <- as.vector(unlist(tapply(itnames, ind.it, function(x) rep(x, ngroups)))) } if (model == "LLTM") { icnames <- rep(itnames,(dim(W)[1]/length(itnames))) } else { icnames <- paste(itnames,catnames,sep=".c") } t.lab <- paste("t",rep(1:mpoints,each=length(icnames)/mpoints),sep="") #time labels if (ngroups > 1) { g.lab <- rep(paste("g",rep(1:ngroups,each=length(icnames)/mpoints/ngroups),sep=""),mpoints) betanames <- paste(icnames,t.lab,g.lab) } else { betanames <- paste(icnames,t.lab) } } if (is.null(rownames(W))) { #no labels provided rownames(W) <- betanames names(betapar) <- betanames } else { names(betapar) <- rownames(W) } list(W=W,etapar=etapar,betapar=betapar) } eRm/R/print.resid.R0000755000175100001440000000077314375241642013622 0ustar hornikusers`print.resid` <- function(x,...) # print method for object of class "resid" (from residuals.ppar) { cat("\nStandardized Residuals \n") for (i in 1:length(x$st.res)) { if (length(x$st.res) > 1) {cat("Person NA Group:",i,"\n")} print(x$st.res[[i]]) cat("\n") } cat("\nSquared Standardized Residuals \n") for (i in 1:length(x$sq.res)) { if (length(x$sq.res) > 1) {cat("Person NA Group:",i,"\n")} print(x$sq.res[[i]]) cat("\n") } } eRm/R/datprep_RSM.R0000755000175100001440000000632114375241642013534 0ustar hornikusers`datprep_RSM` <- function(X,W,sum0) { #... X: data matrix with response categories to be converted into 0/1 matrix max.it <- apply(X,2,max,na.rm=TRUE) #RSM check for equal number of categories if (length(table(max.it)) > 1) stop("RSM can not be computed since number of categories are not the same for each item!\n") N <- dim(X)[1] #number of persons K <- dim(X)[2] #number of items hmax <- max(X,na.rm=TRUE) #highest category mt_vek <- rep(hmax,K) #vector with number of categories - 1 for each item mt_vek_0 <- mt_vek+1 #number of categories for each item X01_0 <- matrix(rep(0,(N*sum(mt_vek_0))),nrow=N) #empty 0/1 matrix K <- length(mt_vek) cummt0 <- c(0,cumsum(mt_vek_0)[1:(K-1)])+1 #index vector for 0th category indmatp <- apply(X,1,function(xi) {xi+cummt0}) #preparing index matrix for 1 responses imp1 <- as.vector(indmatp) imp2 <- rep(1:N,rep(K,N)) indmat <- cbind(imp2,imp1) #final index matrix for 1 responses X01_0[indmat] <- 1 #0/1 matrix with 0th category NAindmat <- rbind(imp2,rep(1:K,N),c(t(X))) #impose NA structure rownames(NAindmat) <- NULL NAind <- t(NAindmat[1:2,is.na(NAindmat[3,])]) #index matrix for NA's in X if (length(NAind) > 0) { NAindlist <- apply(NAind,1,function(x){ co <- seq(cummt0[x[2]],cummt0[x[2]]+mt_vek[x[2]]) NAind01 <- cbind(rep(x[1],length(co)),co) data.frame(NAind01,row.names=NULL) #list with NA indices }) indmatNA <- matrix(unlist(lapply(NAindlist, function(x) {t(as.matrix(x))})),ncol=2,byrow=TRUE) #matrix with NA indices X01_0[indmatNA] <- NA } X01 <- X01_0[,-cummt0] #delete 0-category answers --> final 0/1 pattern matrix (dim N*sum(mt_vek)) #automatized generation of the design matrix W if (length(W)==1) { e_it <- gl(K,hmax) #factor for item parameters e_cat <- gl(hmax,1,K*hmax) #factor for category par if (sum0) { Xm <- model.matrix(~e_it+e_cat)[,-1] #dummy coding Xm[1:hmax,1:(K-1)] <- -1 #first item to be sum0 normalized } else { Xm <- model.matrix(~e_it+e_cat)[,-1] #design matrix with 0/1 contrasts (without intercept) } catvek <- 1:hmax #preparing the item design vectors e_itnew <- catvek*Xm[,1:(K-1)] Xm[,1:(K-1)] <- e_itnew W <- Xm #final design matrix colnames(W) <- NULL rownames(W) <- NULL } list(X=X,X01=X01,mt_vek=mt_vek,W=W) #Output: X01 ... 0/1 response matrix of dimension N*rtot # mt_vek ... vector of length K with number of categories - 1 (for each item) # W ... design matrix of dimension sum(mt_vek)*((K-1)+(hmax-1)) } eRm/R/MLoef.R0000755000175100001440000001357414375241642012366 0ustar hornikusersMLoef <- function(robj, splitcr="median") { # performs the Martin-Loef LR-test # robj... object of class RM # splitcr... splitting criterion for two groups. "median" (default) and "mean" # split items in two groups according to the median/mean or item raw # scores. # a vector of length k (number of items) containing two different # elements signifying group membership of items can be supplied. ### no test with missing values rh 19-05-10 if(any(is.na(robj$X))) stop("Martin-Loef Test with NA currently not available\n") wrning <- NULL # initialize an object for warnings if(length(splitcr) == 1){ # generate split-vector if "mean" or "median" if(splitcr == "median"){ raw.scores <- colSums(robj$X,na.rm=T) numsplit <- as.numeric(raw.scores > median(raw.scores,na.rm=T)) ## removed for the time being 2011-09-08 rh #if( any(raw.scores == median(raw.scores,na.rm=T)) ){ # Only if one item's raw score == the median, a warning is issued # wrning <- which(raw.scores == median(raw.scores,na.rm=T)) # append a warning-slot to the object for print and summary methods # cat("Item(s)",paste(names(wrning),collapse=", "),"with raw score equal to the median assigned to the lower raw score group!\n") #} } if(splitcr=="mean"){ raw.scores <- colSums(robj$X,na.rm=T) numsplit <- as.numeric(raw.scores > mean(raw.scores,na.rm=T)) ## removed for the time being 2011-09-08 rh #if( any(raw.scores == mean(raw.scores,na.rm=T)) ){ # Only if one item's raw score == the mean, a warning is issued # wrning <- which(raw.scores == mean(raw.scores,na.rm=T)) # append a warning-slot to the object for print and summary methods # cat("Item(s)",paste(names(wrning),collapse=", "),"with raw score equal to the mean assigned to the lower raw score group!\n") #} } } else { # check if the submitted split-vector is appropriate if(length(splitcr) != ncol(robj$X)) stop("Split vector too long/short.") # if(length(unique(splitcr)) > 2) stop("Only two groups allowed.") if(length(unique(splitcr)) < 2) stop("Split vector must contain at least two groups.") numsplit <- splitcr } sp.groups <- unique(numsplit) i.groups <- sapply(sp.groups, function(g){ which(numsplit == g) }, simplify=F) # check if any group countains less than 2 items if( any(unlist(lapply(i.groups, length)) < 2) ){ stop("Each group of items must contain at least 2 items.") } # check if one group contains subject with <=1 valid responses if(any(unlist(lapply(i.groups, function(g){ any(rowSums(!is.na(robj$X[,g])) <= 1) })))) stop("Groups contain subjects with less than two valid responses.") ### possible missing patterns and classification of persons into groups # MV.X <- apply(matrix(as.numeric(is.na(robj$X01)),ncol=ncol(robj$X01)),1,paste,collapse="") # MV.p <- sort(unique(MV.X)) # MV.g <- numeric(length=length(MV.X)) # g <- 1 # for(i in MV.p){ # MV.g[MV.X == i] <- g; # g <- g + 1 # } # na.X01 <- list() # for(i in 1:length(MV.p)){ # na.X01[[i]] <- matrix(robj$X01[which(MV.g == i),], ncol=ncol(robj$X01)) # } # res1 <- RM(robj$X01[,i.groups[[1]]]) # res2 <- RM(robj$X01[,i.groups[[2]]]) # fitting the submodels subModels <- lapply(i.groups, function(g){ PCM(robj$X[,g]) }) ### calculating the numerator and denominator sub.tabs <- as.data.frame(sapply(subModels, function(M){ rowSums(M$X, na.rm=T) })) sub.tabs <- table(sub.tabs) sub.term <- sub.tabs * (log(sub.tabs) - log(nrow(robj$X))) sub.term <- sum(na.omit(as.numeric(sub.term))) sub.max <- lapply(i.groups, function(g){ sum(apply(robj$X[,g], 2, max)) }) full.tab <- table(rowSums(robj$X, na.rm=T)) full.term <- sum(na.omit(as.numeric( full.tab * (log(full.tab) - log(nrow(robj$X))) ))) ML.LR <- 2 * ( sub.term + sum(unlist(lapply(subModels, `[[`, "loglik"))) - full.term - robj$loglik ) df <- prod(unlist(sub.max)+1) - (sum(apply(robj$X, 2, max))+1) - length(sp.groups) + 1 # ml.num <- ml.den <- df <- numeric() # for(i in 1:length(MV.p)){ # .temp.num <- table(rowSums(na.X01[[i]],na.rm=T)) # .temp.num <- .temp.num[.temp.num > 0] ### rh # ml.num[i] <- sum( (log(.temp.num)-log(sum(.temp.num)))*.temp.num ) # # if(nrow(na.X01[[i]]) > 1){ # .temp.den <- table(rowSums(na.X01[[i]][,i.groups[[1]]],na.rm=T), # rowSums(na.X01[[i]][,i.groups[[2]]],na.rm=T)) # } # else{ # .temp.den <- table(sum(na.X01[[i]][,i.groups[[1]]],na.rm=T), # sum(na.X01[[i]][,i.groups[[2]]],na.rm=T)) # } # .temp.den <- .temp.den[.temp.den > 0] ### rh # ml.den[i] <- sum( (log(.temp.den)-log(sum(.temp.den)))*.temp.den ) # # k1 <- sum(!is.na(na.X01[[i]][1,i.groups[[1]]])) ### rh # k2 <- sum(!is.na(na.X01[[i]][1,i.groups[[2]]])) ### rh # df[i] <- k1 * k2 -1 ### rh # } # # a <- sum(ml.num) # b <- sum(ml.den) # k <- c(length(i.groups[[1]]),length(i.groups[[2]])) # # ML.LR <- -2*( (a + robj$loglik) - (b + res1$loglik + res2$loglik) ) # DF <- prod(k) - 1 p.value <- 1 - pchisq(ML.LR, df) result <- list(LR=ML.LR, df=df, p.value=p.value, fullModel=robj, subModels=subModels, Lf=robj$loglik, Ls=lapply(subModels, `[[`, "loglik"), # theta.table.RM=table(rowSums(robj$X01)), # both used for the plotting # theta.table.MLoef=table(rowSums(res1$X01),rowSums(res2$X01)), # routine plot.MLoef i.groups=i.groups, # items1=i.groups[[1]], items2=i.groups[[2]], k=k, splitcr=splitcr, split.vector=numsplit, warning=wrning, call=match.call()) class(result) <- "MLoef" return(result) } eRm/R/cldeviance.R0000755000175100001440000000526614375241642013460 0ustar hornikuserscldeviance <- function(object, groups.gr = "rawscore", pi.hat) { # computes the collapsed deviance of # object of class ppar k <- dim(object$X)[2] #number of items N <- dim(object$X)[1] #number of persons (full) #----------- define group vector --------------- if (groups.gr == "rawscore") indvec.full <- rowSums(object$X, na.rm = TRUE) #person raw scores #if (groups.gr == "pattern") { #pattern-wise # X.string <- apply(object$X, 1, paste, collapse = "") # indvec.full <- rank(X.string, ties.method = "min") #} if (is.numeric(groups.gr)) { if (length(groups.gr) != dim(object$X)[1]) stop("Group vector must be of length N (number of subjects in object$X)!") indvec.full <- groups.gr } #---------- end define group vector ----------- #---- reduce group vector (pers.ex)------ if (length(object$pers.ex) > 0) { #persons eliminated y <- object$X[-object$pers.ex,] #observed values indvec.red <- indvec.full[-object$pers.ex] } else { y <- (object$X) indvec.red <- indvec.full } #pi.hat <- pmat(object) #gmemb.ext <- rep(object$gmemb, each = k) #gmemb extended to response vector #pi.hat <- as.vector(t(pmat(object))) #fitted values dev.g <- tapply(1:length(indvec.red), indvec.red, function(ii) { #D component for each group n.g <- length(ii) #number of group subjects y.g <- colSums(rbind(y[ii,])) #group responses pi.g <- rbind(pi.hat[ii,])[1,] #vector with fitted values devvec <- mapply(function(yy, pp) { #compute deviance for each item if ((yy > 0) && (yy < n.g)) { term1 <- yy*log(yy/(n.g*pp)) term2 <- (n.g-yy)*log((n.g-yy)/(n.g*(1-pp))) dev <- sign(yy-n.g*pp)*sqrt(2*(term1+term2)) } if (yy == 0) dev <- -sqrt(2*n.g*abs(log(1-pp))) if (yy == n.g) dev <- sqrt(2*n.g*abs(log(pp))) return(dev) },y.g, pi.g) return(sum(devvec^2)) #item-wise sum of squared devres }) value <- sum(dev.g) df <- (length(unique(indvec.red)))*k p.value <- 1-pchisq(value, df = df) result <- list(value = value, df = df, p.value = p.value) return(result) } eRm/R/coef.ppar.R0000755000175100001440000000031214375241642013223 0ustar hornikusers`coef.ppar` <- function(object, extrapolated = TRUE, ...) { x <- object$theta.table[,1] if(!extrapolated) x[object$theta.table[,3]] <- NA names(x) <- rownames(object$theta.table) x } eRm/R/hoslem.R0000755000175100001440000000216014375241642012640 0ustar hornikusershoslem <- function(object, groups.hl = 10, pi.hat) { # computes the Hosmer-Lemeshow test for objects of class "ppar" # groups.hl ... number of groups for percentile splitting K <- dim(object$X)[2] N <- dim(object$X.ex)[1] #Pi <- pmat(object) #expected values if (length(object$pers.ex) > 0) { y <- as.vector(t(object$X[-object$pers.ex,])) #observed values } else { y <- as.vector(t(object$X)) } pi.hat <- as.vector(t(pi.hat)) cutpoints <- quantile(pi.hat, probs = seq(0, 1, 1/groups.hl)) #perzentiles groupvec <- cut(pi.hat, cutpoints, include.lowest = TRUE, labels = 1:groups.hl) #recode ph.hat o.g <- tapply(y, groupvec, sum) #number of 1-responses in group n.g <- table(groupvec) #number of responses in group pi.mean <- tapply(pi.hat, groupvec, mean) #average response probabilites value <- sum((o.g - n.g*pi.mean)^2/(n.g *pi.mean*(1-pi.mean))) #HM-test statistic df <- groups.hl - 2 p.value <- 1 - pchisq(value, df) result <- list(value = value, df = df, p.value = p.value) result } eRm/R/plotPWmap.R0000755000175100001440000002516414473216524013305 0ustar hornikusers`plotPWmap` <- function(object, pmap=FALSE, imap=TRUE, item.subset="all", person.subset="all", mainitem="Item Map", mainperson="Person Map", mainboth="Item/Person Map", latdim="Latent Dimension", tlab="Infit t statistic", pp=NULL, cex.gen=0.6, cex.pch=1, person.pch=1, item.pch=16, personCI=NULL, itemCI=NULL, horiz=FALSE) { #mjm def.par <- par(no.readonly = TRUE) ## save default, for resetting... ## Pathway map currently only for RM, PCM and RSM ## The next part of the code finds locations and standard errors for ## the item thresholds if ((object$model == "LLTM") || (object$model == "LRSM") || (object$model == "LPCM")) stop("Pathway Map can only be computed for RM, RSM, and PCM!") if (!pmap && !imap) stop("Pathway Map requires you to request at least one map (item or person)!") ## compute threshtable (from betapars for dichotomous models) and item names if (object$model == "RM" || max(object$X, na.rm=TRUE) < 2 ) { # dichotomous model dRm <- TRUE ## betapars are easiness parameters; only the pars need negating threshtable<-cbind(object$betapar * -1, object$se.beta) rownames(threshtable) <- colnames(object$X) ## shorter synonym tt<-threshtable } else { ## polytomous model dRm <- FALSE thresh <- thresholds(object) threshtable <- cbind(thresh$threshpar, thresh$se.thresh) tlevels<-apply(thresh$threshtable[[1]], 1, function(x) length(na.exclude(x))) - 1 if (!(sum(tlevels)==nrow(threshtable))) stop("Threshtable rows not equal to number of thresholds - oops!") ttl<-NULL ## threshtable labels for (i in rownames(as.matrix(tlevels))) if (tlevels[i]==1) ttl<-c(ttl,i) else ttl<-c(ttl,paste(i,1:tlevels[i],sep=":")) rownames(threshtable)<-ttl ## shorter synonyms tt<-threshtable tl<-tlevels } if(is.null(pp)){ suppressWarnings(pp<-person.parameter(object)) } else if((!("ppar" %in% class(pp))) || !identical(pp$X,object$X)){ stop("pp is not a person.parameter object which matches the main Rasch data object!") } ## We will be plotting the infit data versus the parameters for ## both items and persons # item fit iloc <- tt[, 1L] ise <- tt[, 2L] ifit <- itemfit(pp) ifitZ <- ifit$i.infitZ # person fit pfit <- personfit(pp) pfitZ <- pfit$p.infitZ if(length(pfit$excl_obs_num) > 0L){ # mjm 2014-09-17 temp_namevec <- pfit$excl_obs_chr # for(ex_pers in pfit$excl_obs_num){ # workaround: add deleted persons and their names pfitZ <- append(pfitZ, NA, ex_pers - 1L) # names(pfitZ)[ex_pers] <- temp_namevec[ex_pers] # } # rm(temp_namevec) # } # ploc <- as.matrix(pp$theta.table['Person Parameter'])[,1] if(length(pfit$excl_obs_num) > 0L){ # mjm 2014-09-17 ploc[pfit$excl_obs_num] <- NA # set all parameters of excluded obs NA } # pse <- unlist(pp$se.theta, recursive=FALSE) names(pse) <- sub("^NAgroup[0-9]*\\.","",names(pse)) pse <- pse[names(ploc)] ## We can now do item and person subsetting; the item subsetting is ## pretty ugly as there are multiple cases. (We dare not do it earlier ## as we have to take items from all of iloc, ise and ifitZ.) if (imap && is.character(item.subset)) { ## Case 1: item subsetting by item names if (dRm) { if (length(item.subset)>1 && all(item.subset %in% rownames(tt))) { iloc <- iloc[item.subset] ise <- ise[item.subset] ifitZ <- ifitZ[item.subset] tt <- tt[item.subset,] } else if(length(item.subset)!=1 || !(item.subset=="all")) stop("item.subset misspecified. Use 'all' or vector of at least two valid item indices/names.") } else { if (length(item.subset)>1 && all(item.subset %in% rownames(as.matrix(tl)))) { tl <- tl[item.subset] keep.subset <- c() for (i in rownames(as.matrix(tl))) if (tl[i]==1) keep.subset<-c(keep.subset,i) else keep.subset<-c(keep.subset,paste(i,1:tl[i],sep=":")) iloc <- iloc[keep.subset] ise <- ise[keep.subset] ifitZ <- ifitZ[item.subset] tt<-tt[keep.subset,] } else if(length(item.subset)!=1 || !(item.subset=="all")) stop("item.subset misspecified. Use 'all' or vector of at least two valid item indices/names.") } } else if (imap) { ## Case 2: item subsetting by item numbers if (dRm) { if (length(item.subset)>1 && all(item.subset %in% 1:nrow(tt))) { iloc <- iloc[item.subset] ise <- ise[item.subset] ifitZ <- ifitZ[item.subset] tt <- tt[item.subset,] } else stop("item.subset misspecified. Use 'all' or vector of at least two valid item indices/names.") } else { if (length(item.subset)>1 && all(item.subset %in% 1:length(tl))) { tl <- tl[item.subset] keep.subset <- c() for (i in rownames(as.matrix(tl))) if (tl[i]==1) keep.subset<-c(keep.subset,i) else keep.subset<-c(keep.subset,paste(i,1:tl[i],sep=":")) iloc <- iloc[keep.subset] ise <- ise[keep.subset] ifitZ <- ifitZ[item.subset] tt<-tt[keep.subset,] } else stop("item.subset misspecified. Use 'all' or vector of at least two valid item indices/names.") } } ## We can now do person subsetting; this is significantly easier than ## item subsetting, as there is no dRM/eRm distinction. if (pmap && is.character(person.subset)) { ## Case 1: person subsetting by person names if (length(person.subset)>1 && all(person.subset %in% names(ploc))) { ploc <- ploc[person.subset] pse <- pse[person.subset] pfitZ <- pfitZ[person.subset] } else if(length(person.subset)!=1 || !(person.subset=="all")) stop("person.subset misspecified. Use 'all' or vector of at least two valid person indices/names.") } else if (pmap) { ## Case 2: person subsetting by person numbers if (length(person.subset)>1 && all(person.subset %in% seq_along(ploc))) { ploc <- ploc[person.subset] pse <- pse[person.subset] pfitZ <- pfitZ[person.subset] } else stop("person.subset misspecified. Use 'all' or vector of at least two valid person indices/names.") } ## Confidence intervals for persons and items ## ## Need defaults for multiple of standard error for purpose of range ## calculation; these are zero as default is not to draw confidence ## intervals pci <- 0 ici <- 0 ## Our calculation is simplistic; we use the normal distribution to ## estimate our confidence interval from our standard error. However, ## since this is likely to only be approximate and indicative anyway, we ## are not concerned by this. if(pmap && !is.null(personCI)) { if(is.null(personCI$clevel)) personCI$clevel <- 0.95 if(is.null(personCI$col)) personCI$col <- "orange" if(is.null(personCI$lty)) personCI$lty <- "dotted" pci <- qnorm((1-personCI$clevel)/2, lower.tail=FALSE) } if(imap && !is.null(itemCI)) { if(is.null(itemCI$clevel)) itemCI$clevel <- 0.95 if(is.null(itemCI$col)) itemCI$col <- "red" if(is.null(itemCI$lty)) itemCI$lty <- "dotted" ici <- qnorm((1-itemCI$clevel)/2, lower.tail=FALSE) } ## Now we can plot the Pathway Map if (pmap) { ## person map xrange.pmap <- range(pfitZ,finite=TRUE) xrange.pmap[1] <- min(-2.5,xrange.pmap[1]) xrange.pmap[2] <- max(2.5,xrange.pmap[2]+1) ## need space for labels yrange.pmap<-range(ploc,finite=TRUE) yrange.pmap[1]<-yrange.pmap[1]-pci*max(pse, na.rm=TRUE) yrange.pmap[2]<-yrange.pmap[2]+pci*max(pse, na.rm=TRUE) } if (imap) { ## item map xrange.imap <- range(ifitZ,finite=TRUE) xrange.imap[1] <- min(-2.5,xrange.imap[1]) xrange.imap[2] <- max(2.5,xrange.imap[2]+1) ## need space for labels yrange.imap<-range(iloc,finite=TRUE) yrange.imap[1]<-yrange.imap[1]-ici*max(ise, na.rm=TRUE) yrange.imap[2]<-yrange.imap[2]+ici*max(ise, na.rm=TRUE) } if (pmap && !imap) { xrange <- xrange.pmap yrange <- yrange.pmap maintitle <- mainperson } else if (!pmap && imap) { xrange <- xrange.imap yrange <- yrange.imap maintitle <- mainitem } else if(pmap && imap){ xrange <- numeric(2) yrange <- numeric(2) xrange[1] <- min(xrange.pmap[1], xrange.imap[1], na.rm = TRUE) xrange[2] <- max(xrange.pmap[2], xrange.imap[2], na.rm = TRUE) yrange[1] <- min(yrange.pmap[1], yrange.imap[1], na.rm = TRUE) yrange[2] <- max(yrange.pmap[2], yrange.imap[2], na.rm = TRUE) maintitle <- mainboth } else { stop("error determining plot ranges.") } #mjm par(mar=c(5,4,4,2)) if (!horiz){ # rh 2010-12-09 plot(xrange, yrange, xlim = xrange, ylim = yrange, main = maintitle, ylab = latdim, xlab = tlab, type = "n") abline(v = c(-2, 2), col = "lightgreen") } else { plot(yrange, xrange, xlim = yrange, ylim = xrange, main = maintitle, ylab = tlab, xlab = latdim, type = "n") abline(h = c(-2, 2), col = "lightgreen") } if (pmap) { ## person map zt <- pfitZ if (!horiz){ if (pci>0) ## draw confidence intervals arrows(zt,ploc+pci*pse, zt,ploc-pci*pse, angle=90, code=3, length=0.04, col=personCI$col, lty=personCI$lty) points(zt,ploc,pch=person.pch,cex=cex.pch) text(zt,ploc,names(ploc),cex=cex.gen,pos=4) } else { if (pci>0) ## draw confidence intervals arrows(ploc+pci*pse, zt,ploc-pci*pse, zt, angle=90, code=3, length=0.04, col=personCI$col, lty=personCI$lty) points(ploc, zt, pch=person.pch,cex=cex.pch) text(ploc, zt, names(ploc),cex=cex.gen,pos=4) } } if (imap) { ## item map if (dRm) zt <- ifitZ else zt <- rep(ifitZ,times=tl) if (!horiz){ if (ici>0) ## draw confidence intervals arrows(zt,iloc+ici*ise, zt,iloc-ici*ise, angle=90, code=3, length=0.04, col=itemCI$col, lty=itemCI$lty) points(zt,iloc,pch=item.pch,cex=cex.pch) text(zt,iloc,rownames(tt),cex=cex.gen,pos=4) } else { if (ici>0) ## draw confidence intervals arrows(iloc+ici*ise, zt,iloc-ici*ise,zt, angle=90, code=3, length=0.04, col=itemCI$col, lty=itemCI$lty) points(iloc, zt,pch=item.pch,cex=cex.pch) text(iloc,zt, rownames(tt),cex=cex.gen,pos=4) } } #mjm par(def.par) invisible(NULL) } eRm/R/pmat.R0000755000175100001440000000006014375241642012307 0ustar hornikusers`pmat` <- function(object)UseMethod("pmat") eRm/R/performance_plots.R0000755000175100001440000006030014375241642015073 0ustar hornikusers## ---------------------------------------------------------------------------- ## plot method for objects of class 'performance' ## ---------------------------------------------------------------------------- .get.arglist <- function( fname, arglist ) { if (fname=='plot') return(.select.args(arglist, union(names(formals(plot.default)), names(par())))) else if (fname=='plot.xy') return(.select.args(arglist, union( names(formals(plot.xy)), names(par())))) else return( .select.prefix( arglist, fname) ) } .downsample <- function( perf, downsampling ) { for (i in 1:length(perf@alpha.values)) { if (downsampling < 1 && downsampling > 0) ind <- round(seq(1, length(perf@alpha.values[[i]]), length=(length(perf@alpha.values[[i]]) * downsampling))) else if (downsampling > 1) ind <- round(seq(1, length(perf@alpha.values[[i]]), length=downsampling)) else ind <- 1:length(perf@alpha.values[[i]]) perf@alpha.values[[i]] <- perf@alpha.values[[i]][ind] perf@x.values[[i]] <- perf@x.values[[i]][ind] perf@y.values[[i]] <- perf@y.values[[i]][ind] } return(perf) } .plot.performance <- function(perf, ..., avg="none", spread.estimate="none", spread.scale=1, show.spread.at=c(), colorize=FALSE, colorize.palette=rev(rainbow(256,start=0, end=4/6)), colorkey=colorize, colorkey.relwidth=0.25, colorkey.pos="right", print.cutoffs.at=c(), cutoff.label.function=function(x) { round(x,2) }, downsampling=0, add=FALSE) { arglist <- c(lapply( as.list(environment()), eval ), list(...) ) if (length(perf@y.values) != length(perf@x.values)) { stop("Performance object cannot be plotted.") } if (is.null(perf@alpha.values) && (colorize==TRUE || length(print.cutoffs.at)>0)) { stop(paste("Threshold coloring or labeling cannot be performed:", "performance object has no threshold information.")) } if ((avg=="vertical" || avg=="horizontal") && (colorize==TRUE || length(print.cutoffs.at)>0)) { stop(paste("Threshold coloring or labeling is only well-defined for", "'no' or 'threshold' averaging.")) } if (downsampling >0 ) perf <- .downsample( perf, downsampling) ## for infinite cutoff, assign maximal finite cutoff + mean difference ## between adjacent cutoff pairs if (length(perf@alpha.values)!=0) perf@alpha.values <- lapply(perf@alpha.values, function(x) { isfin <- is.finite(x); x[is.infinite(x)] <- (max(x[isfin]) + mean(abs(x[isfin][-1] - x[isfin][-length(x[isfin])]))); x } ) ## remove samples with x or y not finite for (i in 1:length(perf@x.values)) { ind.bool <- (is.finite(perf@x.values[[i]]) & is.finite(perf@y.values[[i]])) if (length(perf@alpha.values)>0) perf@alpha.values[[i]] <- perf@alpha.values[[i]][ind.bool] perf@x.values[[i]] <- perf@x.values[[i]][ind.bool] perf@y.values[[i]] <- perf@y.values[[i]][ind.bool] } arglist <- .sarg( arglist, perf=perf) if (add==FALSE) do.call( ".performance.plot.canvas", arglist ) if (avg=="none") do.call(".performance.plot.no.avg", arglist) else if (avg=="vertical") do.call(".performance.plot.vertical.avg", arglist) else if (avg=="horizontal") do.call(".performance.plot.horizontal.avg", arglist) else if (avg=="threshold") do.call(".performance.plot.threshold.avg", arglist) } ## --------------------------------------------------------------------------- ## initializing plots and plotting a canvas ## (can be skipped using 'plot( ..., add=TRUE)' ## --------------------------------------------------------------------------- .performance.plot.canvas <- function(perf, avg, ...) { arglist <- list(...) axis.names <- list(x=perf@x.name, y=perf@y.name) if (avg=="horizontal" || avg=="threshold") axis.names$x <- paste("Average", tolower(axis.names$x)) if (avg=="vertical" || avg=="threshold") axis.names$y <- paste("Average", tolower(axis.names$y)) arglist <- .farg(arglist, xlab=axis.names$x, ylab=axis.names$y) arglist <- .farg(arglist, xlim=c(min(unlist(perf@x.values)), max(unlist(perf@x.values))), ylim=c(min(unlist(perf@y.values)), max(unlist(perf@y.values)))) do.call("plot", .sarg(.slice.run(.get.arglist('plot', arglist)), x=0.5, y=0.5, type='n', axes=FALSE)) do.call( "axis", .sarg(.slice.run(.get.arglist('xaxis', arglist)), side=1)) do.call( "axis", .sarg(.slice.run(.get.arglist('yaxis', arglist)), side=2)) if (.garg(arglist,'colorkey')==TRUE) { colors <- rev( .garg(arglist,'colorize.palette') ) max.alpha <- max(unlist(perf@alpha.values)) min.alpha <- min(unlist(perf@alpha.values)) col.cutoffs <- rev(seq(min.alpha,max.alpha, length=length( colors ))) if ( .garg(arglist,'colorkey.pos')=="right") { ## axis drawing (ticks + labels) ## The interval [min.alpha,max.alpha] needs to be mapped onto ## the interval [min.y,max.y], rather than onto the interval ## [ylim[1],ylim[2]] ! In the latter case, NAs could occur in ## approxfun below, because axTicks can be out of the ylim-range ## ('yxaxs': 4%region) max.y <- max(axTicks(4)) min.y <- min(axTicks(4)) alpha.ticks <- .garg( arglist, c("coloraxis.at")) if (length(alpha.ticks)==0) alpha.ticks <- approxfun(c(min.y, max.y), c(min.alpha, max.alpha)) ( axTicks(4)) alpha2y <- approxfun(c(min(alpha.ticks), max(alpha.ticks)), c(min.y,max.y)) arglist <- .sarg(arglist, coloraxis.labels=.garg(arglist, 'cutoff.label.function')(alpha.ticks), coloraxis.at=alpha2y(alpha.ticks)) do.call("axis", .sarg(.slice.run(.get.arglist('coloraxis', arglist)), side=4)) ## draw colorkey ## each entry in display.bool corresponds to one rectangle of ## the colorkey. ## Only rectangles within the alpha.ticks range are plotted. ## y.lower, y.upper, and colors, are the attributes of the visible ## rectangles (those for which display.bool=TRUE) display.bool <- (col.cutoffs >= min(alpha.ticks) & col.cutoffs < max(alpha.ticks)) y.lower <- alpha2y( col.cutoffs )[display.bool] colors <- colors[display.bool] if (length(y.lower>=2)) { y.width <- y.lower[2] - y.lower[1] y.upper <- y.lower + y.width x.left <- .garg(arglist,'xlim')[2] + ((.garg(arglist,'xlim')[2] - .garg(arglist,'xlim')[1]) * (1-.garg(arglist,'colorkey.relwidth'))*0.04) x.right <- .garg(arglist,'xlim')[2] + (.garg(arglist,'xlim')[2] -.garg(arglist,'xlim')[1]) * 0.04 rect(x.left, y.lower, x.right, y.upper, col=colors, border=colors,xpd=NA) } } else if (.garg(arglist, 'colorkey.pos') == "top") { ## axis drawing (ticks + labels) max.x <- max(axTicks(3)) min.x <- min(axTicks(3)) alpha.ticks <- .garg( arglist, c("coloraxis.at")) if (length(alpha.ticks)==0) { alpha.ticks <- approxfun(c(min.x, max.x), c(min.alpha, max.alpha))(axTicks(3)) } alpha2x <- approxfun(c( min(alpha.ticks), max(alpha.ticks)), c( min.x, max.x)) arglist <- .sarg(arglist, coloraxis.labels=.garg(arglist, 'cutoff.label.function')(alpha.ticks), coloraxis.at= alpha2x(alpha.ticks)) do.call("axis", .sarg(.slice.run( .get.arglist('coloraxis', arglist)), side=3)) ## draw colorkey display.bool <- (col.cutoffs >= min(alpha.ticks) & col.cutoffs < max(alpha.ticks)) x.left <- alpha2x( col.cutoffs )[display.bool] colors <- colors[display.bool] if (length(x.left)>=2) { x.width <- x.left[2] - x.left[1] x.right <- x.left + x.width y.lower <- .garg(arglist,'ylim')[2] + (.garg(arglist,'ylim')[2] - .garg(arglist,'ylim')[1]) * (1-.garg(arglist,'colorkey.relwidth'))*0.04 y.upper <- .garg(arglist,'ylim')[2] + (.garg(arglist,'ylim')[2] - .garg(arglist,'ylim')[1]) * 0.04 rect(x.left, y.lower, x.right, y.upper, col=colors, border=colors, xpd=NA) } } } do.call( "box", .slice.run( .get.arglist( 'box', arglist))) } ## ---------------------------------------------------------------------------- ## plotting performance objects when no curve averaging is wanted ## ---------------------------------------------------------------------------- .performance.plot.no.avg <- function( perf, ... ) { arglist <- list(...) arglist <- .farg(arglist, type= 'l') if (.garg(arglist, 'colorize') == TRUE) { colors <- rev( .garg( arglist, 'colorize.palette') ) max.alpha <- max(unlist(perf@alpha.values)) min.alpha <- min(unlist(perf@alpha.values)) col.cutoffs <- rev(seq(min.alpha,max.alpha, length=length(colors)+1)) col.cutoffs <- col.cutoffs[2:length(col.cutoffs)] } for (i in 1:length(perf@x.values)) { if (.garg(arglist, 'colorize') == FALSE) { do.call("plot.xy", .sarg(.slice.run(.get.arglist('plot.xy', arglist), i), xy=(xy.coords(perf@x.values[[i]], perf@y.values[[i]])))) } else { for (j in 1:(length(perf@x.values[[i]])-1)) { segment.coloring <- colors[min(which(col.cutoffs <= perf@alpha.values[[i]][j]))] do.call("plot.xy", .sarg(.slice.run(.get.arglist('plot.xy', arglist), i), xy=(xy.coords(perf@x.values[[i]][j:(j+1)], perf@y.values[[i]][j:(j+1)])), col= segment.coloring)) } } print.cutoffs.at <- .garg(arglist, 'print.cutoffs.at',i) if (! is.null(print.cutoffs.at)) { text.x <- approxfun(perf@alpha.values[[i]], perf@x.values[[i]], rule=2, ties=mean)(print.cutoffs.at) text.y <- approxfun(perf@alpha.values[[i]], perf@y.values[[i]], rule=2, ties=mean)(print.cutoffs.at) do.call("points", .sarg(.slice.run(.get.arglist('points', arglist),i), x= text.x, y= text.y)) do.call("text", .farg(.slice.run( .get.arglist('text', arglist),i), x= text.x, y= text.y, labels=(.garg(arglist, 'cutoff.label.function', i)(print.cutoffs.at)))) } } } ## ---------------------------------------------------------------------------- ## plotting performance objects when vertical curve averaging is wanted ## ---------------------------------------------------------------------------- .performance.plot.vertical.avg <- function( perf, ...) { arglist <- list(...) arglist <- .farg(arglist, show.spread.at= (seq(min(unlist(perf@x.values)), max(unlist(perf@x.values)), length=11))) perf.avg <- perf x.values <- seq(min(unlist(perf@x.values)), max(unlist(perf@x.values)), length=max( sapply(perf@x.values, length))) for (i in 1:length(perf@y.values)) { perf.avg@y.values[[i]] <- approxfun(perf@x.values[[i]], perf@y.values[[i]], ties=mean, rule=2)(x.values) } perf.avg@y.values <- list(rowMeans( data.frame( perf.avg@y.values ))) perf.avg@x.values <- list(x.values) perf.avg@alpha.values <- list() ## y.values at show.spread.at (midpoint of error bars ) show.spread.at.y.values <- lapply(as.list(1:length(perf@x.values)), function(i) { approxfun(perf@x.values[[i]], perf@y.values[[i]], rule=2, ties=mean)( .garg(arglist, 'show.spread.at')) }) show.spread.at.y.values <- as.matrix(data.frame(show.spread.at.y.values )) colnames(show.spread.at.y.values) <- c() ## now, show.spread.at.y.values[i,] contains the curve y values at the ## sampling x value .garg(arglist,'show.spread.at')[i] if (.garg(arglist, 'spread.estimate') == "stddev" || .garg(arglist, 'spread.estimate') == "stderror") { bar.width <- apply(show.spread.at.y.values, 1, sd) if (.garg(arglist, 'spread.estimate') == "stderror") { bar.width <- bar.width / sqrt( ncol(show.spread.at.y.values) ) } bar.width <- .garg(arglist, 'spread.scale') * bar.width suppressWarnings(do.call("plotCI", .farg(.sarg(.get.arglist( 'plotCI', arglist), x=.garg(arglist, 'show.spread.at'), y=rowMeans( show.spread.at.y.values), uiw= bar.width, liw= bar.width, err= 'y', add= TRUE), gap= 0, type= 'n'))) } if (.garg(arglist, 'spread.estimate') == "boxplot") { do.call("boxplot", .farg(.sarg(.get.arglist( 'boxplot', arglist), x= data.frame(t(show.spread.at.y.values)), at= .garg(arglist, 'show.spread.at'), add= TRUE, axes= FALSE), boxwex= (1/(2*(length(.garg(arglist, 'show.spread.at'))))))) do.call("points", .sarg(.get.arglist( 'points', arglist), x= .garg(arglist, 'show.spread.at'), y= rowMeans(show.spread.at.y.values))) } do.call( ".plot.performance", .sarg(arglist, perf= perf.avg, avg= 'none', add= TRUE)) } ## ---------------------------------------------------------------------------- ## plotting performance objects when horizontal curve averaging is wanted ## ---------------------------------------------------------------------------- .performance.plot.horizontal.avg <- function( perf, ...) { arglist <- list(...) arglist <- .farg(arglist, show.spread.at= seq(min(unlist(perf@y.values)), max(unlist(perf@y.values)), length=11)) perf.avg <- perf y.values <- seq(min(unlist(perf@y.values)), max(unlist(perf@y.values)), length=max( sapply(perf@y.values, length))) for (i in 1:length(perf@x.values)) { perf.avg@x.values[[i]] <- approxfun(perf@y.values[[i]], perf@x.values[[i]], ties=mean, rule=2)(y.values) } perf.avg@x.values <- list(rowMeans( data.frame( perf.avg@x.values ))) perf.avg@y.values <- list(y.values) perf.avg@alpha.values <- list() ## x.values at show.spread.at (midpoint of error bars ) show.spread.at.x.values <- lapply(as.list(1:length(perf@y.values)), function(i) { approxfun(perf@y.values[[i]], perf@x.values[[i]], rule=2, ties=mean)(.garg(arglist,'show.spread.at')) } ) show.spread.at.x.values <- as.matrix(data.frame(show.spread.at.x.values)) colnames(show.spread.at.x.values) <- c() ## now, show.spread.at.x.values[i,] contains the curve x values at the ## sampling y value .garg(arglist,'show.spread.at')[i] if (.garg(arglist,'spread.estimate') == 'stddev' || .garg(arglist,'spread.estimate') == 'stderror') { bar.width <- apply(show.spread.at.x.values, 1, sd) if (.garg(arglist,'spread.estimate')== 'stderror') { bar.width <- bar.width / sqrt( ncol(show.spread.at.x.values) ) } bar.width <- .garg(arglist,'spread.scale') * bar.width suppressWarnings(do.call("plotCI", .farg(.sarg(.get.arglist( 'plotCI', arglist), x= rowMeans( show.spread.at.x.values), y= .garg(arglist, 'show.spread.at'), uiw= bar.width, liw= bar.width, err= 'x', add= TRUE), gap= 0, type= 'n'))) } if (.garg(arglist,'spread.estimate') == "boxplot") { do.call("boxplot", .farg(.sarg(.get.arglist( 'boxplot', arglist), x= data.frame(t(show.spread.at.x.values)), at= .garg(arglist,'show.spread.at'), add= TRUE, axes= FALSE, horizontal= TRUE), boxwex= 1/(2*(length(.garg(arglist,'show.spread.at')))))) do.call("points", .sarg(.get.arglist( 'points', arglist), x= rowMeans(show.spread.at.x.values), y= .garg(arglist,'show.spread.at'))) } do.call( ".plot.performance", .sarg(arglist, perf= perf.avg, avg= 'none', add= TRUE)) } ## ---------------------------------------------------------------------------- ## plotting performance objects when threshold curve averaging is wanted ## ---------------------------------------------------------------------------- .performance.plot.threshold.avg <- function( perf, ...) { arglist <- list(...) arglist <- .farg(arglist, show.spread.at= seq(min(unlist(perf@x.values)), max(unlist(perf@x.values)), length=11)) perf.sampled <- perf alpha.values <- rev(seq(min(unlist(perf@alpha.values)), max(unlist(perf@alpha.values)), length=max( sapply(perf@alpha.values, length)))) for (i in 1:length(perf.sampled@y.values)) { perf.sampled@x.values[[i]] <- approxfun(perf@alpha.values[[i]],perf@x.values[[i]], rule=2, ties=mean)(alpha.values) perf.sampled@y.values[[i]] <- approxfun(perf@alpha.values[[i]], perf@y.values[[i]], rule=2, ties=mean)(alpha.values) } ## compute average curve perf.avg <- perf.sampled perf.avg@x.values <- list( rowMeans( data.frame( perf.avg@x.values))) perf.avg@y.values <- list(rowMeans( data.frame( perf.avg@y.values))) perf.avg@alpha.values <- list( alpha.values ) x.values.spread <- lapply(as.list(1:length(perf@x.values)), function(i) { approxfun(perf@alpha.values[[i]], perf@x.values[[i]], rule=2, ties=mean)(.garg(arglist,'show.spread.at')) } ) x.values.spread <- as.matrix(data.frame( x.values.spread )) y.values.spread <- lapply(as.list(1:length(perf@y.values)), function(i) { approxfun(perf@alpha.values[[i]], perf@y.values[[i]], rule=2, ties=mean)(.garg(arglist,'show.spread.at')) } ) y.values.spread <- as.matrix(data.frame( y.values.spread )) if (.garg(arglist,'spread.estimate')=="stddev" || .garg(arglist,'spread.estimate')=="stderror") { x.bar.width <- apply(x.values.spread, 1, sd) y.bar.width <- apply(y.values.spread, 1, sd) if (.garg(arglist,'spread.estimate')=="stderror") { x.bar.width <- x.bar.width / sqrt( ncol(x.values.spread) ) y.bar.width <- y.bar.width / sqrt( ncol(x.values.spread) ) } x.bar.width <- .garg(arglist,'spread.scale') * x.bar.width y.bar.width <- .garg(arglist,'spread.scale') * y.bar.width suppressWarnings( do.call("plotCI", .farg(.sarg(.get.arglist( 'plotCI', arglist), x= rowMeans(x.values.spread), y= rowMeans(y.values.spread), uiw= x.bar.width, liw= x.bar.width, err= 'x', add= TRUE), gap= 0, type= 'n'))) suppressWarnings( do.call("plotCI", .farg(.sarg(.get.arglist( 'plotCI', arglist), x= rowMeans(x.values.spread), y= rowMeans(y.values.spread), uiw= y.bar.width, liw= y.bar.width, err= 'y', add= TRUE), gap= 0, type= 'n'))) } if (.garg(arglist,'spread.estimate')=="boxplot") { do.call("boxplot", .farg(.sarg(.get.arglist('boxplot', arglist), x= data.frame(t(x.values.spread)), at= rowMeans(y.values.spread), add= TRUE, axes= FALSE, horizontal= TRUE), boxwex= 1/(2*(length(.garg(arglist,'show.spread.at')))))) do.call("boxplot", .farg(.sarg(.get.arglist('boxplot', arglist), x= data.frame(t(y.values.spread)), at= rowMeans(x.values.spread), add= TRUE, axes= FALSE), boxwex= 1/(2*(length(.garg(arglist,'show.spread.at')))))) do.call("points", .sarg(.get.arglist('points', arglist), x= rowMeans(x.values.spread), y= rowMeans(y.values.spread))) } do.call( ".plot.performance", .sarg(arglist, perf= perf.avg, avg= 'none', add= TRUE)) } eRm/R/itemfit.ppar.R0000755000175100001440000000336714375241642013765 0ustar hornikusers`itemfit.ppar` <- function(object) # computes Chi-square based itemfit statistics # for object of class "ppar" (from person.parameter) { if (length(object$pers.ex)==0) { X <- object$X } else { X <- object$X[-object$pers.ex,] } VE <- pifit.internal(object) #compute expectation and variance term Emat <- VE$Emat Vmat <- VE$Vmat Cmat <- VE$Cmat st.res <- (X-Emat)/sqrt(Vmat) sq.res <- st.res^2 #squared standardized residuals ifit <- colSums(sq.res,na.rm=TRUE) idf <- apply(X,2,function(x) {length(na.exclude(x))}) i.outfitMSQ <- ifit/idf qsq.outfitMSQ <- (colSums(Cmat/Vmat^2, na.rm=TRUE)/idf^2) - 1/idf q.outfitMSQ <- sqrt(qsq.outfitMSQ) isumVmat<-colSums(Vmat) i.infitMSQ <- colSums(sq.res*Vmat, na.rm = TRUE)/isumVmat qsq.infitMSQ <- colSums(Cmat-Vmat^2, na.rm=TRUE)/isumVmat^2 q.infitMSQ <- sqrt(qsq.infitMSQ) i.outfitZ <- (i.outfitMSQ^(1/3) - 1)*(3/q.outfitMSQ)+(q.outfitMSQ/3) # corr. rh 2011-06-15 i.infitZ <- (i.infitMSQ^(1/3) - 1)*(3/q.infitMSQ) +(q.infitMSQ/3) # hint from rainer alexandrowicz ## estimate part-whole corrected item discriminations according to CTT R <- cor(object$X.ex, use = "pairwise.complete.obs") if (any(is.na(R))) { warning("Corrected item-test correlations cannot be computed due to NA pattern in data.\n") item.disc <- NA } else { diag(R) <- smc(R) ## Correct for item overlap by using squared multiple correlation Vtc <- sum(R, na.rm = TRUE) item.disc <- colSums(R, na.rm = TRUE)/sqrt(Vtc) } result <- list(i.fit=ifit,i.df=idf,st.res=st.res,i.outfitMSQ=i.outfitMSQ,i.infitMSQ=i.infitMSQ, i.outfitZ=i.outfitZ,i.infitZ=i.infitZ, i.disc = item.disc) class(result) <- "ifit" result } eRm/R/print.ppar.R0000755000175100001440000000563014375241642013453 0ustar hornikusers`print.ppar` <- function(x,...) # print method for person.parameter # x...object of class ppar { cat("\n") cat("Person Parameters:") cat("\n") if (length(x$pers.ex) > 0) { X <- x$X[-x$pers.ex,] #list with raw scores sumlist <- by(x$X[-x$pers.ex,],x$gmemb,rowSums,na.rm=TRUE) } else { X <- x$X sumlist <- by(x$X,x$gmemb,rowSums,na.rm=TRUE) } if (is.null(x$pred.list)) { #no spline Interpolation coef.list <- mapply(function(sm,th,se) { th.u <- tapply(th,sm, function(tm) {tm[1]}) #due to rounding errors, pck out first one se.u <- tapply(se,sm, function(ss) {ss[1]}) sm.u <- unique(sort(sm)) smth <- cbind(sm.u,th.u,se.u) return(smth) },sumlist,x$thetapar,x$se,SIMPLIFY=FALSE) } else { #if spline Interpolation #TFvec <- sapply(x$pred.list,is.null) #for these NA groups no spline interpolation was computed #predind <- (1:length(x$pred.list))[!TFvec] #x$pred.list <- x$pred.list[predind] coef.list <- mapply(function(sm,pl,se) { se.u <- tapply(se,sm, function(ss) {ss[1]}) sm.u <- unique(sort(sm)) TFvec <- pl$x %in% sm.u se.ind <- 1:length(TFvec) se.all <- rep(NA,length(se.ind)) se.all[se.ind[TFvec]] <- se.u cbind(pl$x,pl$y,se.all) },sumlist,x$pred.list,x$se,SIMPLIFY=FALSE) } if (dim(coef.list[[1]])[2] == 2) { #if no standard errors were computed coef.list <- lapply(coef.list,function(cl) {cbind(cl,NA)}) } # if (any(is.na(x$X))) { #recompute gmemb without persons excluded # dichX <- ifelse(is.na(x$X),1,0) # strdata <- apply(dichX,1,function(x) {paste(x,collapse="")}) # gmemb <- as.vector(data.matrix(data.frame(strdata))) # } else { # gmemb <- rep(1,dim(x$X)[1]) # } for (i in 1:length(x$thetapar)) { cat("\n") if (length(x$thetapar) > 1) { cat("Person NA Group:",i,"\n") xvec <- rep(NA, (dim(x$X)[2])) notNApos <- which(!is.na(as.vector(rbind(X[x$gmemb == i,])[1,]))) xvec[notNApos] <- "x" cat("NA pattern:",xvec,"\n") } colnames(coef.list[[i]]) <- c("Raw Score","Estimate","Std.Error") rownames(coef.list[[i]]) <- rep("",dim(coef.list[[i]])[1]) print(coef.list[[i]]) } invisible(coef.list) } eRm/R/summary.ppar.R0000755000175100001440000000267214375241642014017 0ustar hornikusers`summary.ppar` <- function(object,...) # summary method for object of class "ppar" { if (length(object$pers.ex) > 0) { thetaind <- rownames(object$X)[-object$pers.ex] } else { thetaind <- rownames(object$X) } if (any(is.na(object$X))) { #recompute gmemb without persons excluded dichX <- ifelse(is.na(object$X),1,0) strdata <- apply(dichX,1,function(x) {paste(x,collapse="")}) gmemb <- as.vector(data.matrix(data.frame(strdata))) } else { gmemb <- rep(1,dim(object$X)[1]) } cat("\n") cat("Estimation of Ability Parameters") for (i in 1:length(object$thetapar)) { cat("\n\n") if (length(object$thetapar) > 1) { cat("Subject NA Group:",i,"\n") xvec <- rbind(object$X[gmemb==i,])[1,] #determine NA pattern xvec[!is.na(xvec)] <- "x" cat("NA pattern:",xvec,"\n") } cat("Collapsed log-likelihood:",object$loglik[[i]],"\n") cat("Number of iterations:",object$iter[[i]],"\n") cat("Number of parameters:",object$npar[[i]],"\n") cat("\n") cat("ML estimated ability parameters (without spline interpolated values): \n") coef.table <- cbind(object$thetapar[[i]],object$se.theta[[i]],confint(object)[[i]]) dimnames(coef.table) <- list(paste("theta",thetaind[object$gmemb==i]),c("Estimate","Std. Err.",colnames(confint(object)[[i]]))) print(coef.table) } } eRm/R/print.PersonMisfit.R0000755000175100001440000000070414375241642015130 0ustar hornikusers# =============================================================== # use print function to return separation reliability of object x # =============================================================== print.MisfittingPersons <- function(x, ...) # print method for object of class "MisfittingPersons" # x = object of class "MisfittingPersons" { cat("\n") cat("Percentage of Misfitting Persons:", round(x$PersonMisfit,4), "%","\n") cat("\n") } eRm/R/cwdeviance.r0000755000175100001440000000105114375241642013517 0ustar hornikuserscwdeviance <- function(object, pi.hat) { # computes casewise deviance for objects of class ppar X <- object$X.ex loglik.full <- sum(X*log(pi.hat)+(1-X)*log(1-pi.hat), na.rm = TRUE) #for ordinary logistic regression npar.full <- (dim(object$W)[2])+sum(object$npar) #number of estimated item + person parameters npar.sat <- sum(nrow(pi.hat)*ncol(pi.hat)) value <- -2*loglik.full df <- npar.sat-npar.full p.value <- 1-pchisq(value, df = df) result <- list(value = value, df = df, p.value = p.value) result }eRm/R/coef.eRm.R0000755000175100001440000000037314375241642013013 0ustar hornikusers`coef.eRm` <- function(object, parm = "beta", ...) { # option "beta" added rh 2010-03-07 if(parm == "beta") object$betapar else if(parm == "eta") object$etapar else stop("'parm' incorrectly specified") } eRm/R/test_info.R0000755000175100001440000000121614375241642013344 0ustar hornikuserstest_info <- function(ermobject,theta=seq(-5,5,0.01)) ##Calculates info of a scale of items # #@input: ermobject ... Object of class eRm # theta ... supporting or sampling points on latent trait #@output: a list where each element corresponds to an item and contains # $c.info...matrix of category information in columns for theta (rows) # $i.info...vector of item information at values of theta #@author: Thomas Rusch #@date:12.6.2011 # { infos <- item_info(ermobject,theta) tmp <- lapply(infos, function(x) x$i.info) tmp <- matrix(unlist(tmp),ncol=dim(ermobject$X)[2]) tinfo <- rowSums(tmp) return(tinfo) } eRm/R/thresholds.r0000755000175100001440000000006714375241642013574 0ustar hornikusersthresholds <- function(object)UseMethod("thresholds") eRm/R/PersonMisfit.R0000755000175100001440000000143714375241642014001 0ustar hornikusersPersonMisfit <- function(object) UseMethod("PersonMisfit") PersonMisfit.ppar <- function (object) { # takes person.parameter as object # extract person fit values pfit <- personfit(object) person.misfit.Z <- pfit$p.infitZ person.misfit.Z[order(unlist(person.misfit.Z),decreasing=TRUE)] # count total number of persons and proportion of misfitting persons total.persons <- length(person.misfit.Z) count.misfit.Z<-sum(person.misfit.Z>1.96) PersonMisfit<-count.misfit.Z/total.persons*100 # save result as a lsit result<-list(PersonMisfit=PersonMisfit, count.misfit.Z=count.misfit.Z, total.persons=total.persons) class(result) <- "MisfittingPersons" # define the outcome of the function "PersonMisfit" as an object of class "MisfittingPersons" return(result) } eRm/R/Waldtest.Rm.R0000755000175100001440000001517614375241642013530 0ustar hornikusersWaldtest.Rm <- function(object, splitcr = "median"){ # performs item-based Wald test (Fischer & Molenaar, p.90) # object... object of class RM # splitcr... splitting criterion for LR-groups. "median" to a median raw score split, # "mean" corobjectponds to the mean raw score split. # optionally also a vector of length n for group split can be submitted. call<-match.call() spl.gr<-NULL X.original<-object$X if (length(splitcr)>1 && is.character(splitcr)){ # if splitcr is character vector, treated as factor splitcr<-as.factor(splitcr) } if (is.factor(splitcr)){ spl.nam<-deparse(substitute(splitcr)) spl.lev<-levels(splitcr) spl.gr<-paste(spl.nam,spl.lev,sep=" ") splitcr<-unclass(splitcr) } numsplit<-is.numeric(splitcr) if (any(is.na(object$X))) { if (!numsplit && splitcr=="mean") { #mean split spl.gr<-c("Raw Scores < Mean", "Raw Scores >= Mean") X<-object$X # calculates index for NA groups # from person.parameter.eRm dichX <- ifelse(is.na(X),1,0) strdata <- apply(dichX,1,function(x) {paste(x,collapse="")}) gmemb <- as.vector(data.matrix(data.frame(strdata))) gindx<-unique(gmemb) rsum.all<-rowSums(X,na.rm=TRUE) grmeans<-tapply(rsum.all,gmemb,mean) #sorted ngr<-table(gmemb) #sorted m.all<-rep(grmeans,ngr) #sorted,expanded rsum.all<-rsum.all[order(gmemb)] spl<-ifelse(rsum.all Median") #removed rh 2010-12-17 #cat("Warning message: Persons with median raw scores are assigned to the lower raw score group!\n") X<-object$X # calculates index for NA groups # from person.parameter.eRm dichX <- ifelse(is.na(X),1,0) strdata <- apply(dichX,1,function(x) {paste(x,collapse="")}) gmemb <- as.vector(data.matrix(data.frame(strdata))) gindx<-unique(gmemb) rsum.all<-rowSums(X,na.rm=TRUE) grmed<-tapply(rsum.all,gmemb,median) #sorted ngr<-table(gmemb) #sorted m.all<-rep(grmed,ngr) #sorted,expanded rsum.all<-rsum.all[order(gmemb)] spl<-ifelse(rsum.all<=m.all,1,2) splitcr<-spl object$X<-X[order(gmemb),] } } if (is.numeric(splitcr)){ spl.nam<-deparse(substitute(splitcr)) if (length(table(splitcr)) > 2) stop("Dichotomous person split required!") if (length(splitcr) != dim(object$X)[1]) { stop("Mismatch between length of split vector and number of persons!") } else { rvind <- splitcr Xlist <- by(object$X,rvind, function(x) x) names(Xlist) <- as.list(sort(unique(splitcr))) if(is.null(spl.gr)){ spl.lev<-names(Xlist) spl.gr<-paste(spl.nam,spl.lev,sep=" ") } }} if (!is.numeric(splitcr)) { if (splitcr=="median") { #median split rv <- apply(object$X,1,sum,na.rm=TRUE) rvsplit <- median(rv) rvind <- rep(0,length(rv)) rvind[rv > rvsplit] <- 1 #group with high raw score object Xlist <- by(object$X,rvind,function(x) x) names(Xlist) <- list("low","high") } if (splitcr=="mean") { #mean split rv <- apply(object$X,1,sum,na.rm=TRUE) rvsplit <- mean(rv) rvind <- rep(0,length(rv)) rvind[rv > rvsplit] <- 1 #group with highraw scoobject Xlist <- by(object$X,rvind,function(x) x) names(Xlist) <- list("low","high") } } del.pos.l <- lapply(Xlist, function(x) { it.sub <- datcheck.LRtest(x,object$X,object$model) #items to be removed within subgroup }) del.pos <- unique(unlist(del.pos.l)) if ((length(del.pos)) >= (dim(object$X)[2]-1)) { stop("\nNo items with appropriate response patterns left to perform Wald-test!\n") } if(length(del.pos) > 0){ warning(paste0( "\n", prettyPaste("The following items were excluded due to inappropriate response patterns within subgroups:"), "\n", paste(colnames(object$X)[del.pos], collapse=" "), "\n\n", prettyPaste("Subgroup models are estimated without these items!") ), immediate.=TRUE) } if(length(del.pos) > 0){ X.el <- object$X[,-(del.pos)] } else { X.el <- object$X } Xlist.n <- by(X.el,rvind,function(y) y) names(Xlist.n) <- names(Xlist) if (object$model=="RM") { likpar <- sapply(Xlist.n,function(x) { #matrix with loglik and npar for each subgroup objectg <- RM(x) parg <- objectg$etapar seg <- objectg$se.eta list(parg,seg,objectg$betapar,objectg$se.beta) }) } if (object$model=="PCM") { likpar <- sapply(Xlist.n,function(x) { #matrix with loglik and npar for each subgroup objectg <- PCM(x) parg <- objectg$etapar seg <- objectg$se.eta list(parg,seg,objectg$betapar,objectg$se.beta) }) } if (object$model=="RSM") { likpar <- sapply(Xlist.n,function(x) { #matrix with loglik and npar for each subgroup objectg <- RSM(x) parg <- objectg$etapar seg <- objectg$se.eta list(parg,seg,objectg$betapar,objectg$se.beta) }) } betapar1 <- likpar[3,][[1]] beta1.se <- likpar[4,][[1]] betapar2 <- likpar[3,][[2]] beta2.se <- likpar[4,][[2]] num <- (betapar1-betapar2) denom <- sqrt(beta1.se^2 + beta2.se^2) W.i <- num/denom pvalues <- (1-pnorm(abs(W.i)))*2 coef.table <- cbind(W.i,pvalues) dimnames(coef.table) <- list(names(betapar1),c("z-statistic","p-value")) result <- list(coef.table=coef.table,betapar1=betapar1,se.beta1=beta1.se,betapar2=betapar2, se.beta2=beta2.se, spl.gr=spl.gr, call=call, it.ex = del.pos) class(result) <- "wald" result } eRm/R/datprep_PCM.R0000755000175100001440000000511314375241642013510 0ustar hornikusers`datprep_PCM` <- function(X,W,sum0) { #... X: data matrix with response categories to be converted into 0/1 matrix #TFrow <- (rowSums(X)==0) #el. persons with 0/K rawscore #X <- X[!TFrow,] #converting into 0/1 matrix N <- dim(X)[1] #number of persons mt_vek <- apply(X,2,max,na.rm=TRUE) #number of categories - 1 for each item mt_vek_0 <- mt_vek+1 #number of categories for each item X01_0 <- matrix(rep(0,(N*sum(mt_vek_0))),nrow=N)#empty 0/1 matrix K <- length(mt_vek) #number of items cummt0 <- c(0,cumsum(mt_vek_0)[1:(K-1)])+1 #index vector for 0th category indmatp <- apply(X,1,function(xi) {xi+cummt0}) #preparing index matrix for 1 responses imp1 <- as.vector(indmatp) imp2 <- rep(1:N,rep(K,N)) indmat <- cbind(imp2,imp1) #final index matrix for 1 responses X01_0[indmat] <- 1 #0/1 matrix with 0th category NAindmat <- rbind(imp2,rep(1:K,N),c(t(X))) #impose NA structure rownames(NAindmat) <- NULL NAind <- t(NAindmat[1:2,is.na(NAindmat[3,])]) #index matrix for NA's in X if (length(NAind) > 0) { NAindlist <- apply(NAind,1,function(x){ co <- seq(cummt0[x[2]],cummt0[x[2]]+mt_vek[x[2]]) NAind01 <- cbind(rep(x[1],length(co)),co) data.frame(NAind01,row.names=NULL) #list with NA indices }) indmatNA <- matrix(unlist(lapply(NAindlist, function(x) {t(as.matrix(x))})),ncol=2,byrow=TRUE) #matrix with NA indices X01_0[indmatNA] <- NA } X01 <- X01_0[,-cummt0] #delete 0-category answers --> final 0/1 pattern matrix (dim N*sum(mt_vek)) #automatized generation of the design matrix W if (length(W)==1) { W1 <- diag(1,(sum(mt_vek)-1)) #build up design matrix if (sum0) { w1 <- rep(-1,(sum(mt_vek)-1)) #sum0 restriction } else { w1 <- rep(0,(sum(mt_vek)-1)) #first item parameter set to 0 } W <- rbind(w1,W1) #PCM design matrix colnames(W) <- NULL rownames(W) <- NULL } list(X=X,X01=X01,mt_vek=mt_vek,W=W) #Output: X01 ... 0/1 response matrix of dimension N*rtot # mt_vek ... vector of length K with number of categories - 1 (for each item) # W ... design matrix of dimension sum(mt_vek)*sum(mt_vek) } eRm/R/confint.threshold.r0000755000175100001440000000055214375241642015047 0ustar hornikusersconfint.threshold <- function(object, parm, level = 0.95, ...) { #object of class "threshold" a <- (1 - level)/2 a <- c(a, 1 - a) pct <- paste(a*100,"%") fac <- qnorm(a) cf <- object$threshpar ses <- object$se.thresh dn <- names(object$threshpar) ci <- array(NA, dim = c(length(cf), 2), dimnames = list(dn,pct)) ci[] <- cf + ses %o% fac ci }eRm/R/fitcml.R0000755000175100001440000001035014375241642012627 0ustar hornikusersfitcml <- function(mt_ind, nrlist, x_mt, rtot, W, ngroups, gind, x_mtlist, NAstruc, g_NA, st.err, etaStart, gby){ #cml function for call in nlm cml <- function(eta){ beta <- as.vector(W %*% eta) #FIXME!!! gby?? beta.list <- split(beta,gind) #gind index for treatment groups beta.list1 <- beta.list #beta and NAstructure (over Groups): 1st line parameter values, 2nd line which item NA betaNA <- mapply(function(x,y) {rbind(x,y)},beta.list1,NAstruc,SIMPLIFY=FALSE) #likelihood term based on gamma functions for each Group x NAgroup combination Lg <- lapply(betaNA, function(betaNAmat) { beta.vec <- betaNAmat[1,] #get parameter vector beta #gamma functions for each NAgroup within Groups Lg.NA <- apply(matrix(betaNAmat[-1,],ncol=length(beta.vec)),1, function(NAvec) { #list of virtual item-category parameters per item beta_list <- as.list(split(beta.vec[NAvec==1],mt_ind[1:(length(beta.vec[NAvec==1]))])) parlist <- lapply(beta_list,exp) #initial epsilon as list #------------------gamma functions---------------------- g_iter <- NULL #computation of the gamma functions K <- length(parlist) for (t in 1:(K-1)) { #building up J1,...,Jt,...,Js if (t==1) { #first iteration step gterm <- c(1,parlist[[t]]) #0th element included }else { gterm <- g_iter #gamma previous iteration with 0th el g_iter <- NULL } parvek <- c(1,parlist[[t+1]]) #eps vector in current iteration with 0th el h <- length(parvek) #dimensions for matrix mt <- length(gterm) rtot1 <- h+mt-1 #number of possible raw scores (0 included) gtermvek <- rep(c(gterm,rep(0,h)),h) #building up matrix for gamma term gtermvek <- gtermvek[-((length(gtermvek)-h+1):length(gtermvek))] #eliminating last h 0's gmat <- matrix(gtermvek,nrow=rtot1,ncol=h) emat <- matrix(rep(parvek,rep(rtot1,h)),ncol=h,nrow=rtot1) #building up matrix for eps term gmat_new <- gmat*emat #merge matrices g_iter <- rowSums(gmat_new) #gamma functions in current iteration are rowsums } #----------------- end gamma functions ------------------ Lg.NA <- as.vector(g_iter[2:(rtot+1)]) #final gamma vector stored in gamma (without gamma0) return(Lg.NA) }) }) #----------------- compute likelihood components ----------------------- L1 <- sum(mapply(function(x,z) { x[!is.na(z)]%*%na.exclude(z) },nrlist,lapply(Lg,log))) #sum up L1-terms (group-wise) L2 <- sum(mapply("%*%",x_mtlist,beta.list1)) #sum up L2-terms (group-wise) L1-L2 #final likelihood value } #----------------- end likelihood ----------------------- eta <- etaStart #starting values for eta parameters if(!exists("fitctrl")) fitctrl <- "nlm" # if fitctrl undefined, set it to "nlm" ### MjM 2014-01-27 if(fitctrl == "nlm"){ suppressWarnings( fit <- nlm(cml, eta, hessian = st.err, iterlim = 5000L) # NLM optimizer ) } else if(fitctrl == "optim"){ suppressWarnings( fit <- optim(eta, cml, method = "BFGS", hessian = TRUE, control = list(maxit = 5000L)) ) fit$counts<-fit$counts[1] names(fit)<-c("estimate","minimum","iterations","code","message","hessian") } else stop("optimizer misspecified in fitctrl\n") fit } eRm/R/gofIRT.R0000755000175100001440000000011714375241642012503 0ustar hornikusersgofIRT <- function(object, groups.hl = 10, cutpoint = 0.5)UseMethod("gofIRT") eRm/R/plotTR.R0000755000175100001440000000226514375241642012603 0ustar hornikusersplotTR <-function(object,...){ #plot trend over time for all items itms <- object$itms tps <- object$mpoints pplgrps <- object$ngroups/itms trend <- object$etapar[((pplgrps-1)*itms*(tps-1)+1):((pplgrps-1)*itms*(tps-1)+(itms*(tps-1)))] #tips <-rep(paste("t",1:tps,sep=""),each=itms) #items <- rep(paste("Item",1:itms),tps) tips <- as.factor(rep(paste("t", 1:tps, sep = ""), each = itms)) items <- as.factor(rep(paste("Item", 1:itms), tps)) tr0 <- rep(0,itms) trend <- c(tr0,trend) plotdats <- data.frame(trend,items,tips) key.items <- list(space = "right", text = list(levels(plotdats$items)), points = list(pch = 1:length(levels(plotdats$items)), col = "black") ) plotout <- xyplot(trend~tips,data=plotdats, aspect="fill", type="o", groups=items, key=key.items, lty=1,pch = 1:length(levels(plotdats$items)), col.line = "darkgrey", col.symbol = "black", xlab = "Time", ylab = "Effect", main = "Trend effect plot for LLRA" ) print(plotout) } eRm/R/build_W.R0000755000175100001440000000201114375241642012731 0ustar hornikusersbuild_W <- function(X,nitems,mpoints,grp_n,groupvec,itmgrps) { if(missing(grp_n)) grp_n<- table(groupvec) if(!is.numeric(grp_n)) stop("Please specify the number of subjects per group.") if(missing(nitems))stop("Please specify the number of items.") if(any(grp_n==0)) stop("There are groups with zero sample size.") if(missing(mpoints)) stop("Please specify the number of time points. If there are none, you might want to use PCM() or LPCM().") pplgrps <- length(grp_n) #builds the LLRA design matrix from scratch categos <- get_item_cats(X,nitems,grp_n) #trend effects design tr.des <- build_trdes(nitems,mpoints,pplgrps,categos) #tretment effects design gr.des <- build_effdes(nitems,mpoints,pplgrps,categos,groupvec) #category design if(length(unique(unlist(categos)))==1&&sum(unique(unlist(categos)))==1) return(cbind(gr.des,tr.des)) ct.des <- build_catdes(nitems,mpoints,pplgrps,categos) #all together now! des <-cbind(gr.des,tr.des,ct.des) des } eRm/R/plotPImap.R0000755000175100001440000001100314473216525013253 0ustar hornikusers`plotPImap` <- function(object, item.subset="all", sorted = FALSE, main="Person-Item Map", latdim="Latent Dimension", pplabel="Person\nParameter\nDistribution", cex.gen=0.7, xrange=NULL, warn.ord=TRUE, warn.ord.colour="black", irug=TRUE, pp=NULL) { def.par <- par(no.readonly = TRUE) # save default, for resetting... # Item-Person map currently only for RM, PCM and RSM if ((object$model == "LLTM") || (object$model == "LRSM") || (object$model == "LPCM")) stop("Item-Person Map are computed only for RM, RSM, and PCM!") # compute threshtable (from betapars for dichotomous models) and item names if (object$model == "RM" || max(object$X,na.rm=TRUE) < 2){ dRm <- TRUE threshtable<-cbind(object$betapar, object$betapar) * -1 # betapars are easiness parameteres rownames(threshtable)<-substring(rownames(threshtable), first=6, last=9999) } else { dRm <- FALSE threshtable<-thresholds(object)$threshtable[[1]] } tr<-as.matrix(threshtable) if (is.character(item.subset)){ if (length(item.subset)>1 && all(item.subset %in% rownames(threshtable))) tr<-tr[item.subset,] else if(length(item.subset)!=1 || !(item.subset=="all")) stop("item.subset misspecified. Use 'all' or vector of at least two valid item indices/names.") } else { if (length(item.subset)>1 && all(item.subset %in% 1:nrow(tr))) tr<-tr[item.subset,] else stop("item.subset misspecified. Use 'all' or vector of at least two valid item indices/names.") } if (sorted) tr<-tr[order(tr[,1],decreasing=FALSE),] loc<-as.matrix(tr[,1]) tr<-as.matrix(tr[,-1]) # person parameters unlist in case of several for NA groups if (is.null(pp)) suppressWarnings(pp<-person.parameter(object)) else if ((!("ppar" %in% class(pp))) || !identical(pp$X,object$X)) stop("pp is not a person.parameter object which matches the main Rasch data object!") theta<-unlist(pp$thetapar) tt<-table(theta) ttx<-as.numeric(names(tt)) yrange <- c(0,nrow(tr)+1) if (is.null(xrange)) xrange<-range(c(tr,theta),na.rm=T) nf <- layout(matrix(c(2,1),2,1,byrow=TRUE), heights = c(1,3), T)#, c(0,3), TRUE) #layout.show(nf) par(mar=c(2.5,4,0,1)) plot(xrange,yrange, xlim=xrange, ylim=yrange, main="", ylab="",type="n", yaxt="n", xaxt="n")#,cex.lab=0.7,lheight=0.1) axis(2,at=1:nrow(tr),labels=rev(rownames(tr)),las=2,cex.axis=cex.gen) axis(1,at=seq(floor(xrange[1]),ceiling(xrange[2])),cex.axis=cex.gen,padj=-1.5) mtext(latdim,1,1.2,cex=cex.gen+.1) #mtext("low",1,1,at=ceiling(xrange[2]),cex=.7) #mtext("high",1,1,at=floor(xrange[1]),cex=.7) ### BEGIN irug if(irug == TRUE){ y.offset <- nrow(tr)*.0275 tr.rug <- as.numeric(tr) if(any(is.na(tr.rug))) tr.rug <- tr.rug[-which(is.na(tr.rug))] segments(tr.rug,rep(yrange[2],length(tr.rug))+y.offset, tr.rug,rep(yrange[2],length(tr.rug))+100) } ### END irug warn<-rep(" ",nrow(tr)) for (j in 1:nrow(tr)){ i<-nrow(tr)+1-j assign("trpoints",tr[i,!is.na(tr[i,])]) npnts<-length(trpoints) if (!dRm && !all(sort(trpoints)==trpoints)) ptcol=warn.ord.colour else ptcol="black" if(npnts>1) points(sort(trpoints),rep(j,npnts),type="b",cex=1,col=ptcol) if (dRm) { lines(xrange*1.5,rep(j,2),lty="dotted") ## superfluous ##text(sort(trpoints),rep(j,npnts),rownames(tr)[i], cex=cex.gen,pos=3,col=ptcol) # different labelling for dRm } else { #lines(xrange*1.5,rep(j,2),lty="dotted") if(npnts>1) text(sort(trpoints),rep(j,npnts),(1:npnts)[order(trpoints)],cex=cex.gen,pos=1,col=ptcol) if(!all(sort(trpoints)==trpoints)) warn[j]<-"*" } points(loc[i],j,pch=20,cex=1.5,col=ptcol) # plot item locations # this is too much; obscures the dots with too many data points present # text(loc[i],j,rev(rownames(tr)[i]),cex=cex.gen,pos=3,col=ptcol) } if (warn.ord) axis(4,at=1:nrow(tr),tick=FALSE, labels=warn, hadj=2.5, padj=0.7, las=2)#,cex.axis=cex.gen) # person parameters par(mar=c(0,4,3,1)) #hist(theta,main=title,axes=FALSE, ylab="", xlim=xrange, col="lightgray") plot(ttx,tt,type="n", main=main, axes=FALSE, ylab="", xlim=xrange, ylim=c(0,max(tt))) points(ttx,tt,type="h", col="gray", lend=2,lwd=5) #axis(4) mtext(pplabel,2,0.5,las=2,cex=cex.gen) box() par(def.par) } eRm/R/ROCR_aux.R0000755000175100001440000000530714375241642013001 0ustar hornikusers## --------------------------------------------------------------------------- ## Dealing with argument lists, especially '...' ## --------------------------------------------------------------------------- ## return list of selected arguments, skipping those that ## are not present in arglist .select.args <- function( arglist, args.to.select, complement=FALSE) { match.bool <- names(arglist) %in% args.to.select if (complement==TRUE) match.bool <- !match.bool return( arglist[ match.bool] ) } ## return arguments in arglist which match prefix, with prefix removed ## ASSUMPTION: prefix is separated from rest by a '.'; this is removed along ## with the prefix .select.prefix <- function( arglist, prefixes, complement=FALSE ) { match.expr <- paste(paste('(^',prefixes,'\\.)',sep=""),collapse='|') match.bool <- (1:length(arglist)) %in% grep( match.expr, names(arglist) ) if (complement==TRUE) match.bool <- !match.bool arglist <- arglist[ match.bool] names(arglist) <- sub( match.expr, '', names(arglist)) return( arglist ) } .garg <- function( arglist, arg, i=1) { if (is.list(arglist[[arg]])) arglist[[ arg ]][[i]] else arglist[[ arg ]] } .sarg <- function( arglist, ...) { ll <- list(...) for (argname in names(ll) ) { arglist[[ argname ]] <- ll[[ argname ]] } return(arglist) } .farg <- function( arglist, ...) { ll <- list(...) for (argname in names(ll) ) { if (length(arglist[[argname]])==0) arglist[[ argname ]] <- ll[[ argname ]] } return(arglist) } .slice.run <- function( arglist, runi=1) { r <- lapply( names(arglist), function(name) .garg( arglist, name, runi)) names(r) <- names(arglist) r } ## --------------------------------------------------------------------------- ## Line segments ## --------------------------------------------------------------------------- .construct.linefunct <- function( x1, y1, x2, y2) { if (x1==x2) { stop("Cannot construct a function from data.") } lf <- eval(parse(text=paste("function(x) {", "m <- (",y2,"-",y1,") / (",x2,"-",x1,");", "c <- ",y1," - m * ",x1,";", "return( m * x + c)}",sep=" "))) lf } .intersection.point <- function( f, g ) { ## if lines are parallel, no intersection point if (f(1)-f(0) == g(1)-g(0)) { return( c(Inf,Inf) ) } ## otherwise, choose search interval imin <- -1 imax <- 1 while (sign(f(imin)-g(imin)) == sign(f(imax)-g(imax))) { imin <- 2*imin imax <- 2*imax } h <- function(x) { f(x) - g(x) } intersect.x <- uniroot( h, interval=c(imin-1,imax+1) )$root intersect.y <- f( intersect.x ) return( c(intersect.x, intersect.y )) } eRm/R/predict.ppar.R0000755000175100001440000000140214375241642013742 0ustar hornikuserspredict.ppar <- function(object, cutpoint = "randomized", ...) { # predict method for objects of class ppar # cutpoint ... either value between 0 and 1, or randomized assignment Pi <- pmat(object) #expected values X <- object$X.ex if (max(X, na.rm = TRUE) > 1) stop("Available for dichotomous models only!") K <- dim(X)[2] N <- dim(X)[1] y <- as.vector(t(X)) #observed values pi.hat <- as.vector(t(Pi)) if (cutpoint == "randomized") { pvec <- runif(length(y)) } else { pvec <- rep(cutpoint, length(y)) } classvec <- (pvec < pi.hat)*1 #expected 0/1 vector classmat <- matrix(classvec, ncol = K, nrow = N, byrow = TRUE) dimnames(classmat) <- list(rownames(X), colnames(X)) return(classmat) } eRm/R/confint.ppar.r0000755000175100001440000000077014375241642014017 0ustar hornikusersconfint.ppar <- function(object, parm, level = 0.95, ...) { #parm...either "beta" or "eta" #object of class "ppar" a <- (1 - level)/2 a <- c(a, 1 - a) pct <- paste(a*100,"%") fac <- qnorm(a) cf <- object$thetapar ses <- object$se.theta ci <- list(NULL) for (i in 1:length(cf)) { ci[[i]] <- array(NA, dim = c(length(cf[[i]]), 2), dimnames = list(names(object$thetapar[[i]]),pct)) ci[[i]][] <- cf[[i]] + ses[[i]] %o% fac } names(ci) <- paste("NAgroup",1:length(ci),sep="") ci }eRm/R/RSM.R0000755000175100001440000000352314375241642012016 0ustar hornikusers`RSM` <- function(X, W, se = TRUE, sum0 = TRUE, etaStart) { #...X: person*item scores matrix (starting from 0) #-------------------main programm------------------- call<-match.call() groupvec <- 1 mpoints <- 1 model <- "RSM" if (missing(W)) W <- NA else W <- as.matrix(W) if (missing(etaStart)) etaStart <- NA else etaStart <- as.vector(etaStart) XWcheck <- datcheck(X,W,mpoints,groupvec,model) #inital check of X and W X <- XWcheck$X lres <- likLR(X,W,mpoints,groupvec,model,st.err=se,sum0,etaStart) parest <- lres$parest #full groups for parameter estimation loglik <- -parest$minimum #log-likelihood value iter <- parest$iterations #number of iterations convergence <- parest$code etapar <- parest$estimate #eta estimates betapar <- as.vector(lres$W%*% etapar) #beta estimates if (se) { se.eta <- sqrt(diag(solve(parest$hessian))) #standard errors se.beta <- sqrt(diag(lres$W%*%solve(parest$hessian)%*%t(lres$W))) #se beta } else { se.eta <- rep(NA,length(etapar)) se.beta <- rep(NA,length(betapar)) } X01 <- lres$X01 labs <- labeling.internal(model,X,X01,lres$W,etapar,betapar,mpoints,max(groupvec)) #labeling for L-models W <- labs$W etapar <- labs$etapar betapar <- labs$betapar etapar <- -etapar # output difficulty rh 25-03-2010 npar <- dim(lres$W)[2] #number of parameters result <- list(X=X,X01=X01,model=model,loglik=loglik,npar=npar,iter=iter,convergence=convergence, etapar=etapar,se.eta=se.eta,hessian=parest$hessian,betapar=betapar, se.beta=se.beta,W=W,call=call) class(result) <- c("Rm","eRm") #classes: simple RM and extended RM result } eRm/R/pifit.internal.R0000755000175100001440000000410314375241642014276 0ustar hornikuserspifit.internal <- function(object){ #object of class ppar #function is called in itemfit.ppar and personfit.ppar X <- object[["X"]] mt_vek <- apply(X, 2L, max, na.rm = TRUE) # (number of categories - 1) for each item mt_ind <- rep(seq_along(mt_vek), mt_vek) # MjM 2014-07-11 mt_seq <- sequence(mt_vek) gmemb <- object$gmemb pmat <- pmat(object) #matrix with model probabilites #-----------------matrix with expected response patterns-------------- Emat.cat <- t(apply(pmat, 1L, function(x) x*mt_seq)) if(object$model %in% c("RM", "LLTM")){ Emat <- Emat.cat } else { E.list <- tapply(seq_along(mt_ind), mt_ind, function(ind){ rowSums(cbind(Emat.cat[, ind]), na.rm = TRUE) }) Emat <- matrix(unlist(E.list),ncol=dim(X)[2],dimnames=list(rownames(pmat),colnames(X))) } #------------------------variance term for standardized residuals------ pmat.l0 <- tapply(seq_along(mt_ind), mt_ind, function(ind){ vec0 <- 1-rowSums(as.matrix(pmat[,ind])) #prob for 0th category cbind(vec0,pmat[,ind]) }) pmat0 <- matrix(unlist(pmat.l0),nrow=length(gmemb)) #prob matrix 0th category included mt_vek0 <- integer(0) #add 0th category to all indices for (i in mt_vek) mt_vek0 <- c(mt_vek0, 0:i) mt_ind0 <- rep(1:length(mt_vek),mt_vek+1) colnames(Emat) <- NULL Emat0 <- t(apply(Emat[,mt_ind0],1,function(x) {mt_vek0 - x})) Vmat.cat <- (Emat0)^2*pmat0 V.list <- tapply(1:length(mt_ind0),mt_ind0, function(ind) {rowSums(Vmat.cat[,ind],na.rm=TRUE)}) Vmat <- matrix(unlist(V.list),ncol=dim(X)[2],dimnames=list(rownames(pmat),colnames(X))) #------------------------kurtosis term for standardized residuals------ Cmat.cat <- (Emat0)^4*pmat0 C.list <- tapply(1:length(mt_ind0),mt_ind0, function(ind) {rowSums(Cmat.cat[,ind],na.rm=TRUE)}) Cmat <- matrix(unlist(C.list),ncol=dim(X)[2],dimnames=list(rownames(pmat),colnames(X))) result <- list(Emat=Emat,Vmat=Vmat,Cmat=Cmat) } eRm/R/datcheck.LRtest.r0000755000175100001440000000405414375241642014377 0ustar hornikusersdatcheck.LRtest <- function(x, X, model) { #sanity checks for LRtest (internal function of LRtest.R) #x...submatrix (splitted with "splitcr" and called within Xlist) #X...original data matrix (from model fit) exclude <- NULL #vector with items to be excluded #----check full/0 responses------ n.NA <- colSums(apply(X,2,is.na)) #number of NA's per column maxri <- (dim(X)[1]*(apply(X,2,max,na.rm=TRUE)))-n.NA #maximum item raw scores with NA ri <- apply(x,2,sum,na.rm=TRUE) #item raw scores exclude <- c(exclude,which((ri==maxri) | (ri==0))) #----check full(-1) NA's--------- allna.vec <- apply(x,2,function(y) { naTF <- is.na(y) (sum(naTF) >= length(y-1)) }) exclude <- c(exclude,which(allna.vec)) #----minimum category = 0-------- ri.min <- apply(x,2,min,na.rm=TRUE) #if no 0 responses exclude <- c(exclude,which(ri.min!=0)) #----RSM-checks for same number of categories-------- if ((model == "RSM") || (model == "LRSM")) { highcat <- max(X, na.rm=TRUE) #highest category in original data highcat.sub <- apply(x,2,max,na.rm=TRUE) #RSM check for equal number of categories exclude <- c(exclude,which(highcat.sub != highcat)) } #---PCM checks for all categories responses--------- if ((model=="PCM") || (model=="LPCM")) { #check if there are missing categories for PCM (for RSM doesn't matter) cat.data <- apply(X,2,function(y) list(unique(na.exclude(y)))) #categories of orginal data cat.sub <- apply(x,2,function(y) list(unique(na.exclude(y)))) #categories of subgroup data catcomp <- mapply(function(y.s,y.d) { (length(y.s[[1]]) == (length(y.d[[1]]))) },cat.sub,cat.data) exclude <- c(exclude,which(!catcomp)) } return(unique(exclude)) #return vector with items to be eliminated }eRm/R/LLTM.R0000755000175100001440000000340514375241642012124 0ustar hornikusers`LLTM` <- function(X, W, mpoints = 1, groupvec = 1, se = TRUE, sum0 = TRUE, etaStart) { #...X: person*(item*times) matrix (T1|T2|...) model <- "LLTM" call<-match.call() if (missing(W)) W <- NA else W <- as.matrix(W) if (missing(etaStart)) etaStart <- NA else etaStart <- as.vector(etaStart) XWcheck <- datcheck(X,W,mpoints,groupvec,model) #inital check of X and W X <- XWcheck$X lres <- likLR(X,W,mpoints,groupvec,model,st.err=se,sum0,etaStart) parest <- lres$parest #full groups for parameter estimation loglik <- -parest$minimum #log-likelihood value iter <- parest$iterations #number of iterations convergence <- parest$code etapar <- parest$estimate #eta estimates betapar <- as.vector(lres$W%*% etapar) #beta estimates if (se) { se.eta <- sqrt(diag(solve(parest$hessian))) #standard errors se.beta <- sqrt(diag(lres$W%*%solve(parest$hessian)%*%t(lres$W))) #se beta } else { se.eta <- rep(NA,length(etapar)) se.beta <- rep(NA,length(betapar)) } X01 <- lres$X01 labs <- labeling.internal(model,X,X01,lres$W,etapar,betapar,mpoints,max(groupvec)) #labeling for L-models W <- labs$W etapar <- labs$etapar betapar <- labs$betapar npar <- dim(lres$W)[2] #number of parameters result <- list(X=X,X01=X01,model=model,loglik=loglik,npar=npar,iter=iter,convergence=convergence, etapar=etapar,se.eta=se.eta,hessian=parest$hessian,betapar=betapar, se.beta=se.beta,W=W,mpoints=mpoints,ngroups=max(groupvec),groupvec=groupvec,call=call) class(result) <- "eRm" #classes: simple RM and extended RM result } eRm/R/sim.rasch.R0000755000175100001440000000151714375241642013245 0ustar hornikuserssim.rasch <-function(persons, items, seed = NULL, cutpoint = "randomized") { #produces rasch homogeneous data #cutpoint... probability or "randomized" if (length(items) == 1) { if (!is.null(seed)) set.seed(seed) schwierig <- rnorm(items) #standard normal distributed n.items <- items } else { schwierig <- items n.items <- length(items) } if (length(persons) == 1) { if (!is.null(seed)) set.seed(seed) faehig <- rnorm(persons) n.persons <- persons } else { faehig <- persons n.persons <- length(persons) } fsmat <- outer(faehig, schwierig, "-") psolve <- exp(fsmat)/(1+exp(fsmat)) if (cutpoint == "randomized") { if (!is.null(seed)) set.seed(seed) R <-(matrix(runif(n.items*n.persons),n.persons,n.items) < psolve)*1 } else { R <- (cutpoint < psolve)*1 } return(R) } eRm/R/IC.default.R0000755000175100001440000000024314375241642013267 0ustar hornikusers`IC.default` <- function(object) # error message for using incorrect object { stop("IC() requires object of class 'ppar', obtained from person.parameter()") } eRm/R/print.wald.R0000755000175100001440000000056314375241642013440 0ustar hornikusers`print.wald` <- function(x,...) #print method for objects of class "wald" (from waldtest) { #if (!is.null(x$betalab)) { # cat("Warning Message: Item",x$betalab[1],"was not tested due to sum-0 restriction.\n") #} cat("\nWald test on item level (z-values):\n\n") print(round(x$coef.table,3)) cat("\n") invisible(round(x$coef.table,3)) } eRm/R/LPCM.R0000755000175100001440000000346614375241642012116 0ustar hornikusers`LPCM` <- function(X, W, mpoints = 1, groupvec = 1, se = TRUE, sum0 = TRUE, etaStart) { #-------------------main programm------------------- model <- "LPCM" call<-match.call() if (missing(W)) W <- NA else W <- as.matrix(W) if (missing(etaStart)) etaStart <- NA else etaStart <- as.vector(etaStart) XWcheck <- datcheck(X,W,mpoints,groupvec,model) #inital check of X and W groupvec <- XWcheck$groupvec X <- XWcheck$X lres <- likLR(X,W,mpoints,groupvec,model,st.err=se,sum0,etaStart) parest <- lres$parest #full groups for parameter estimation loglik <- -parest$minimum #log-likelihood value iter <- parest$iterations #number of iterations convergence <- parest$code etapar <- parest$estimate #eta estimates betapar <- as.vector(lres$W%*% etapar) #beta estimates if (se) { se.eta <- sqrt(diag(solve(parest$hessian))) #standard errors se.beta <- sqrt(diag(lres$W%*%solve(parest$hessian)%*%t(lres$W))) #se beta } else { se.eta <- rep(NA,length(etapar)) se.beta <- rep(NA,length(betapar)) } X01 <- lres$X01 labs <- labeling.internal(model,X,X01,lres$W,etapar,betapar,mpoints,max(groupvec)) #labeling for L-models W <- labs$W etapar <- labs$etapar betapar <- labs$betapar npar <- dim(lres$W)[2] #number of parameters result <- list(X=X,X01=X01,model=model,loglik=loglik,npar=npar,iter=iter,convergence=convergence, etapar=etapar,se.eta=se.eta,hessian=parest$hessian,betapar=betapar, se.beta=se.beta,W=W,mpoints=mpoints,ngroups=max(groupvec),groupvec=groupvec,call=call) class(result) <- "eRm" #classes: simple RM and extended RM result } eRm/R/rsextrobj.R0000755000175100001440000000141214473215451013370 0ustar hornikusers"rsextrobj" <- function(RSobj,start=1,end=8192) { obj.name <- deparse(substitute(RSobj)) if (!("RSmpl" %in% class(RSobj) || "RSmplext" %in% class(RSobj))){ err.text<-paste(obj.name," is not a sample object - see help(\"rsextrobj\")",sep ="",collapse="") stop(err.text) } n_tot <- RSobj$n_tot if (end>n_tot) end<-n_tot n <- RSobj$n k <- RSobj$k nwords <- c(trunc((k+31)/32)) objnew <- RSobj l_one_mat <- n*nwords b <- (start-1)*l_one_mat+1 e <- end*l_one_mat objnew$outvec <- RSobj$outvec[b:e] objnew$n_tot <- end-start+1 if (start==1) { objnew$n_eff <- objnew$n_tot - 1 } else { objnew$n_eff <- objnew$n_tot } class(objnew)="RSmplext" RET<-objnew RET } eRm/R/print.logLik.ppar.r0000755000175100001440000000034114375241642014725 0ustar hornikusers`print.logLik.ppar` <- function (x, digits = getOption("digits"),...) { cat("Unconditional (joint) log Lik.: ", format(x$loglik, digits = digits), " (df=", format(x$df), ")\n", sep = "") invisible(x) } eRm/R/logLik.eRm.r0000755000175100001440000000036114375241642013355 0ustar hornikuserslogLik.eRm <- function(object,...) { #object of class eRm # val <- object$loglik # attr(val, "df") <- object$npar val <- list(loglik = object$loglik, df = object$npar) # rh 26-03-2010 class(val) <- "logLik.eRm" val } eRm/R/residuals.ppar.R0000755000175100001440000000027214375241642014307 0ustar hornikusers`residuals.ppar` <- function(object,...) # computes standardized residuals # for object of class "ppar" (from person.parameter) { result <- itemfit(object)$st.res result } eRm/R/PCM.R0000755000175100001440000000352114375241642011772 0ustar hornikusers`PCM` <- function(X, W, se = TRUE, sum0 = TRUE, etaStart) { #...X: person*item scores matrix (starting from 0) #-------------------main programm------------------- call<-match.call() model <- "PCM" groupvec <- 1 mpoints <- 1 if (missing(W)) W <- NA else W <- as.matrix(W) if (missing(etaStart)) etaStart <- NA else etaStart <- as.vector(etaStart) XWcheck <- datcheck(X,W,mpoints,groupvec,model) #inital check of X and W X <- XWcheck$X lres <- likLR(X,W,mpoints,groupvec,model,st.err=se,sum0,etaStart) parest <- lres$parest #full groups for parameter estimation loglik <- -parest$minimum #log-likelihood value iter <- parest$iterations #number of iterations convergence <- parest$code etapar <- parest$estimate #eta estimates betapar <- as.vector(lres$W%*% etapar) #beta estimates if (se) { se.eta <- sqrt(diag(solve(parest$hessian))) #standard errors se.beta <- sqrt(diag(lres$W%*%solve(parest$hessian)%*%t(lres$W))) #se beta } else { se.eta <- rep(NA,length(etapar)) se.beta <- rep(NA,length(betapar)) } X01 <- lres$X01 labs <- labeling.internal(model,X,X01,lres$W,etapar,betapar,mpoints,max(groupvec)) #labeling for L-models W <- labs$W etapar <- labs$etapar betapar <- labs$betapar etapar <- -etapar # output difficulty rh 25-03-2010 npar <- dim(lres$W)[2] #number of parameters result <- list(X=X,X01=X01,model=model,loglik=loglik,npar=npar,iter=iter,convergence=convergence, etapar=etapar,se.eta=se.eta,hessian=parest$hessian,betapar=betapar, se.beta=se.beta,W=W,call=call) class(result) <- c("Rm","eRm") #classes: simple RM and extended RM result } eRm/R/Rsquared.R0000755000175100001440000000151414375241642013141 0ustar hornikusersRsquared <- function(object, pi.hat) { # objects of class ppar # computes Pearson R^2 and SS R^2 for objects of class ppar #Pi <- pmat(object) #expected values if (length(object$pers.ex) > 0){ y <- as.vector(t(object$X[-object$pers.ex,])) #observed values } else { y <- as.vector(t(object$X)) } pi.hat <- as.vector(t(pi.hat)) R.P <- cor(y, pi.hat)^2 #Squared Pearson correlation R.SS <- 1-(sum((y - pi.hat)^2)/sum((y - mean(y))^2)) #SS-R^2 loglik.full <- sum(y*log(pi.hat) + (1-y)*log(1-pi.hat), na.rm = TRUE) #full likelihood loglik.0 <- sum(y*log(mean(y)) + (1-y)*log(1-mean(y))) #L0 (Agresti, Sec. 6.2.5) R.MF <- (loglik.0 - loglik.full)/loglik.full result <- list(R2.P = R.P, R2.SS = R.SS, R2.MF = R.MF) result }eRm/R/plist.internal.R0000755000175100001440000000145614375241642014326 0ustar hornikusers# computes a list of expected probabilities for objects of class Rm # with 0th category included! plist.internal <- function(object, theta){ X <- object$X mt_vek <- apply(X, 2L, max, na.rm = TRUE) # number of categories - 1 for each item mt_ind <- rep(seq_along(mt_vek), mt_vek) #--------compute list matrix of probabilites for fixed theta) p.list <- tapply(object$betapar, mt_ind, function(beta.i){ beta.i <- c(0, beta.i) ind.h <- 0:(length(beta.i)-1) theta.h <- tcrossprod(ind.h, theta) # ind.h %*% t(theta) # multiply category with tb <- exp(theta.h + beta.i) denom <- colSums(tb) pi.mat <- apply(tb, 1L, function(y){ y/denom }) return(pi.mat) }) return(p.list) } eRm/R/summary.eRm.R0000755000175100001440000000347614375241642013603 0ustar hornikusers`summary.eRm` <- function(object,...) { #labels...whether the item parameters should be labelled cat("\n") cat("Results of",object$model,"estimation: \n") cat("\n") cat("Call: ", deparse(object$call), "\n") cat("\n") cat("Conditional log-likelihood:",object$loglik,"\n") cat("Number of iterations:",object$iter,"\n") cat("Number of parameters:",object$npar,"\n") cat("\n") X <- object$X X01 <- object$X01 mt_vek <- apply(X,2,max,na.rm=TRUE) ci <- confint(object,"eta") # eta parameters: if (object$model %in% c("RM","RSM","PCM")) # now difficulty for RM, RSM, PCM if(is.null(object$call$W)){ # labelling based on whether W was specified mm 2012-05-02 cat("Item (Category) Difficulty Parameters (eta):") # new labelling rh 25-03-2010 } else { cat("Item (Category) Parameters (eta):\nBased on design matrix W =", deparse(object$call$W)) } else cat("Basic Parameters eta") cat(" with 0.95 CI:\n") coeftable <- as.data.frame(cbind(round(object$etapar,3), round(object$se.eta,3),round(ci,3))) colnames(coeftable) <- c("Estimate","Std. Error","lower CI","upper CI") rownames(coeftable) <- names(object$etapar) print(coeftable) ci <- confint(object,"beta") cat("\nItem Easiness Parameters (beta) with 0.95 CI:\n") #coeftable <- as.data.frame(cbind(round(object$betapar),3), # round(object$se.beta,3),round(ci,3)) coeftable <- cbind(round(object$betapar,3), round(object$se.beta,3), round(ci,3)) colnames(coeftable) <- c("Estimate","Std. Error","lower CI","upper CI") rownames(coeftable) <- names(object$betapar) print(coeftable) cat("\n") } eRm/R/summary.RSmpl.R0000755000175100001440000000075214375241642014107 0ustar hornikusers"summary.RSmpl" <- function(object,...) { cat("\nStatus of object",deparse(substitute(object)),"after call to RSampler:\n") cat("\tn =",object$n,"\n") cat("\tk =",object$k,"\n") cat("\tburn_in =",object$burn_in,"\n") cat("\tn_eff =",object$n_eff,"\n") cat("\tstep =",object$step,"\n") cat("\tseed =",object$seed,"\n") cat("\ttfixed =",object$tfixed,"\n") cat("\tn_tot =",object$n_tot,"\n") cat("\toutvec contains",length(object$outvec),"elements\n\n") } eRm/R/summary.RSmplext.R0000755000175100001440000000075014375241642014626 0ustar hornikusers"summary.RSmplext" <- function(object,...) { cat("\nStatus of extracted object ",deparse(substitute(object)),":\n", sep="") cat("\tn =",object$n,"\n") cat("\tk =",object$k,"\n") cat("\tburn_in =",object$burn_in,"\n") cat("\tn_eff =",object$n_eff,"\n") cat("\tstep =",object$step,"\n") cat("\tseed =",object$seed,"\n") cat("\ttfixed =",object$tfixed,"\n") cat("\tn_tot =",object$n_tot,"\n") cat("\toutvec contains",length(object$outvec),"elements\n\n") } eRm/R/print.summary.llra.R0000755000175100001440000000125114375241642015132 0ustar hornikusers print.summary.llra <- function(x,...) { cat("\n") cat("Results of LLRA via",x$model,"estimation: \n") cat("\n") cat("Call: ", x$call, "\n") cat("\n") cat("Conditional log-likelihood:", x$loglik, "\n") cat("Number of iterations:", x$iter, "\n") cat("Number of parameters:", x$npar, "\n") cat("\n") cat("Estimated parameters ") cat("with 0.95 CI:\n") coeftable <- as.data.frame(cbind(round(x$etapar, 3),round(x$se.eta, 3), round(x$ci, 3))) colnames(coeftable) <- c("Estimate", "Std.Error", "lower.CI", "upper.CI") rownames(coeftable) <- names(x$etapar) print(coeftable) cat("\nReference Group: ",x$refGroup,"\n") } eRm/R/print.threshold.r0000755000175100001440000000036314375241642014543 0ustar hornikusersprint.threshold <- function(x,...) { cat("\n") for (i in 1:length(x$threshtable)) { cat("Design Matrix Block ",i,":\n",sep="") print(round(x$threshtable[[i]],5)) cat("\n") } invisible(x$threshtable) }eRm/R/print.eRm.R0000755000175100001440000000224214375241642013230 0ustar hornikusers`print.eRm` <- function(x,...) { #print method for all models cat("\n") cat("Results of", x$model, "estimation: \n") cat("\n") cat("Call: ", deparse(x$call), "\n") cat("\n") cat("Conditional log-likelihood:", x$loglik, "\n") cat("Number of iterations:", x$iter, "\n") cat("Number of parameters:", x$npar, "\n") cat("\n") if (x$model %in% c("RM","RSM","PCM")) #eta parameters if(is.null(x$call$W)){ # labelling based on whether W was specified mm 2012-05-02 cat("Item (Category) Difficulty Parameters (eta):") # new labelling rh 25-03-2010 } else { cat("Item (Category) Parameters (eta):\nBased on design matrix W =", deparse(x$call$W)) } else # now difficulty for RM, RSM, PCM cat("Basic Parameters eta:") cat("\n") etapar <- x$etapar #nameeta <- paste("eta",1:dim(x$W)[2]) se <- x$se.eta result <- rbind(etapar, se) #colnames(result) <- nameeta rownames(result) <- c("Estimate", "Std.Err") print(result) cat("\n\n") invisible(result) } eRm/R/model.matrix.eRm.R0000755000175100001440000000012714375241642014477 0ustar hornikusers`model.matrix.eRm` <- function(object,...) object$W #design matrix eRm/R/summary.gof.R0000755000175100001440000000151214375241642013620 0ustar hornikuserssummary.gof <- function(object, ...) { #summary method for objects of class "gof" (from gofIRT.ppar) cat("\nGoodness-of-Fit Tests\n") print(round(object$test.table, 3)) cat("\nR-Squared Measures") cat("\nPearson R2:", round(object$R2$R2.P, 3)) cat("\nSum-of-Squares R2:", round(object$R2$R2.SS, 3)) cat("\nMcFadden R2:", round(object$R2$R2.MF, 3)) cat("\n\nClassifier Results - Confusion Matrix (relative frequencies)\n") print(round(object$classifier$confmat/sum(object$classifier$confmat), 3)) cat("\nAccuracy:", round(object$classifier$accuracy, 3)) cat("\nSensitivity:", round(object$classifier$sensitivity, 3)) cat("\nSpecificity:", round(object$classifier$specificity, 3)) cat("\nArea under ROC:", round(object$AUC, 3)) cat("\nGini coefficient:", round(object$Gini, 3)) cat("\n\n") }eRm/R/print.logLik.eRm.R0000755000175100001440000000033014375241642014444 0ustar hornikusers`print.logLik.eRm` <- function (x, digits = getOption("digits"),...) { cat("Conditional log Lik.: ", format(x$loglik, digits = digits), " (df=", format(x$df), ")\n", sep = "") invisible(x) } eRm/R/item_info.R0000755000175100001440000000747114473203752013333 0ustar hornikusersi_info<-function(hvec,itembeta,theta) ## calculates information (Samejima, 1969. Eq. 6-6 second line) for an item i as a function of theta ## Has internal function for getting the value and first and sewcond derivatives of the PCM for values of latent traits #@input: hvec...number of categories of item # itembeta...cumulative item parameters # theta ... supporting or sampling points on latent trait #@output: a list with # $c.info...matrix of category information with categories in columns and values of theta (rows) (Samejima 1969, Eq. 6-6, first line) # $i.info...vector of item information at values of theta (Samejima 1969, Eq. 6-6, second line) #@author: Thomas Rusch #@date: 9.8.2023 # { if(missing(theta)) theta <-seq(-5,5,0.01) p.ih<-function(hvec,itembeta,theta) #Calculates p.ih, first and second derviative of p.ih of a PCM for given item i #needs categories given (hvec) and the cumulative item parameters of the item (itembeta) #@output: a list with # $p.ih...matrix of probabilities to fall into category h (colums) for given items as a function of theta (rows). # $dp.ih ...the first derivative # $d2p.ih ...the second derivative { beta <- c(0,itembeta) #eRm gives itempar with first fixed to zero numerator<-exp(outer(hvec,theta)+beta) #Numerator of the PCM, exp(h theta+b_ih) with each row being one h and columns being the theta values tmp<-hvec*numerator # h * exp(h theta+b_ih) (each row being a different h) and columns being the theta values tmp2<-hvec^2*numerator # h^2 * exp(h theta+b_ih) (each row being a different h) and columns being the theta values atheta <- apply(tmp,2,sum) #a(theta)=sum_l l exp(l*theta+beta_il) (so summed over categories) and number of elements being the thetas btheta <- apply(numerator,2,sum) #b(theta)=sum_l exp(l*theta+beta_il) (so summed over categories) dtheta <- apply(tmp2,2,sum) #d(theta)=sum_l l^2 exp(l*theta+beta_il) (so summed over categories) pih<-t(numerator)/btheta #now categories in column, thetas in rows dpih <- t(hvec*t(pih))- pih*(atheta/btheta) #first derivative: hPih - Pih a(theta)/b(theta) d2pih <- t(hvec^2*t(pih)) - 2*t(hvec*t(pih))*(atheta/btheta)+ 2*pih*(atheta^2/btheta^2)-pih*(dtheta/btheta) return(list("pih"=pih,"dpih"=dpih,"d2pih"=d2pih)) } tempus <- p.ih(hvec,itembeta,theta) c.info <- tempus$dpih^2/tempus$pih-tempus$d2pih #calculates category info (columns) for all theta(rows) i.info <-apply(c.info,1,sum) # calculates iteminfo for all theta(rows) return(list("c.info"=c.info,"i.info"=i.info)) } item_info <- function(ermobject,theta=seq(-5,5,0.01)) ##Calculates information (Samejima, 1969) of all items as a function of the latent trait, theta # ermobject ... object of class eRm # theta ... supporting or sampling points on latent trait #@output: a list where each element corresponds to an item and contains # $c.info...matrix of category information with categories in columns and values of theta (rows) # $i.info...vector of item information at values of theta #@author: Thomas Rusch #@date:13.6.2011 # { vec.tmp <- get_item_cats(X=ermobject$X,nitems=dim(ermobject$X)[2],grp_n=dim(ermobject$X)[1]) betapar <- ermobject$betapar veco <- unlist(lapply(vec.tmp,max)) alloc.list<-vector("list",length(veco)) hvec.list <- vector("list",length(veco)) out.list <- vector("list",length(veco)) for (i in 1:length(veco)) { alloc.list[[i]] <- rep(i,veco[i]) hvec.list[[i]] <- seq(0,veco[i]) } uu<-unlist(alloc.list) itembeta.list <- split(betapar,uu) for (i in 1:length(itembeta.list)) { out.list[[i]] <- i_info(hvec.list[[i]],itembeta.list[[i]],theta) #patch } return(out.list) } eRm/R/summary.llra.R0000755000175100001440000000112214375241642013774 0ustar hornikuserssummary.llra <- function(object, ...) UseMethod("summary.llra") summary.llra <- function(object, level=0.95, ...) #summary for class llra { modi <- object$model calli <- deparse(object$call) logli <- object$loglik iti <- object$iter pari <- object$npar cii <- confint(object, "eta", level=level) se.eta <- object$se.eta names(se.eta) <- names(object$etapar) res <- list(etapar=object$etapar,se.eta=se.eta,ci=cii,iter=iti,model=modi,call=calli,npar=pari,loglik=logli,refGroup=object$refGroup) class(res) <- "summary.llra" res } eRm/R/invalid.R0000755000175100001440000000044214375241642013000 0ustar hornikusers# $Id: invalid.R 625 2005-06-09 14:20:30Z nj7w $ invalid <- function(x) { if( missing(x) || is.null(x) || length(x)==0 ) return(TRUE) if(is.list(x)) return(all(sapply(x,invalid))) else if(is.vector(x)) return(all(is.na(x))) else return(FALSE) } eRm/R/print.step.r0000755000175100001440000000101714375241642013517 0ustar hornikusersprint.step <- function(x, ...) { cat("\nResults for stepwise item elimination:\n") cat("Number of steps:",x$nsteps,"\n") if (!is.null(x$res.wald)) { cat("Criterion: Waldtest\n\n") print(round(x$res.wald, 3)) cat("\n") } if (!is.null(x$res.itemfit)) { cat("Criterion: Itemfit\n\n") print(round(x$res.itemfit, 3)) cat("\n") } if (!is.null(x$res.LR)) { cat("Criterion: Andersen's LR-test\n\n") print(round(x$res.LR, 3)) cat("\n") } invisible(x) }eRm/R/sim.xdim.R0000755000175100001440000000314514375241642013105 0ustar hornikuserssim.xdim <- function(persons, items, Sigma, weightmat, seed = NULL, cutpoint = "randomized") { # Sigma ... VC matrix for multinormal distribution # weightmat ... matrix of dimension k times D with weights. If omitted, equal weights are used. if (missing(Sigma)) { ndim <- ncol(persons) } else { ndim <- nrow(Sigma) #number of dimensions } if (length(persons) == 1) { #simulating if (!is.null(seed)) set.seed(seed) faehig <- mvrnorm(persons, mu = rep(0, nrow(Sigma)), Sigma = Sigma) } else { faehig <- persons } if (length(items) == 1) { if (!is.null(seed)) set.seed(seed) schwierig <- rnorm(items) } else { schwierig <- items } n.persons <- nrow(faehig) n.items <- length(schwierig) if (missing(weightmat)) { #specifying the weight matrix weightmat <- matrix(0, ncol = ndim, nrow = n.items) if (!is.null(seed)) set.seed(seed) indvec <- sample(1:ndim, n.items, replace = TRUE) for (i in 1:n.items) weightmat[i,indvec[i]] <- 1 } Wp <- apply(weightmat, 1, function(wi) { #n.persons times n.items matrix Xw <- t(wi) %*% t(faehig)}) psolve <- matrix(0,n.persons,n.items) #class<-rep(1,n.persons) #class[sample(n.persons)[1:round(n.persons/2,0)]]<-2 for (j in 1:n.items) for (i in 1:n.persons) psolve[i,j] <- exp(Wp[i,j]-schwierig[j])/(1+ exp(Wp[i,j]-schwierig[j])) if (cutpoint == "randomized") { if (!is.null(seed)) set.seed(seed) R <-(matrix(runif(n.items*n.persons),n.persons,n.items) < psolve)*1 } else { R <- (cutpoint < psolve)*1 } return(R) } eRm/R/datprep_LLTM.R0000755000175100001440000000460314375241642013644 0ustar hornikusers`datprep_LLTM` <- function(X,W,mpoints,Groups,sum0) { # Design matrix see Fischer & Molenaar, p. 159 #TFrow <- (rowSums(X)==0 | rowSums(X)==(dim(X)[2])) #el. persons with 0/K rawscore #X <- X[!TFrow,] ngroups <- max(Groups) X01 <- X N <- dim(X)[1] #number of persons K <- dim(X)[2]/mpoints #number of items mt_vek <- rep(1,K) #automatized generation of the design matrix W if (length(W)==1) { W11diag <- diag(1,(sum(mt_vek)-1)) #build up design matrix if (sum0) { w110 <- rep(-1,(sum(mt_vek)-1)) #sum0 restriction } else { w110 <- rep(0,(sum(mt_vek)-1)) #first item category parameter set to 0 } W11 <- rbind(w110,W11diag) #RM design matrix ZW <- dim(W11)[1] W1 <- NULL for (i in 1:(mpoints*ngroups)) W1 <- rbind(W1,W11) #first part with virtual items if (mpoints > 1) { #more than 1 measurement points if (ngroups > 1) { #more than 1 group/more mpoints t_mp1 <- rep(1:mpoints,rep(ZW*ngroups,mpoints)) t_mp <- factor(t_mp1) g_ng1 <- rep(rep(1:ngroups,rep(ZW,ngroups)),mpoints) g_ng <- factor(g_ng1) W2 <- model.matrix(~t_mp+g_ng)[,-1] #main effects g and mp W2[1:(ZW*ngroups),] <- 0 #remove main effects for the first test occasion } else { #1 group/more mpoints t_mp <- gl(mpoints,ZW) #factor for measurement points W2 <- model.matrix(~t_mp)[,-1] } } else if (ngroups > 1) { #1 mpoint/more groups g_ng <- gl(ngroups,ZW) W2 <- model.matrix(~g_ng)[,-1] warning("Group contrasts without repeated measures can not be estimated!") } else if (ngroups == 1) W2 <- NULL #1 mpoint/1 group W <- cbind(W1,W2) colnames(W) <- NULL rownames(W) <- NULL } list(X=X,X01=X01,mt_vek=mt_vek,W=W) #Output: X01 ... 0/1 response matrix of dimension N*rtot # mt_vek ... vector of length K with number of categories - 1 (for each item) # W ... design matrix of dimension (K*T)*((K-1)*(T-1)+1) } eRm/R/rsctrl.R0000755000175100001440000000074614375241642012672 0ustar hornikusers"rsctrl" <- function(burn_in=100, n_eff=100, step=16, seed=0, tfixed=FALSE) { ier <- 0 if(n_eff < 0 | n_eff > 8191) ier <- ier + 4 if(burn_in < 0) ier <- ier + 8 if(step <= 0) ier <- ier + 16 if(seed < 0 | seed > (2**31-2)) ier <- ier + 128 if (ier>0) rserror(ier) RET<-list(burn_in=burn_in, n_eff=n_eff, step=step, seed=seed, tfixed=tfixed) class(RET)<-"RSctr" RET } eRm/R/gofIRT.ppar.R0000755000175100001440000000540414375241642013450 0ustar hornikusersgofIRT.ppar <- function(object, groups.hl = 10, cutpoint = 0.5) { #S3 method for computing 3 deviances and hosmer-lemeshow test #object ... object of class ppar #ngroups.hl ... number of percentile groups for Hosmer-Lemeshow Test if (max(object$X, na.rm = TRUE) > 1) stop("Tests for polytomous models not implemented yet!") if (any(is.na(object$X))) stop("Test for data with missings not implemented yet!") pi.hat <- pmat(object) groups.cldev <- "rawscore" #---------------- compute test statistics ---------------------------- res.cl <- unlist(cldeviance(object, groups.gr = groups.cldev, pi.hat = pi.hat)) res.hl <- unlist(hoslem(object, groups.hl = groups.hl, pi.hat = pi.hat)) res.rost <- unlist(rostdeviance(object)) res.cw <- unlist(cwdeviance(object, pi.hat)) res.table <- rbind(res.cl, res.hl, res.rost, res.cw) colnames(res.table) <- c("value","df","p-value") rownames(res.table) <- c("Collapsed Deviance", "Hosmer-Lemeshow", "Rost Deviance", "Casewise Deviance") #------------------- end test statistics ---------------------------- #---------------------- R-squared ----------------------------------- res.r2 <- Rsquared(object, pi.hat = pi.hat) #---------------------- end R-squared ------------------------------- #--------------------------- classifier stuff ----------------------- pred.X <- predict(object, cutpoint = cutpoint) #predicted data matrix observed <- as.vector(object$X.ex) predicted <- as.vector(pred.X) confmat <- table(predicted, observed) accuracy <- sum(diag(confmat))/sum(confmat) sens <- as.vector((confmat[2,2])/(colSums(confmat)[2])) spez <- as.vector((confmat[1,1])/(colSums(confmat)[1])) cl.list <- list(confmat = confmat, accuracy = accuracy, sensitivity = sens, specificity = spez) probvec <- as.vector(pi.hat) rocpr.res <- prediction(probvec[!is.na(probvec)], observed[!is.na(observed)]) roc.res <- performance(rocpr.res, "tpr","fpr") #produce ROC output spezvec <- 1-(roc.res@x.values[[1]]) #vector of specificities (different cuts) sensvec <- roc.res@y.values[[1]] #vector of sensitivities (different cuts) cutvec <- roc.res@alpha.values[[1]] #vector with thresholds sscmat <- cbind(cutvec, sensvec - spezvec)[order(abs(sensvec-spezvec), decreasing = FALSE),] thresh.opt <- mean(sscmat[1:2,1]) auc.all <- performance(rocpr.res, "auc") #area under ROC auc.res <- auc.all@y.values[[1]] gini <- (2*auc.res)-1 #----------------------- end classifier ---------------------------------- result <- list(test.table = res.table, R2 = res.r2, classifier = cl.list, AUC = auc.res, Gini = gini, ROC = roc.res, opt.cut = thresh.opt, predobj = rocpr.res) class(result) <- "gof" result } eRm/R/sim.locdep.R0000755000175100001440000000322214375241642013406 0ustar hornikuserssim.locdep <- function(persons, items, it.cor = 0.25, seed = NULL, cutpoint = "randomized") { # simulating data according to the local dependence model by Jannarone (1986) # it.cor represents the pairwise item correlation. If it is a single value, it is constant over all items, # otherwise a symmetric matrix of dimension n.items x n.items # it.cor = 1 reflects strong violation, it.cor = 0 corresponds to the Rasch model. if (length(items) == 1) { if (!is.null(seed)) set.seed(seed) schwierig <- rnorm(items) #standard normal distributed n.items <- items } else { schwierig <- items n.items <- length(items) } if (length(persons) == 1) { if (!is.null(seed)) set.seed(seed) faehig <- rnorm(persons) n.persons <- persons } else { faehig <- persons n.persons <- length(persons) } if (is.matrix(it.cor)) { #if (dim(it.cor)!= c(n.items, n.items)) stop("it.cor must be symmetric and of dimension number of items") delta <- it.cor } else { delta <- matrix(it.cor, ncol = n.items, nrow = n.items) } Loesprob<-matrix(0,n.persons,n.items) if (!is.null(seed)) set.seed(seed) Random.numbers<-matrix(runif(n.items*n.persons),n.persons,n.items) R<-matrix(-5,n.persons,n.items) for (j in 1:n.items) { for (i in 1:n.persons) { if ((j %% 2) == 0) { Loesprob[i,j]<-exp(faehig[i]-schwierig[j]+(R[i,j-1]-0.5)*delta[j,j-1])/(1+exp(faehig[i]-schwierig[j]+(R[i,j-1]-0.5)*delta[j,j-1])) } else { Loesprob[i,j]<-exp(faehig[i]-schwierig[j])/(1+exp(faehig[i]-schwierig[j])) }} R[,j]<-(Random.numbers[,j] 0L){ # remove obs. to be excluded, but X <- object$X[-excl_obs_num,] # store information to use in } else { # subsequent functions X <- object$X # } # VE <- pifit.internal(object) # compute expectation and variance term Emat <- VE$Emat Vmat <- VE$Vmat Cmat <- VE$Cmat st.res <- (X-Emat)/sqrt(Vmat) #st.res <- (X[!TFrow,]-Emat)/sqrt(Vmat) sq.res <- st.res^2 #squared standardized residuals pfit <- rowSums(sq.res,na.rm=TRUE) pdf <- apply(X, 1L, function(x){ length(na.exclude(x)) }) #pdf <- apply(X[!TFrow,],1,function(x) {length(na.exclude(x))}) #degress of freedom (#of persons per item) p.outfitMSQ <- pfit/pdf qsq.outfitMSQ <- (rowSums(Cmat/Vmat^2, na.rm=TRUE)/pdf^2) - 1/pdf q.outfitMSQ <- sqrt(qsq.outfitMSQ) psumVmat<-rowSums(Vmat) p.infitMSQ <- rowSums(sq.res*Vmat, na.rm = TRUE)/psumVmat qsq.infitMSQ <- rowSums(Cmat-Vmat^2, na.rm=TRUE)/psumVmat^2 q.infitMSQ <- sqrt(qsq.infitMSQ) p.outfitZ <- ((p.outfitMSQ)^(1/3)-1)*(3/q.outfitMSQ)+(q.outfitMSQ/3) p.infitZ <- ((p.infitMSQ)^(1/3)-1)*(3/q.infitMSQ)+(q.infitMSQ/3) result <- structure( list("p.fit" = pfit, "p.df" = pdf, "st.res" = st.res, "p.outfitMSQ" = p.outfitMSQ, "p.infitMSQ" = p.infitMSQ, "p.outfitZ" = p.outfitZ, "p.infitZ" = p.infitZ, "excl_obs_num" = excl_obs_num, "excl_obs_chr" = excl_obs_chr), class = "pfit") return(result) } eRm/R/prediction.R0000755000175100001440000001500614375241642013514 0ustar hornikusersprediction <- function(predictions, labels, label.ordering=NULL) { ## bring 'predictions' and 'labels' into list format, ## each list entry representing one x-validation run ## convert predictions into canonical list format if (is.data.frame(predictions)) { names(predictions) <- c() predictions <- as.list(predictions) } else if (is.matrix(predictions)) { predictions <- as.list(data.frame(predictions)) names(predictions) <- c() } else if (is.vector(predictions) && !is.list(predictions)) { predictions <- list(predictions) } else if (!is.list(predictions)) { stop("Format of predictions is invalid.") } ## if predictions is a list -> keep unaltered ## convert labels into canonical list format if (is.data.frame(labels)) { names(labels) <- c() labels <- as.list( labels) } else if (is.matrix(labels)) { labels <- as.list( data.frame( labels)) names(labels) <- c() } else if ((is.vector(labels) || is.ordered(labels) || is.factor(labels)) && !is.list(labels)) { labels <- list( labels) } else if (!is.list(labels)) { stop("Format of labels is invalid.") } ## if labels is a list -> keep unaltered ## Length consistency checks if (length(predictions) != length(labels)) stop(paste("Number of cross-validation runs must be equal", "for predictions and labels.")) if (! all(sapply(predictions, length) == sapply(labels, length))) stop(paste("Number of predictions in each run must be equal", "to the number of labels for each run.")) ## only keep prediction/label pairs that are finite numbers for (i in 1:length(predictions)) { finite.bool <- is.finite( predictions[[i]] ) predictions[[i]] <- predictions[[i]][ finite.bool ] labels[[i]] <- labels[[i]][ finite.bool ] } ## abort if 'labels' format is inconsistent across ## different cross-validation runs label.format="" ## one of 'normal','factor','ordered' if (all(sapply( labels, is.factor)) && !any(sapply(labels, is.ordered))) { label.format <- "factor" } else if (all(sapply( labels, is.ordered))) { label.format <- "ordered" } else if (all(sapply( labels, is.character)) || all(sapply( labels, is.numeric)) || all(sapply( labels, is.logical))) { label.format <- "normal" } else { stop(paste("Inconsistent label data type across different", "cross-validation runs.")) } ## abort if levels are not consistent across different ## cross-validation runs if (! all(sapply(labels, levels)==levels(labels[[1]])) ) { stop(paste("Inconsistent factor levels across different", "cross-validation runs.")) } ## convert 'labels' into ordered factors, aborting if the number ## of classes is not equal to 2. levels <- c() if ( label.format == "ordered" ) { if (!is.null(label.ordering)) { stop(paste("'labels' is already ordered. No additional", "'label.ordering' must be supplied.")) } else { levels <- levels(labels[[1]]) } } else { if ( is.null( label.ordering )) { if ( label.format == "factor" ) levels <- sort(levels(labels[[1]])) else levels <- sort( unique( unlist( labels))) } else { ## if (!setequal( levels, label.ordering)) { if (!setequal( unique(unlist(labels)), label.ordering )) { stop("Label ordering does not match class labels.") } levels <- label.ordering } for (i in 1:length(labels)) { if (is.factor(labels)) labels[[i]] <- ordered(as.character(labels[[i]]), levels=levels) else labels[[i]] <- ordered( labels[[i]], levels=levels) } } if (length(levels) != 2) { message <- paste("Number of classes is not equal to 2.\n", "ROCR currently supports only evaluation of ", "binary classification tasks.",sep="") stop(message) } ## determine whether predictions are continuous or categorical ## (in the latter case stop; scheduled for the next ROCR version) if (!is.numeric( unlist( predictions ))) { stop("Currently, only continuous predictions are supported by ROCR.") } ## compute cutoff/fp/tp data cutoffs <- list() fp <- list() tp <- list() fn <- list() tn <- list() n.pos <- list() n.neg <- list() n.pos.pred <- list() n.neg.pred <- list() for (i in 1:length(predictions)) { n.pos <- c( n.pos, sum( labels[[i]] == levels[2] )) n.neg <- c( n.neg, sum( labels[[i]] == levels[1] )) ans <- .compute.unnormalized.roc.curve( predictions[[i]], labels[[i]] ) cutoffs <- c( cutoffs, list( ans$cutoffs )) fp <- c( fp, list( ans$fp )) tp <- c( tp, list( ans$tp )) fn <- c( fn, list( n.pos[[i]] - tp[[i]] )) tn <- c( tn, list( n.neg[[i]] - fp[[i]] )) n.pos.pred <- c(n.pos.pred, list(tp[[i]] + fp[[i]]) ) n.neg.pred <- c(n.neg.pred, list(tn[[i]] + fn[[i]]) ) } return( new("prediction", predictions=predictions, labels=labels, cutoffs=cutoffs, fp=fp, tp=tp, fn=fn, tn=tn, n.pos=n.pos, n.neg=n.neg, n.pos.pred=n.pos.pred, n.neg.pred=n.neg.pred)) } ## fast fp/tp computation based on cumulative summing .compute.unnormalized.roc.curve <- function( predictions, labels ) { ## determine the labels that are used for the pos. resp. neg. class : pos.label <- levels(labels)[2] neg.label <- levels(labels)[1] pred.order <- order(predictions, decreasing=TRUE) predictions.sorted <- predictions[pred.order] tp <- cumsum(labels[pred.order]==pos.label) fp <- cumsum(labels[pred.order]==neg.label) ## remove fp & tp for duplicated predictions ## as duplicated keeps the first occurrence, but we want the last, two ## rev are used. ## Highest cutoff (Infinity) corresponds to tp=0, fp=0 dups <- rev(duplicated(rev(predictions.sorted))) tp <- c(0, tp[!dups]) fp <- c(0, fp[!dups]) cutoffs <- c(Inf, predictions.sorted[!dups]) return(list( cutoffs=cutoffs, fp=fp, tp=tp )) } eRm/R/summary.PersonMisfit.R0000755000175100001440000000116614375241642015474 0ustar hornikusers# ========================================================================== # use summary function to return percentage of misfitting person of object x # ========================================================================== summary.MisfittingPersons <- function(object, ...) # summary method for object of class "MisfittingPersons" # x = object of class "MisfittingPersons" { cat("\n") cat(" Percentage of Misfitting Persons:", "\n", round(object$PersonMisfit,4), "%", "\n") cat(" (i.e.,", object$count.misfit.Z, "out of", object$total.persons, "persons have Chi-square based Z-values > 1.96)") cat("\n") } eRm/R/itemfit.R0000755000175100001440000000006614375241642013015 0ustar hornikusers`itemfit` <- function(object)UseMethod("itemfit") eRm/R/personfit.R0000755000175100001440000000007214375241642013362 0ustar hornikusers`personfit` <- function(object)UseMethod("personfit") eRm/R/rsampler.R0000755000175100001440000000251614473215402013175 0ustar hornikusers"rsampler" <- function(inpmat,controls=rsctrl()){ if (!("RSctr" %in% class(controls))) stop("controls is not a control object - see help(\"rsctrl\")") n <- dim(inpmat)[1] k <- dim(inpmat)[2] burn_in <- controls$burn_in n_eff <- controls$n_eff step <- controls$step seed <- controls$seed tfixed <- controls$tfixed if (seed == 0) { # generates random seed in the range [536870911,772830910] seed <- as.integer(as.double(format(Sys.time(), "%H%M%OS3"))*1000) + 2**29 - 1 } # allocation of memory for simulated matrices vec<-vector( length = (n_eff+1)*n*trunc((k+31)/32) ) ier<-0 # calls the external Fortran subroutine sampler # simulated matrices are returned in vec RET<-.Fortran("sampler", n=as.integer(n), k=as.integer(k), inpmat=as.integer(inpmat), tfixed=as.logical(tfixed), burn_in=as.integer(burn_in), n_eff=as.integer(n_eff), step=as.integer(step), seed=as.integer(seed), outvec=as.integer(vec), ier=as.integer(ier) ) n_tot <- n_eff+1 if (RET$ier>0) { rserror(RET$ier) } else { RET<-c(RET[1:8],n_tot=n_eff+1,RET[9:10]) class(RET)<-"RSmpl" RET } } eRm/R/performance.R0000755000175100001440000003475214473216254013666 0ustar hornikusersperformance <- function(prediction.obj, measure, x.measure="cutoff", ...) { ## define the needed environments envir.list <- .define.environments() long.unit.names <- envir.list$long.unit.names function.names <- envir.list$function.names obligatory.x.axis <- envir.list$obligatory.x.axis optional.arguments <- envir.list$optional.arguments default.values <- envir.list$default.values ## abort in case of misuse if (!('prediction' %in% class(prediction.obj)) || !exists(measure, where=long.unit.names, inherits=FALSE) || !exists(x.measure, where=long.unit.names, inherits=FALSE)) { stop(paste("Wrong argument types: First argument must be of type", "'prediction'; second and optional third argument must", "be available performance measures!")) } ## abort, if attempt is made to use a measure that has an obligatory ## x.axis as the x.measure (cannot be combined) if (exists( x.measure, where=obligatory.x.axis, inherits=FALSE )) { message <- paste("The performance measure", x.measure, "can only be used as 'measure', because it has", "the following obligatory 'x.measure':\n", get( x.measure, envir=obligatory.x.axis)) stop(message) } ## if measure is a performance measure with obligatory x.axis, then ## enforce this axis: if (exists( measure, where=obligatory.x.axis, inherits=FALSE )) { x.measure <- get( measure, envir=obligatory.x.axis ) } if (x.measure == "cutoff" || exists( measure, where=obligatory.x.axis, inherits=FALSE )) { ## fetch from '...' any optional arguments for the performance ## measure at hand that are given, otherwise fill up the default values optional.args <- list(...) argnames <- c() if ( exists( measure, where=optional.arguments, inherits=FALSE )) { argnames <- get( measure, envir=optional.arguments ) default.arglist <- list() for (i in 1:length(argnames)) { default.arglist <- c(default.arglist, get(paste(measure,":",argnames[i],sep=""), envir=default.values, inherits=FALSE)) } names(default.arglist) <- argnames for (i in 1:length(argnames)) { templist <- list(optional.args, default.arglist[[i]]) names(templist) <- c('arglist', argnames[i]) optional.args <- do.call('.farg', templist) } } optional.args <- .select.args( optional.args, argnames ) ## determine function name function.name <- get( measure, envir=function.names ) ## for each x-validation run, compute the requested performance measure x.values <- list() y.values <- list() for (i in 1:length( prediction.obj@predictions )) { argumentlist <- .sarg(optional.args, predictions= prediction.obj@predictions[[i]], labels= prediction.obj@labels[[i]], cutoffs= prediction.obj@cutoffs[[i]], fp= prediction.obj@fp[[i]], tp= prediction.obj@tp[[i]], fn= prediction.obj@fn[[i]], tn= prediction.obj@tn[[i]], n.pos= prediction.obj@n.pos[[i]], n.neg= prediction.obj@n.neg[[i]], n.pos.pred= prediction.obj@n.pos.pred[[i]], n.neg.pred= prediction.obj@n.neg.pred[[i]]) ans <- do.call( function.name, argumentlist ) if (!is.null(ans[[1]])) x.values <- c( x.values, list( ans[[1]] )) y.values <- c( y.values, list( ans[[2]] )) } if (! (length(x.values)==0 || length(x.values)==length(y.values)) ) { stop("Consistency error.") } ## create a new performance object return( new("performance", x.name = get( x.measure, envir=long.unit.names ), y.name = get( measure, envir=long.unit.names ), alpha.name = "none", x.values = x.values, y.values = y.values, alpha.values = list() )) } else { perf.obj.1 <- performance( prediction.obj, measure=x.measure, ... ) perf.obj.2 <- performance( prediction.obj, measure=measure, ... ) return( .combine.performance.objects( perf.obj.1, perf.obj.2 ) ) } } .combine.performance.objects <- function( p.obj.1, p.obj.2 ) { ## some checks for misusage (in any way, this function is ## only for internal use) if ( p.obj.1@x.name != p.obj.2@x.name ) { stop("Error: Objects need to have identical x axis.") } if ( p.obj.1@alpha.name != "none" || p.obj.2@alpha.name != "none") { stop("Error: At least one of the two objects has already been merged.") } if (length(p.obj.1@x.values) != length(p.obj.2@x.values)) { stop(paste("Only performance objects with identical number of", "cross-validation runs can be combined.")) } x.values <- list() x.name <- p.obj.1@y.name y.values <- list() y.name <- p.obj.2@y.name alpha.values <- list() alpha.name <- p.obj.1@x.name for (i in 1:length( p.obj.1@x.values )) { x.values.1 <- p.obj.1@x.values[[i]] y.values.1 <- p.obj.1@y.values[[i]] x.values.2 <- p.obj.2@x.values[[i]] y.values.2 <- p.obj.2@y.values[[i]] ## cutoffs of combined object = merged cutoffs of simple objects cutoffs <- sort( unique( c(x.values.1, x.values.2)), decreasing=TRUE ) ## calculate y.values at cutoffs using step function y.values.int.1 <- approxfun(x.values.1, y.values.1, method="constant",f=1,rule=2)(cutoffs) y.values.int.2 <- approxfun(x.values.2, y.values.2, method="constant",f=1,rule=2)(cutoffs) ## 'approxfun' ignores NA and NaN objs <- list( y.values.int.1, y.values.int.2) objs.x <- list( x.values.1, x.values.2 ) na.cutoffs.1.bool <- is.na( y.values.1) & !is.nan( y.values.1 ) nan.cutoffs.1.bool <- is.nan( y.values.1) na.cutoffs.2.bool <- is.na( y.values.2) & !is.nan( y.values.2 ) nan.cutoffs.2.bool <- is.nan( y.values.2) bools <- list(na.cutoffs.1.bool, nan.cutoffs.1.bool, na.cutoffs.2.bool, nan.cutoffs.2.bool) values <- c(NA,NaN,NA,NaN) for (j in 1:4) { for (k in which(bools[[j]])) { interval.max <- objs.x[[ ceiling(j/2) ]][k] interval.min <- -Inf if (k < length(objs.x[[ ceiling(j/2) ]])) { interval.min <- objs.x[[ ceiling(j/2) ]][k+1] } objs[[ ceiling(j/2) ]][cutoffs <= interval.max & cutoffs > interval.min ] <- values[j] } } alpha.values <- c(alpha.values, list(cutoffs)) x.values <- c(x.values, list(objs[[1]])) y.values <- c(y.values, list(objs[[2]])) } return( new("performance", x.name=x.name, y.name=y.name, alpha.name=alpha.name, x.values=x.values, y.values=y.values, alpha.values=alpha.values)) } .define.environments <- function() { ## There are five environments: long.unit.names, function.names, ## obligatory.x.axis, optional.arguments, default.values ## Define long names corresponding to the measure abbreviations. long.unit.names <- new.env() assign("none","None", envir=long.unit.names) assign("cutoff", "Cutoff", envir=long.unit.names) assign("acc", "Accuracy", envir=long.unit.names) assign("err", "Error Rate", envir=long.unit.names) assign("fpr", "False positive rate", envir=long.unit.names) assign("tpr", "True positive rate", envir=long.unit.names) assign("rec", "Recall", envir=long.unit.names) assign("sens", "Sensitivity", envir=long.unit.names) assign("fnr", "False negative rate", envir=long.unit.names) assign("tnr", "True negative rate", envir=long.unit.names) assign("spec", "Specificity", envir=long.unit.names) assign("ppv", "Positive predictive value", envir=long.unit.names) assign("prec", "Precision", envir=long.unit.names) assign("npv", "Negative predictive value", envir=long.unit.names) assign("fall", "Fallout", envir=long.unit.names) assign("miss", "Miss", envir=long.unit.names) assign("pcfall", "Prediction-conditioned fallout", envir=long.unit.names) assign("pcmiss", "Prediction-conditioned miss", envir=long.unit.names) assign("rpp", "Rate of positive predictions", envir=long.unit.names) assign("rnp", "Rate of negative predictions", envir=long.unit.names) assign("auc","Area under the ROC curve", envir=long.unit.names) assign("cal", "Calibration error", envir=long.unit.names) assign("mwp", "Median window position", envir=long.unit.names) assign("prbe","Precision/recall break-even point", envir=long.unit.names) assign("rch", "ROC convex hull", envir=long.unit.names) assign("mxe", "Mean cross-entropy", envir=long.unit.names) assign("rmse","Root-mean-square error", envir=long.unit.names) assign("phi", "Phi correlation coefficient", envir=long.unit.names) assign("mat","Matthews correlation coefficient", envir=long.unit.names) assign("mi", "Mutual information", envir=long.unit.names) assign("chisq", "Chi-square test statistic", envir=long.unit.names) assign("odds","Odds ratio", envir=long.unit.names) assign("lift", "Lift value", envir=long.unit.names) assign("f","Precision-Recall F measure", envir=long.unit.names) assign("sar", "SAR", envir=long.unit.names) assign("ecost", "Expected cost", envir=long.unit.names) assign("cost", "Explicit cost", envir=long.unit.names) ## Define function names corresponding to the measure abbreviations. function.names <- new.env() assign("acc", ".performance.accuracy", envir=function.names) assign("err", ".performance.error.rate", envir=function.names) assign("fpr", ".performance.false.positive.rate", envir=function.names) assign("tpr", ".performance.true.positive.rate", envir=function.names) assign("rec", ".performance.true.positive.rate", envir=function.names) assign("sens", ".performance.true.positive.rate", envir=function.names) assign("fnr", ".performance.false.negative.rate", envir=function.names) assign("tnr", ".performance.true.negative.rate", envir=function.names) assign("spec", ".performance.true.negative.rate", envir=function.names) assign("ppv", ".performance.positive.predictive.value", envir=function.names) assign("prec", ".performance.positive.predictive.value", envir=function.names) assign("npv", ".performance.negative.predictive.value", envir=function.names) assign("fall", ".performance.false.positive.rate", envir=function.names) assign("miss", ".performance.false.negative.rate", envir=function.names) assign("pcfall", ".performance.prediction.conditioned.fallout", envir=function.names) assign("pcmiss", ".performance.prediction.conditioned.miss", envir=function.names) assign("rpp", ".performance.rate.of.positive.predictions", envir=function.names) assign("rnp", ".performance.rate.of.negative.predictions", envir=function.names) assign("auc", ".performance.auc", envir=function.names) assign("cal", ".performance.calibration.error", envir=function.names) assign("prbe", ".performance.precision.recall.break.even.point", envir=function.names) assign("rch", ".performance.rocconvexhull", envir=function.names) assign("mxe", ".performance.mean.cross.entropy", envir=function.names) assign("rmse", ".performance.root.mean.squared.error", envir=function.names) assign("phi", ".performance.phi", envir=function.names) assign("mat", ".performance.phi", envir=function.names) assign("mi", ".performance.mutual.information", envir=function.names) assign("chisq", ".performance.chisq", envir=function.names) assign("odds", ".performance.odds.ratio", envir=function.names) assign("lift", ".performance.lift", envir=function.names) assign("f", ".performance.f", envir=function.names) assign("sar", ".performance.sar", envir=function.names) assign("ecost", ".performance.expected.cost", envir=function.names) assign("cost", ".performance.cost", envir=function.names) ## If a measure comes along with an obligatory x axis (including "none"), ## list it here. obligatory.x.axis <- new.env() assign("mxe", "none", envir=obligatory.x.axis) assign("rmse", "none", envir=obligatory.x.axis) assign("prbe", "none", envir=obligatory.x.axis) assign("auc", "none", envir=obligatory.x.axis) assign("rch","none", envir=obligatory.x.axis) ## ecost requires probability cost function as x axis, which is handled ## implicitly, not as an explicit performance measure. assign("ecost","none", envir=obligatory.x.axis) ## If a measure has optional arguments, list the names of the ## arguments here. optional.arguments <- new.env() assign("cal", "window.size", envir=optional.arguments) assign("f", "alpha", envir=optional.arguments) assign("cost", c("cost.fp", "cost.fn"), envir=optional.arguments) assign("auc", "fpr.stop", envir=optional.arguments) ## If a measure has additional arguments, list the default values ## for them here. Naming convention: e.g. "cal" has an optional ## argument "window.size" the key to use here is "cal:window.size" ## (colon as separator) default.values <- new.env() assign("cal:window.size", 100, envir=default.values) assign("f:alpha", 0.5, envir=default.values) assign("cost:cost.fp", 1, envir=default.values) assign("cost:cost.fn", 1, envir=default.values) assign("auc:fpr.stop", 1, envir=default.values) list(long.unit.names=long.unit.names, function.names=function.names, obligatory.x.axis=obligatory.x.axis, optional.arguments=optional.arguments, default.values=default.values) } eRm/R/datprep_LPCM.R0000755000175100001440000000745514375241642013637 0ustar hornikusers`datprep_LPCM` <- function(X,W,mpoints,Groups,sum0) { #TFrow <- (rowSums(X)==0) #el. persons with 0 rawscore #X <- X[!TFrow,] ngroups <- max(Groups) N <- dim(X)[1] #number of persons K <- dim(X)[2]/mpoints #number of items mt_vek <- apply(X,2,max,na.rm=TRUE)[1:K] #number of categories - 1 for each item mt_vek_0 <- mt_vek+1 #number of categories for each item X01_0 <- matrix(rep(0,(N*sum(mt_vek_0)*mpoints)),nrow=N) #empty 0/1 matrix K1 <- dim(X)[2] cummt0 <- c(0,cumsum(rep(mt_vek_0,mpoints))[1:(K1-1)])+1 #index vector for 0th category indmatp <- apply(X,1,function(xi) {xi+cummt0}) #preparing index matrix for 1 responses imp1 <- as.vector(indmatp) imp2 <- rep(1:N,rep(K1,N)) indmat <- cbind(imp2,imp1) #final index matrix for 1 responses X01_0[indmat] <- 1 #0/1 matrix with 0th category d1 <- 1:N d2 <- 1:K1 coor <- expand.grid(d2,d1)[,c(2:1)] #X coordinates resvec <- as.vector(t(X)) #X as vector (rowwise) NAind <- as.matrix(coor[is.na(resvec),]) #index matrix for NA's in X mt_vek.t <- rep(mt_vek,mpoints) if (length(NAind) > 0) { NAindlist <- apply(NAind,1,function(x){ #x <- unlist(x) co <- seq(cummt0[x[2]],cummt0[x[2]]+mt_vek.t[x[2]]) NAind01 <- cbind(rep(x[1],length(co)),co) rownames(NAind01) <- NULL data.frame(NAind01,row.names=NULL) #list with NA indices }) indmatNA <- matrix(unlist(lapply(NAindlist, function(x) {t(as.matrix(x))})),ncol=2,byrow=TRUE) #matrix with NA indices X01_0[indmatNA] <- NA } X01 <- X01_0[,-cummt0] #automatized generation of the design matrix W if (length(W)==1) { W11diag <- diag(1,(sum(mt_vek)-1)) #build up design matrix if (sum0) { w110 <- rep(-1,(sum(mt_vek)-1)) #sum0 restriction } else { w110 <- rep(0,(sum(mt_vek)-1)) #first item category parameter set to 0 } W11 <- rbind(w110,W11diag) #PCM design matrix ZW <- dim(W11)[1] W1 <- NULL for (i in 1:(mpoints*ngroups)) W1 <- rbind(W1,W11) #first part with virtual items if (mpoints > 1) { #more than 1 measurement points if (ngroups > 1) { #more than 1 group/more mpoints t_mp1 <- rep(1:mpoints,rep(ZW*ngroups,mpoints)) t_mp <- factor(t_mp1) g_ng1 <- rep(rep(1:ngroups,rep(ZW,ngroups)),mpoints) g_ng <- factor(g_ng1) W2 <- model.matrix(~t_mp+g_ng)[,-1] #main effects g and mp W2[1:(ZW*ngroups),] <- 0 #remove main effects for the first test occasion } else { #1 group/more mpoints t_mp <- gl(mpoints,ZW) #factor for measurement points W2 <- model.matrix(~t_mp)[,-1] } } else if (ngroups > 1) { #1 mpoint/more groups g_ng <- gl(ngroups,ZW) W2 <- model.matrix(~g_ng)[,-1] warning("Group contrasts without repeated measures can not be estimated!") } else if (ngroups == 1) W2 <- NULL #1 mpoint/1 group catvek <- sequence(mt_vek) W2_cat <- W2*catvek #imposing item categories W <- cbind(W1,W2_cat) #design matrix completed colnames(W) <- NULL rownames(W) <- NULL } list(X=X,X01=X01,mt_vek=mt_vek,W=W) } eRm/R/person.parameter.eRm.R0000755000175100001440000003065714375241642015374 0ustar hornikusers`person.parameter.eRm` <- function(object){ # estimation of the person parameters with jml # object of class eRm # se... whether standard errors should be computed se <- TRUE interpolation <- TRUE X <- object$X #collapse X #X.full <- object$X max.it <- apply(X, 2L, max, na.rm = TRUE) #maximum item raw score without NA rp <- rowSums(X, na.rm = TRUE) #person raw scores maxrp <- apply(X, 1L, function(x.i){ sum(max.it[!is.na(x.i)]) }) #maximum item raw score for person i TFrow <- ((rp==maxrp) | (rp==0)) pers.exe <- (1L:nrow(X))[TFrow] #persons excluded from estimation due to 0/full pers.exe.names <- rownames(X)[pers.exe] pers.in <- (1L:nrow(X))[-pers.exe] #persons in estimation if(length(pers.exe) > 0L){ #data matrix persons (full/0) excluded) X.ex <- object$X[-pers.exe,] } else { X.ex <- object$X } if(any(is.na(X))){ dichX <- ifelse(is.na(X), 1, 0) strdata <- apply(dichX, 1L, function(x){ paste(x, collapse="") }) gmemb.X <- as.vector(data.matrix(data.frame(strdata))) } else { gmemb.X <- rep(1L, nrow(X)) } if(length(pers.exe) > 0L) X <- X[-pers.exe,] X.dummy <- X if(any(is.na(X))){ dichX <- ifelse(is.na(X), 1, 0) strdata <- apply(dichX, 1L, function(x){ paste(x, collapse="") }) gmemb <- as.vector(data.matrix(data.frame(strdata))) gmemb1 <- gmemb } else { gmemb <- rep(1L, nrow(X)) gmemb1 <- gmemb } #mt_vek <- apply(X, 2L, max, na.rm = TRUE) #number of categories - 1 for each item mt_vek <- apply(object$X, 2L, max, na.rm = TRUE) ## FIX: to be tested mt_ind <- rep(1L:length(mt_vek), mt_vek) #index i for items indvec <- NULL #establish matrix with unique raw scores for(i in unique(gmemb)){ gmemb.ind <- which(gmemb == i) collapse.vec <- which(!duplicated(rowSums(rbind(X[gmemb==i,]), na.rm = TRUE))) indvec <- c(indvec, gmemb.ind[collapse.vec]) } #for (i in unique(gmemb)) indvec <- c(indvec,!duplicated(rowSums(rbind(X[gmemb==i,]),na.rm = TRUE))) indvec <- sort(indvec) X <- X[indvec,] #collapsing X beta.all <- object$betapar if(!is.null(object$ngroups)){ if(object$ngroups > 1L) stop("Estimation of person parameters for models with group contrasts not possible!") } if(is.null(object$mpoints)){ mpoints <- 1L } else { mpoints <- object$mpoints } r.pall <- rowSums(X, na.rm = TRUE) #person raw scores X01 <- object$X01 if(length(pers.exe) > 0L) X01 <- X01[-pers.exe,] #if persons excluded due to 0/full response X01 <- X01[indvec,] #collapsed version gmemb <- gmemb[indvec] #collapsed version rownames(X01) <- rownames(X) rowvec <- 1L:nrow(X01) fitlist <- tapply(rowvec, gmemb, function(rind){ #list with nlm outputs if(length(rind) > 1L){ ivec <- !is.na(X[rind[1],]) #non-NA elements r.i <- colSums(X[rind, ivec], na.rm = TRUE) #item raw scores } else { #if only one person belongs to raw score group ivec <- !is.na(X[rind[1],]) r.i <- X[rind, ivec] # r.i <- X[rind,] # r.i[is.na(r.i)] <- 0 } #r.i <- colSums(object$X[rind,],na.rm=TRUE) #item raw scores r.p <- r.pall[rind] #person raw scores for current NA group X01g <- rbind(X01[rind,]) beta <- beta.all[!is.na(X01g[1L,])] X01beta <- rbind(X01g, beta.all) #matrix with unique 0/1 response patterns and beta vector in the last row theta <- rep(0L, length(r.p)) #==================== ML routines =================================== jml.rasch <- function(theta){ #fast ML for RM only ksi <- exp(theta) denom <- 1/exp(-beta) #-beta instead of beta since beta are easiness parameter lnL <- sum(r.p*theta) - sum(r.i*(-beta)) - sum(log(1 + outer(ksi,denom))) return(-lnL) } jml <- function(theta){ #ML for all other models t1t2.list <- tapply(1L:ncol(X01beta), mt_ind, function(xin){ #xb <- (t(X01beta)[xin,]) xb <- rbind(t(X01beta)[xin,]) #0/1 responses and beta parameters for one item beta.i <- c(0.0, xb[,ncol(xb)]) #item parameter with 0 #person responses (row-wise) on each category for current item if((nrow(xb) > 1L) && (length(xin == 1L))){ x01.i <- as.matrix(xb[,1L:(ncol(xb) - 1L)]) } else { x01.i <- rbind(xb[,1L:(ncol(xb) - 1L)]) #0/1 matrix for item i without beta } cat0 <- rep(0L, ncol(x01.i)) cat0[colSums(x01.i) == 0L] <- 1 #those with 0 on the 1-kth category get a 1 x01.i0 <- rbind(cat0, x01.i) #appending response vector for 0th category ind.h <- 0L:(length(beta.i)-1L) theta.h <- ind.h %*% t(theta) #n. categories times theta term1 <- (theta.h + beta.i) * x01.i0 #category-person matrix t1.i <- sum(colSums(term1)) #sum over categories and persons #print(t1.i) term2 <- exp(theta.h+beta.i) t2.i <- sum(log(colSums(term2))) #sum over categories and persons #print(t2.i) return(c(t1.i,t2.i)) }) termlist <- matrix(unlist(t1t2.list), ncol = 2L, byrow = TRUE) termlist <- termlist[!is.na(rowSums(termlist)),] st1st2 <- colSums(termlist, na.rm = TRUE) #sum term1, term2 lnL <- st1st2[1] - st1st2[2] return(-lnL) } #==================== end ML routines ================================ #==================== call optimizer ================================= if (object$model == "RM") { fit <- nlm(jml.rasch, theta, hessian = se, iterlim = 1000L) } else { fit <- nlm(jml, theta, hessian = se, iterlim = 1000) } #fit2 <- optim(theta, jml.rasch, method="BFGS", hessian=TRUE) #=================== end call optimizer ============================== loglik <- -fit$minimum niter <- fit$iterations thetapar <- fit$estimate if(se){ se <- sqrt(diag(solve(fit$hessian))) } else { se <- NA fit$hessian <- NA } return(list("loglik" = loglik, "niter" = niter, "thetapar" = thetapar, "se" = se, "hessian" = fit$hessian)) }) loglik <- niter <- npar <- numeric(length(fitlist)) thetapar <- se.theta <- hessian <- vector(mode = "list", length = length(fitlist)) for(i in seq_along(fitlist)){ loglik[i] <- fitlist[[i]]$loglik niter[i] <- fitlist[[i]]$niter npar[i] <- length(fitlist[[i]]$thetapar) thetapar[[i]] <- fitlist[[i]]$thetapar se.theta[[i]] <- fitlist[[i]]$se hessian[[i]] <- fitlist[[i]]$hessian } if(interpolation){ #cubic spline interpolation for 0 and full raw scores x <- rowSums(X, na.rm = TRUE) xlist <- split(x, gmemb) splineMessage <- FALSE # to display the spline-failure message only once max.rs.NAgroups <- lapply(sort(unique(gmemb.X)), function(i){ ## MM 2012-02-01 sum(max.it[!is.na(object$X[which(gmemb.X == i)[1],])]) # get the max. raw score per NA-group }) NAgroups.min <- tapply(rowSums(object$X, na.rm=T), gmemb.X, min, na.rm = TRUE) NAgroups.max <- tapply(rowSums(object$X, na.rm=T), gmemb.X, max, na.rm = TRUE) NAgroup_exclude <- numeric() for(i in seq_along(unique(gmemb.X))){ # delete groups with 0/full patterns from max.rs.NAgroups, NAgroups.min, NAgroups.max if(all(rowSums(object$X, na.rm=TRUE)[gmemb.X == i] %in% c(0, max.rs.NAgroups[[i]]))) NAgroup_exclude <- c(NAgroup_exclude, i) } if(length(NAgroup_exclude) > 0L){ splineMessage <- TRUE # so that the message is only printed once max.rs.NAgroups <- max.rs.NAgroups[-NAgroup_exclude] NAgroups.min <- NAgroups.min[-NAgroup_exclude] NAgroups.max <- NAgroups.max[-NAgroup_exclude] gmemb_reduced <- unique(gmemb.X[-which(gmemb.X %in% NAgroup_exclude)]) } pred.list <- Map(function(xx, yy, rs, NAmin, NAmax){ # Map(...) is mapply(..., SIMPLFY = FALSE) y <- tapply(yy, xx, function(xy){ xy[1] }) x <- unique(sort(xx)) from <- ifelse(NAmin == 0, 0, min(x)) to <- ifelse(NAmax == rs, rs, max(x)) if((length(x) > 3) || (length(y) > 3)){ #otherwise splinereg is not admissible fm1 <- interpSpline(x,y) if((from == 0) | (to == rs)){ pred.val <- unclass(predict(fm1, unique(c(from, x, to)))) } else { list(x=unname(x),y=unname(y)) #MM2012-02-01 } } else { splineMessage <- TRUE # so that the message is only printed once rval <- list(x=unname(x),y=unname(y)) #MM2012-02-01 if(from == 0){ rval$x <- c(0, rval$x) rval$y <- c(NA, rval$y) } if(to == rs){ rval$x <- c(rval$x, rs) rval$y <- c(rval$y, NA) } rval } }, xlist, thetapar, max.rs.NAgroups, NAgroups.min, NAgroups.max) X.n <- object$X # if (any(sapply(pred.list,is.null))) pred.list <- NULL #no spline interpolation applicable #MM2012-02-01 if(splineMessage) message("Spline interpolation in some subgroups not performed!\n Less than 4 different person parameters estimable!\n Perhaps NAs in subgroup(s).") } names(thetapar) <- names(se.theta) <- paste("NAgroup", 1L:length(thetapar), sep="") #---------expand theta and se.theta, labeling ------------------- for(i in unique(gmemb)){ o.r <- rowSums(rbind(X.dummy[gmemb1==i,]), na.rm = TRUE) #orginal raw scores names(o.r) <- rownames(X.dummy)[gmemb1 == i] c.r <- rowSums(rbind(X[gmemb==i,]), na.rm = TRUE) #collapsed raw scores match.ind <- match(o.r, c.r) thetapar[[i]] <- thetapar[[i]][match.ind] #de-collapse theta's se.theta[[i]] <- se.theta[[i]][match.ind] #de-collapse se's names(thetapar[[i]]) <- names(se.theta[[i]]) <- names(o.r) } #--------------- end expand, labeling --------------------------- #---------------------- theta.table new ---------------------- if(length(NAgroup_exclude) > 0L){ selector <- gmemb.X %in% gmemb_reduced } else { selector <- rep(TRUE, length(gmemb.X)) } gmemb.X_final <- gmemb.X[selector] while(any(diff(sort(unique(gmemb.X_final))) > 1L) | (min(gmemb.X_final) > 1L)){ if(!any(gmemb.X_final == 1L)){ gmemb.X_final <- gmemb.X_final - 1L; next } for(i in 1:max(gmemb.X_final)){ if(sum(gmemb.X_final == i) == 0) gmemb.X_final[gmemb.X_final == (i+1L)] <- gmemb.X_final[gmemb.X_final == (i+1L)] - 1L } } theta.table <- data.frame("Person Parameter" = rep(NA, nrow(object$X)), "NAgroup" = NA, "Interpolated" = FALSE, row.names=rownames(object$X), check.names = FALSE) theta.table[selector, "Person Parameter"] <- mapply(function(rs, NAgroup){ pred.list[[NAgroup]]$y[which(pred.list[[NAgroup]]$x == rs)] }, rowSums(object$X, na.rm=T)[selector], gmemb.X_final) theta.table[selector, "NAgroup"] <- gmemb.X_final if(length(pers.exe) > 0) theta.table[pers.exe,"Interpolated"] <- TRUE result <- list(X = X.n, X01 = object$X01, X.ex = X.ex, W = object$W, model = object$model, loglik = loglik, loglik.cml = object$loglik, npar = npar, iter = niter, betapar = object$betapar, thetapar = thetapar, se.theta = se.theta, theta.table = theta.table, pred.list = pred.list, hessian = hessian, mpoints = mpoints, pers.ex = pers.exe, gmemb = gmemb1) class(result) <- "ppar" return(result) } eRm/R/plotICC.R0000755000175100001440000000007314375241642012647 0ustar hornikusers`plotICC` <- function(object, ...) UseMethod("plotICC") eRm/R/datcheck.R0000755000175100001440000001374014375241642013125 0ustar hornikusersdatcheck <- function(X, W, mpoints, groupvec, model){ if(is.data.frame(X)){ X <- as.matrix(X) # X as data frame allowed } if(is.null(colnames(X))){ #determine item names if(mpoints > 1){ mpind <- paste("t",rep(1:mpoints,each=(ncol(X)/mpoints),1),sep="") #time points itemind <- paste("I",1:(ncol(X)/mpoints),sep="") colnames(X) <- paste(itemind,mpind) } else { colnames(X) <- paste("I",1:ncol(X),sep="") #item labels } } if(is.null(rownames(X))) rownames(X) <- paste0("P", seq_len(nrow(X))) #person labels #----------------------- check groupvec -------------------------- if((length(groupvec) > 1L) && (length(groupvec) != nrow(X))){ stop("Wrong specification of groupvec!") } if(min(groupvec) != 1L){ stop("Group specification must start with 1!") } if(length(unique(groupvec)) != (max(groupvec))){ stop("Group vector is incorrectly specified (perhaps a category is missing)!") # rh 2011-03-03 } if((max(groupvec) > 1L) && (mpoints == 1)){ stop(paste0("\n", prettyPaste("Model not identifiable! Group contrasts can only be imposed for repeated measurement designs."))) } # if ((length(groupvec) > 1) && any(is.na(X))) { # stop("Model with repeated measures, group specification and NAs cannot be computed!") } #----------------------- check X -------------------------------- allna.vec <- apply(X,2,function(y) {all(is.na(y))}) #eliminate items with all NA's if (any(allna.vec)) {stop("There are items with full NA responses which must be deleted!")} allna.vec <- apply(X,1,function(y) {all(is.na(y))}) #eliminate items with all NA's if (any(allna.vec)) {stop("There are persons with full NA responses which must be deleted!")} allna.vec <- apply(X,1,function(y) {sum(is.na(y))}) if (any(allna.vec == (ncol(X)-1L))) {stop("Subjects with only 1 valid response must be removed!")} ri.min <- apply(X,2,min,na.rm=TRUE) #if no 0 responses if(any(ri.min > 0)){ warning(paste0( "\n", prettyPaste("The following items have no 0-responses:"), "\n", paste(colnames(X)[ri.min > 0], collapse=" "), "\n", prettyPaste("Responses are shifted such that lowest category is 0.") ), call. = FALSE, immediate.=TRUE) } X <- t(apply(X,1,function(y) {y-ri.min})) #shift down to 0 ri <- apply(X,2,sum,na.rm=TRUE) #item raw scores n.NA <- colSums(apply(X,2,is.na)) #number of NA's per column maxri <- (dim(X)[1]*(apply(X,2,max,na.rm=TRUE)))-n.NA #maximum item raw scores with NA TFcol <- ((ri==maxri) | (ri==0)) X.n <- X[,!TFcol] #new matrix with excluded items item.ex <- (seq_len(ncol(X)))[TFcol] #excluded items if(length(item.ex) > 0) { if(mpoints == 1){ warning(paste0( "\n", prettyPaste("The following items were excluded due to complete 0/full responses:"), "\n", paste(colnames(X)[item.ex], collapse=" ") ), call. = FALSE, immediate.=TRUE) } else { stop(paste0( "\n", "The following items show complete 0/full responses:", "\n", paste(colnames(X)[item.ex], collapse=" "), "\n", prettyPaste("Estimation cannot be performed! Delete the corresponding items for the other measurement points as well!") ), call. = FALSE) } } if ((model=="PCM") || (model=="LPCM")) { #check if there are missing categories for PCM (for RSM doesn't matter) tablist <- apply(X,2,function(x) list(as.vector(table(x)))) tablen <- sapply(tablist,function(x) length(x[[1]])) xmax <- apply(X,2,max)+1 indwrong <- which(tablen != xmax) if(length(indwrong) > 0){ warning(paste0( "\n", prettyPaste("The following items do not have responses on each category:"), "\n", paste(colnames(X)[indwrong], collapse=" "), "\n", prettyPaste("Estimation may not be feasible. Please check data matrix!") ), call. = FALSE, immediate.=TRUE) } } #-------------------------- ill conditioned for RM and LLTM -------------- if ((model=="RM") || (model=="LLTM")) { if (length(table(X.n)) != 2L) stop("Dichotomous data matrix required!") k.t <- dim(X.n)[2L]/mpoints #check for each mpoint separately t.ind <- rep(seq_len(mpoints), 1L, each=k.t) X.nlv <- split(t(X.n),t.ind) #split X due to mpoints cn.lv <- split(colnames(X.n),t.ind) X.nl <- lapply(X.nlv,matrix,ncol=k.t,byrow=TRUE) for(i in seq_len(length(X.nl))) colnames(X.nl[[i]]) <- cn.lv[[i]] for(l in seq_len(mpoints)){ #check within mpoints X.nll <- X.nl[[l]] k <- ncol(X.nll) adj <- matrix(0, ncol=k, nrow=k) for(i in seq_len(k)) for(j in seq_len(k)) { adj[i,j]<- 1*any(X.nll[,i] > X.nll[,j], na.rm = TRUE) } cd <- component.dist(adj, connected = "strong") cm <- cd$membership cmp <- max(cm) if(cmp > 1L) { cmtab <- table(cm) maxcm.n <- as.numeric(names(cmtab)[cmtab!=max(cmtab)]) suspcol <- (seq_len(length(cm)))[tapply(cm, seq_len(length(cm)), function(x){ any(maxcm.n == x) })] n.suspcol <- colnames(X.nll)[suspcol] stop(paste0( "\n", prettyPaste("Estimation stopped due to ill-conditioned data matrix X! Suspicious items:"), "\n", paste(n.suspcol, collapse=" ") ), call. = FALSE) } } } #----------------------- end ill-conditioned check ------------------------------- return(list(X = X.n, groupvec = groupvec)) } eRm/R/plotjointICC.R0000755000175100001440000000010114375241642013703 0ustar hornikusersplotjointICC <- function(object, ...) UseMethod("plotjointICC") eRm/R/NPtest.R0000755000175100001440000007351014473216047012575 0ustar hornikusersNPtest<-function(obj, n=NULL, method="T1", ...){ dots<-as.list(substitute(list(...)))[-1] nn<-names(dots) for (i in seq(along=dots)) assign(nn[i],dots[[i]]) if(!exists("burn_in", inherits = FALSE)) burn_in <- 256 if(!("step" %in% nn)) step<-32 if(!exists("seed", inherits = FALSE)) seed<-0 if(is.null(n)) n <- 500 if(is.matrix(obj) || is.data.frame(obj)){ # input is datamatrix - RaschSampler object is generated if (!all(obj %in% 0:1)) stop("Data matrix must be binary, NAs not allowed") itscor<-colSums(obj) # rh 2011-03-03 itcol<-(itscor==0|itscor==nrow(obj)) if (any(itcol)){ cat("The following columns in the data show complete 0/full responses: \n") cat((1:ncol(obj))[itcol],sep=", ") cat("\n") stop("NPtest using these items is meaningless. Delete them first!") } obj<-rsampler(obj,rsctrl(burn_in=burn_in, n_eff=n, step=step, seed=seed)) #browser() } else if(!("RSmpl" %in% class(obj))){ stop("Input object must be data matrix/data frame or output from RaschSampler") } if(exists("RSinfo", inherits = FALSE)) if(get("RSinfo")) summary(obj) switch(method, "T1" = T1(obj, ...), "T1l" = T1l(obj, ...), "T1m" = T1m(obj, ...), "Tmd" = Tmd(obj, ...), "T2" = T2(obj, ...), "T2m" = T2m(obj, ...), "T4" = T4(obj, ...), # "T7" = T7(obj, ...), # "T7a" = T7a(obj, ...), "T10" = T10(obj, ...), "T11" = T11(obj, ...), "Tpbis" = Tpbis(obj, ...), "MLoef" = MLoef.x(obj, ...), "Q3h" = Q3h(obj, ...), "Q3l" = Q3l(obj, ...) ) } MLoef.x<-function(rsobj, splitcr=NULL, ...){ # user function MLexact<-function(X,splitcr){ rmod<-RM(X) LR<-MLoef(rmod,splitcr)$LR LR } #if(!exists("splitcr", inherits = FALSE)) splitcr="median" if(is.null(splitcr)) splitcr="median" res <- rstats(rsextrobj(rsobj, 2), MLexact, splitcr) rmod<-RM(rsextrmat(rsobj,1)) # MLoef for original data MLres<-MLoef(rmod,splitcr) class(MLres)<-c(class(MLres),"MLx") # for printing without blank line res1<-MLres$LR n_eff<-rsobj$n_eff # number of simulated matrices res<-unlist(res) prop<-sum((res[1:n_eff]>=res1)/n_eff) result<-list(MLres=MLres, n_eff=n_eff, prop=prop, MLoefvec=res) # MLobj class(result)<-"MLobj" result } Tpbis <- function(rsobj, idxt=NULL, idxs=NULL, ...){ # fixed 2013-08-09 Tpbis.stat <- function(x){ rb <- rowSums(x[, idxs, drop = FALSE]) # all raw scores t <- x[, idxt] # dichotomous item r <- tapply(rb, t, sum, simplify = FALSE) # raw scores by item; simplify = FALSE to be on the safe side n1 <- sum(t) # n_1 = sum of raw scores with t == 1 n0 <- sum(1 - t) # n_0 = sum of raw scores with t == 0 return(n0 * r[[2L]][1L] - n1*r[[1L]][1L]) # n_0 * sum(r_1) - n_1 * sum(r_0) } if(is.null(idxs)) stop("No item(s) for subscale specified (use idxs!)") if(is.null(idxt)) stop("No test item for testing against subscale specified (use idx!)") li1 <- length(idxt) li2 <- length(idxs) k <- rsobj$k if(li1 > 1L ||li2 >= k || (li1 + li2) > k || any(idxt %in% idxs) || any(c(idxt,idxs) > k)){ stop("Subscale and/or test item incorrectly specified.") } n_eff <- rsobj$n_eff # number of simulated matrices n_tot <- rsobj$n_tot # number of simulated matrices res <- rstats(rsobj, Tpbis.stat) # calculates statistic for each matrix corrvec <- do.call(cbind, lapply(res, as.vector)) # converts result list to matrix prop <- sum(corrvec[2L:(n_tot)] <= corrvec[1L]) / n_eff # T(A_s) >= T(A_0) # Tpbisobj result <- list("n_eff" = n_eff, "prop" = prop, "idxt" = idxt, "idxs" = idxs, "Tpbisvec" = corrvec) class(result)<-"Tpbisobj" return(result) } Tmd<-function(rsobj, idx1=NULL, idx2=NULL, ...){ Tmd.stat<-function(x){ r1<-rowSums(x[,idx1, drop=FALSE]) r2<-rowSums(x[,idx2, drop=FALSE]) corr<-cor(r1,r2) corr } if(is.null(idx1)) stop("No item(s) for subscale 1 specified (use idx1!)") if(is.null(idx2)) stop("No item(s) for subscale 2 specified (use idx2!)") li1<-length(idx1) li2<-length(idx2) k<-rsobj$k if(li1>=k ||li2>=k || li1+li2>k || any(idx1 %in% idx2)) stop("Subscale(s) incorrectly specified.") n_eff<-rsobj$n_eff # number of simulated matrices n_tot<-rsobj$n_tot # number of simulated matrices res<-rstats(rsobj,Tmd.stat) # calculates statistic for each matrix corrvec<-do.call(cbind, lapply(res,as.vector)) # converts result list to matrix prop<-sum(corrvec[2:(n_tot)]<=corrvec[1])/n_eff result<-list(n_eff=n_eff, prop=prop, idx1=idx1, idx2=idx2, Tmdvec=corrvec) # Tmdobj class(result)<-"Tmdobj" result } T1m<-function(rsobj, ...){ T1mstat<-function(x){ # calculates statistic T1m unlist(lapply(1:(k-1),function(i) lapply((i+1):k, function(j) sum(x[,i]==x[,j])))) } n_eff<-rsobj$n_eff # number of simulated matrices n_tot<-rsobj$n_tot # number of simulated matrices k<-rsobj$k # number of columns of matrices res<-rstats(rsobj,T1mstat) # calculates statistic for each matrix res<-do.call(cbind, lapply(res,as.vector)) # converts result list to matrix T1mvec<-apply(res, 1, function(x) sum(x[2:(n_tot)]<=x[1])/n_eff) T1mmat<-matrix(,k,k) T1mmat[lower.tri(T1mmat)] <- T1mvec # lower triangular matrix of p-values result<-list(n_eff=n_eff, prop=T1mvec, T1mmat=T1mmat) # T1mobj class(result)<-"T1mobj" result } T1<-function(rsobj, ...){ T1stat<-function(x){ # calculates statistic T1 unlist(lapply(1:(k-1),function(i) lapply((i+1):k, function(j) sum(x[,i]==x[,j])))) } n_eff<-rsobj$n_eff # number of simulated matrices n_tot<-rsobj$n_tot # number of simulated matrices k<-rsobj$k # number of columns of matrices res<-rstats(rsobj,T1stat) # calculates statistic for each matrix res<-do.call(cbind, lapply(res,as.vector)) # converts result list to matrix T1vec<-apply(res, 1, function(x) sum(x[2:(n_tot)]>=x[1])/n_eff) T1mat<-matrix(,k,k) T1mat[lower.tri(T1mat)] <- T1vec # lower triangular matrix of p-values result<-list(n_eff=n_eff, prop=T1vec, T1mat=T1mat) # T1obj class(result)<-"T1obj" result } T1l<-function(rsobj, ...){ T1lstat<-function(x){ # calculates statistic T1 unlist(lapply(1:(k-1),function(i) lapply((i+1):k, function(j) sum(x[,i] & x[,j])))) } n_eff<-rsobj$n_eff # number of simulated matrices n_tot<-rsobj$n_tot # number of simulated matrices k<-rsobj$k # number of columns of matrices res<-rstats(rsobj,T1lstat) # calculates statistic for each matrix res<-do.call(cbind, lapply(res,as.vector)) # converts result list to matrix T1lvec<-apply(res, 1, function(x) sum(x[2:(n_tot)]>=x[1])/n_eff) T1lmat<-matrix(,k,k) T1lmat[lower.tri(T1lmat)] <- T1lvec # lower triangular matrix of p-values result<-list(n_eff=n_eff, prop=T1lvec, T1lmat=T1lmat) # T1obj class(result)<-"T1lobj" result } T2<-function(rsobj,idx=NULL,stat="var", ...){ T2.Var.stat<-function(x){ # calculates statistic T2 var(rowSums(x[,idx, drop=FALSE])) } T2.MAD1.stat<-function(x){ # calculates statistic T2 y<-rowSums(x[,idx, drop=FALSE]) # mean absolute deviation mean(abs(y-mean(y))) } T2.MAD2.stat<-function(x){ # calculates statistic T2 mad(rowSums(x[,idx, drop=FALSE]),constant=1) # unscaled median absolute deviation } T2.Range.stat<-function(x){ # calculates statistic T2 diff(range(rowSums(x[,idx, drop=FALSE]))) } n<-rsobj$n n_eff<-rsobj$n_eff k<-rsobj$k # number of columns of matrices if(is.null(idx)) stop("No item(s) for subscale specified (use idx!)") res<-switch(stat, "var"=rstats(rsobj,T2.Var.stat), "mad1"=rstats(rsobj,T2.MAD1.stat), "mad2"=rstats(rsobj,T2.MAD2.stat), "range"=rstats(rsobj,T2.Range.stat), stop("stat must be one of \"var\", \"mad1\", \"mad2\", \"range\"") ) res<-unlist(res) prop<-sum(res[2:(n_eff+1)]>=res[1])/n_eff result<-list(n_eff=n_eff, prop=prop, idx=idx, stat=stat, T2vec=res) # T2obj class(result)<-"T2obj" result } T2m<-function(rsobj,idx=NULL,stat="var", ...){ T2m.Var.stat<-function(x){ # calculates statistic T2m var(rowSums(x[,idx, drop=FALSE])) } T2m.MAD1.stat<-function(x){ # calculates statistic T2m y<-rowSums(x[,idx, drop=FALSE]) # mean absolute deviation mean(abs(y-mean(y))) } T2m.MAD2.stat<-function(x){ # calculates statistic T2m mad(rowSums(x[,idx, drop=FALSE]),constant=1) # unscaled median absolute deviation } T2m.Range.stat<-function(x){ # calculates statistic T2m diff(range(rowSums(x[,idx, drop=FALSE]))) } n<-rsobj$n n_eff<-rsobj$n_eff k<-rsobj$k # number of columns of matrices if(is.null(idx)) stop("No item(s) for subscale specified (use idx!)") res<-switch(stat, "var"=rstats(rsobj,T2m.Var.stat), "mad1"=rstats(rsobj,T2m.MAD1.stat), "mad2"=rstats(rsobj,T2m.MAD2.stat), "range"=rstats(rsobj,T2m.Range.stat), stop("stat must be one of \"var\", \"mad1\", \"mad2\", \"range\"") ) res<-unlist(res) prop<-sum(res[2:(n_eff+1)]<=res[1])/n_eff result<-list(n_eff=n_eff, prop=prop, idx=idx, stat=stat, T2mvec=res) # T2mobj class(result)<-"T2mobj" result } T4<-function(rsobj,idx=NULL,group=NULL,alternative="high", ...){ T4.stat<-function(x){ # calculates statistic T4 sign*sum(rowSums(x[gr,idx,drop=FALSE])) } n_eff<-rsobj$n_eff # number of simulated matrices n_tot<-rsobj$n_tot # number of all matrices k<-rsobj$k # number of items if(is.null(idx)) stop("No item(s) for subscale specified (use idx!)") if(length(idx)==k) # rh 2011-03-03 stop("Subscale containing all items gives meaningless results for T4.") if(is.null(group)) stop("No group specified (use group!)") if(!is.logical(group)) # added rh 2011-03-03 stop("group must be of type \"logical\" (e.g., group = (age==1) )") if(alternative=="high") sign <- 1 else if(alternative=="low") sign <- -1 else stop("alternative incorrectly specified! (use either \"high\" or \"low\")") gr<-as.logical(group) # group definition (logical) res<-rstats(rsobj,T4.stat) res<-unlist(res) prop<-sum(res[2:(n_tot)]>=res[1])/n_eff gr.nam <- deparse(substitute(group)) gr.n <- sum(group) result<-list(n_eff=n_eff, prop=prop, idx=idx, gr.nam=gr.nam, gr.n=gr.n, T4vec=res, alternative=alternative) # T4obj class(result)<-"T4obj" result } # removed in version 0.14-5 #T7<-function(rsobj,idx=NULL, ...){ # T7.stat<-function(x){ # calculates statistic T7 # calcT7<-function(i,j){ # calculates sum for all items in subscale # if(sitscor[i]>sitscor[j]){ # sum(submat[,j]>submat[,i]) # # # t<-table(submat[,i],submat[,j]) # odds ratio gives the same result # # OR<-t[1]*t[4]/(t[2]*t[3]) # # 1/OR # } else # NA # } # submat<-x[,idx] # submat<-submat[,order(itscor,decreasing=TRUE)] # RET<-unlist(lapply(1:(m-1), function(i) lapply((i+1):m, function(j) calcT7(i,j)))) # RET # } # # n_eff<-rsobj$n_eff # number of simulated matrices # n_tot<-rsobj$n_tot # number of all matrices # k<-rsobj$k # number of items # if(is.null(idx)) # stop("No items for subscale specified (use idx!)") # else if (length(idx)<2) # stop("At least 2 items have to be specified with idx!") # submat<-rsextrmat(rsobj,1)[,idx] # itscor<-colSums(submat) # names(itscor)<-colnames(submat)<-idx # # submat<-submat[,order(itscor,decreasing=TRUE)] # sitscor<-sort(itscor,decreasing=TRUE) # sorted itemscore # m<-length(itscor) # # resList<-rstats(rsobj,T7.stat) # res<-sapply(resList,sum,na.rm=TRUE) # prop<-sum(res[2:(n_eff+1)]>=res[1])/n_eff # result<-list(n_eff=n_eff, prop=prop, itscor=itscor, T7vec=res) # T7obj # class(result)<-"T7obj" # result #} #T7a<-function(rsobj,idx=NULL, ...){ # T7a.stat<-function(x){ # calculates statistic T7a # calcT7a<-function(i,j){ # calculates sum for single Itempair # if(sitscor[i]>sitscor[j]){ # sum(submat[,j]>submat[,i]) # # # t<-table(submat[,i],submat[,j]) # odds ratio gives the same result # # OR<-t[1]*t[4]/(t[2]*t[3]) # # 1/OR # } else # NA # } # submat<-x[,idx] # submat<-submat[,order(itscor,decreasing=TRUE)] # RET<-unlist(lapply(1:(m-1), function(i) lapply((i+1):m, function(j) calcT7a(i,j)))) # RET # } # # n_eff<-rsobj$n_eff # number of simulated matrices # n_tot<-rsobj$n_tot # number of all matrices # k<-rsobj$k # number of items # if(is.null(idx)) # stop("No items for subscale specified (use idx!)") # else if (length(idx)<2) # stop("At least 2 items have to be specified with idx!") # submat<-rsextrmat(rsobj,1)[,idx] # itscor<-colSums(submat) # names(itscor)<-colnames(submat)<-idx # submat<-submat[,order(itscor,decreasing=TRUE)] # sitscor<-sort(itscor,decreasing=TRUE) # sorted itemscore # m<-length(itscor) # # res<-rstats(rsobj,T7a.stat) # res<-do.call(cbind, lapply(res,as.vector)) # converts result list to matrix # T7avec<-apply(res, 1, function(x) sum(x[2:(n_tot)]>=x[1])/n_eff) # T7anam<-NULL # for (i in 1:(m-1)) for(j in (i+1):m ) # T7anam<-c(T7anam, paste("(",names(sitscor[i]),">",names(sitscor[j]),")",sep="",collapse="")) # names(T7avec)<-T7anam # result<-list(n_eff=n_eff, prop=T7avec,itscor=itscor) # T7aobj # class(result)<-"T7aobj" # result #} T10<-function(rsobj, splitcr="median", ...){ calc.groups<-function(x,splitcr){ if (length(splitcr) > 1) { # numeric vectors converted to factors if (length(splitcr) != nrow(x)) { stop("Mismatch between length of split vector and number of persons!") } splitcr <- as.factor(splitcr) if (length(levels(splitcr))>2) { stop("Split vector defines more than 2 groups (only two allowed)!") } spl.lev <- levels(splitcr) #spl.gr <- paste(spl.nam, spl.lev, sep = " ") # not necessary for the time being hi <- splitcr==spl.lev[1] # first level is high group } else if (!is.numeric(splitcr)) { spl.nam <- splitcr if (splitcr == "median") { spl.gr <- c("Raw Scores <= Median", "Raw Scores > Median") rv <- rowSums(x) rvsplit <- median(rv) hi <- rv > rvsplit } if (splitcr == "mean") { spl.gr <- c("Raw Scores < Mean", "Raw Scores >= Mean") rv <- rowSums(x) rvsplit <- mean(rv) hi <- rv > rvsplit } } list(hi=hi,spl.nam=spl.nam) # spl.nam is returned due to lex scoping even if not defined here } T10.stat<-function(x){ # calculates statistic T10 for one matrix nij.hi<-unlist(lapply(1:k,function(i) lapply(1:k, function(j) sum(x[hi,i]>x[hi,j])))) nij.low<-unlist(lapply(1:k,function(i) lapply(1:k, function(j) sum(x[!hi,i]>x[!hi,j])))) nji.hi<- unlist(lapply(1:k,function(i) lapply(1:k, function(j) sum(x[hi,i]=res[1])/n_eff result<-list(n_eff=n_eff, prop=prop,spl.nam=ans$spl.nam,hi.n=hi.n,low.n=low.n,T10vec=res) # T10obj class(result)<-"T10obj" result } T11<-function(rsobj, ...){ T11.stat<-function(x){ as.vector(cor(x)) } calc.T11<-function(x){ # calculates statistic T11 for one matrix sum(abs(x-rho)) } n_eff<-rsobj$n_eff # number of simulated matrices n_tot<-rsobj$n_tot # number of all matrices k<-rsobj$k # number of columns of matrices res<-rstats(rsobj,T11.stat) # for each matrix calculate all r_ij's cormats <- matrix(unlist(res),nrow=k*k) # k*k x n_tot matrix, each colum contains one corr matrix rho<-apply(cormats[,2:n_tot],1,mean) # vector of estimated "real" rho_ij's T11obs<-calc.T11(cormats[,1]) # vector of observed r_ij's prop<-sum(apply(cormats[, 2:n_tot],2,calc.T11)>=T11obs)/n_eff result<-list(n_eff=n_eff, prop=prop, T11r=cormats[,1], T11rho=rho) # T11obj class(result)<-"T11obj" result } ## The following two functions were included in version 0.16-3 Q3h<-function(rsobj, ...){ Q3h.stat <- function(x){ as.vector(x) } calcQ3h.stat <- function(x, exp=exp) { ## Calculates Q3h based on observed matrix and expected values # Calculates Q3 i <- ncol(x) mat <- x - exp res <- matrix(nrow=i,ncol=i) for(a in 1:(i-1)) { for(b in (a+1):i) { res[b,a] <- res[a,b] <- -cor(mat[,a],mat[,b]) } } return(res) } n_eff<-rsobj$n_eff # number of simulated matrices n_tot<-rsobj$n_tot # number of simulated matrices k <- rsobj$k # number of columns of matrices n <- rsobj$n # number of rows of matrices # 1st step of calculating Q3h: Calculate the expected values res <- rstats(rsobj,Q3h.stat) # res contains vector with 1st column, 2nd column etc of each matrix as entries datmat <- matrix(unlist(res),nrow=k*n) # Contains the entries (columns-wise) of each matrix in each column exp <- matrix(apply(datmat, 1, mean), nrow=n, ncol=k) # 2nd step: Calculate Q3h based on the simulated matrices and the expected values res <- rstats(rsobj, calcQ3h.stat, exp=exp) # 3rd step: Calculate p-values (analogous to T1, T1m and T1l) res<-do.call(cbind, lapply(res,as.vector)) # converts result list to matrix Q3hvec<-apply(res, 1, function(x) sum(x[2:(n_tot)]0) print(round(val,digits=3)) else cat("none\n\n") } print.T1mobj<-function(x,alpha=0.05,...){ txT1m<-"\nNonparametric RM model test: T1m (multidimensionality - reduced inter-item correlations)\n" writeLines(strwrap(txT1m, exdent=4)) cat(" (counting cases with equal responses on both items)\n") cat("Number of sampled matrices:", x$n_eff,"\n") cat("Number of Item-Pairs tested:", length(x$prop),"\n") cat("Item-Pairs with one-sided p <", alpha,"\n") T1mmat<-x$T1mmat idx<-which(T1mmat0) print(round(val,digits=3)) else cat("none\n\n") } print.T1lobj<-function(x,alpha=0.05,...){ txt1<-"\nNonparametric RM model test: T1 (learning - based on item pairs)\n" writeLines(strwrap(txt1, exdent=4)) cat(" (counting cases with reponsepattern (1,1) for item pair)\n") cat("Number of sampled matrices:", x$n_eff,"\n") cat("Number of sampled matrices:", x$n_eff,"\n") cat("Number of Item-Pairs tested:", length(x$prop),"\n") cat("Item-Pairs with one-sided p <", alpha,"\n") T1lmat<-x$T1lmat idx<-which(T1lmat0) print(round(val,digits=3)) else cat("none\n\n") } print.T2obj<-function(x,...){ prop<-x$prop idx<-x$idx stat<-x$stat statnam<-switch(stat, "var"="variance", "mad1"="mean absolute deviation", "mad2"="median absolute deviation", "range"="range" ) txt<-"\nNonparametric RM model test: T2 (local dependence - model deviating subscales)\n" writeLines(strwrap(txt, exdent=4)) cat(" (increased dispersion of subscale person rawscores)\n") cat("Number of sampled matrices:", x$n_eff,"\n") cat("Items in subscale:", idx,"\n") cat("Statistic:", statnam,"\n") cat("one-sided p-value:",prop,"\n\n") # cat(" (proportion of sampled",statnam," GE observed)\n\n") } print.T2mobj<-function(x,...){ prop<-x$prop idx<-x$idx stat<-x$stat statnam<-switch(stat, "var"="variance", "mad1"="mean absolute deviation", "mad2"="median absolute deviation", "range"="range" ) txt<-"\nNonparametric RM model test: T2m (multidimensionality - model deviating subscales)\n" writeLines(strwrap(txt, exdent=4)) cat(" (decreased dispersion of subscale person rawscores)\n") cat("Number of sampled matrices:", x$n_eff,"\n") cat("Items in subscale:", idx,"\n") cat("Statistic:", statnam,"\n") cat("one-sided p-value:",prop,"\n\n") # cat(" (proportion of sampled",statnam," GE observed)\n\n") } print.T4obj<-function(x,...){ prop<-x$prop idx<-x$idx gr.nam<-x$gr.nam gr.n<-x$gr.n alternative<-x$alternative cat("\nNonparametric RM model test: T4 (Group anomalies - DIF)\n") txt<-paste(" (counting", alternative, "raw scores on item(s) for specified group)\n", collapse="") writeLines(strwrap(txt, exdent=4)) cat("Number of sampled matrices:", x$n_eff,"\n") cat("Items in Subscale:", idx,"\n") cat("Group:",gr.nam," n =",gr.n,"\n") cat("one-sided p-value:",prop,"\n\n") # cat(" (proportion of sampled raw scores GE observed)\n\n") } # removed in version 0.14-5 #print.T7obj<-function(x,...){ # prop<-x$prop # cat("\nNonparametric RM model test: T7 (different discrimination - 2PL)\n") # txt<-" (counting cases with response 1 on more difficult and 0 on easier item)\n" # writeLines(strwrap(txt, exdent=4)) # cat("Number of sampled matrices:", x$n_eff,"\n") # cat("Item Scores:\n") # print(x$itscor) # cat("one-sided p-value:",prop,"\n\n") #} #print.T7aobj<-function(x,...){ # prop<-x$prop # cat("\nNonparametric RM model test: T7a (different discrimination - 2PL)\n") # txt<-" (counting cases with response 1 on more difficult and 0 on easier item)\n" # writeLines(strwrap(txt, exdent=4)) # cat("Number of sampled matrices:", x$n_eff,"\n") # cat("Item Scores:\n") # print(x$itscor) # cat("\nItem-Pairs: (i>j ... i easier than j)\n\n") # print(round(prop,digits=3)) #} print.T10obj<-function(x,...){ spl.nam<-x$spl.nam prop<-x$prop hi.n<-x$hi.n low.n<-x$low.n txt<-"\nNonparametric RM model test: T10 (global test - subgroup-invariance)\n" writeLines(strwrap(txt, exdent=4)) cat("Number of sampled matrices:", x$n_eff,"\n") cat("Split:",spl.nam,"\n") cat("Group 1: n = ",hi.n," Group 2: n =",low.n,"\n") cat("one-sided p-value:",prop,"\n\n") # cat(" (proportion of sampled statistics GE observed)\n\n") } print.T11obj<-function(x,...){ prop<-x$prop txt<-"\nNonparametric RM model test: T11 (global test - local dependence)\n" writeLines(strwrap(txt, exdent=4)) txt<-" (sum of deviations between observed and expected inter-item correlations)\n" writeLines(strwrap(txt, exdent=4)) cat("Number of sampled matrices:", x$n_eff,"\n") cat("one-sided p-value:",prop,"\n\n") # cat(" (proportion of sampled sums GE observed)\n\n") } ## The following code was in included in version 0.16-3 print.Q3hobj<-function(x,alpha=0.05,...){ txt1<-"\nNonparametric RM model test: Q3h (local dependence - increased correlation of inter-item residuals)\n" writeLines(strwrap(txt1, exdent=4)) cat("Number of sampled matrices:", x$n_eff,"\n") cat("Number of Item-Pairs tested:", length(x$prop),"\n") cat("Item-Pairs with one-sided p <", alpha,"\n") Q3hmat<-x$Q3hmat idx<-which(Q3hmat0) print(round(val,digits=3)) else cat("none\n\n") } print.Q3lobj<-function(x,alpha=0.05,...){ txt1<-"\nNonparametric RM model test: Q3l (local dependence - decreased correlation of inter-item residuals)\n" writeLines(strwrap(txt1, exdent=4)) cat("Number of sampled matrices:", x$n_eff,"\n") cat("Number of Item-Pairs tested:", length(x$prop),"\n") cat("Item-Pairs with one-sided p <", alpha,"\n") Q3lmat<-x$Q3lmat idx<-which(Q3lmat0) print(round(val,digits=3)) else cat("none\n\n") } ## End of new code eRm/R/sim.2pl.R0000755000175100001440000000256714375241642012650 0ustar hornikuserssim.2pl <- function(persons, items, discrim = 0.25, seed = NULL, cutpoint = "randomized") { # simulation of Birnbaum's 2-PL (non-parallel ICCs) # violation is steered by the standard deviation sdlog. # meanlog in rlnorm is 0 which implies that the random numbers lie asymmetrically around 1. If sdlog = 0 the data are Rasch homogeneous. # For IRT applications, values up to 0.5 should be considered. if (length(items) == 1) { if (!is.null(seed)) set.seed(seed) schwierig <- rnorm(items) #standard normal distributed n.items <- items } else { schwierig <- items n.items <- length(items) } if (length(persons) == 1) { if (!is.null(seed)) set.seed(seed) faehig <- rnorm(persons) n.persons <- persons } else { faehig <- persons n.persons <- length(persons) } if (length(discrim) > 1) { alpha <- discrim } else { if (!is.null(seed)) set.seed(seed) alpha <- rlnorm(n.items, 0, sdlog = discrim) #discrimination parameter } psolve <- matrix(0, n.persons, n.items) for (i in 1:n.persons) for (j in 1:n.items) psolve[i,j]<-exp(alpha[j]*(faehig[i]-schwierig[j]))/(1+exp(alpha[j]*(faehig[i]-schwierig[j]))) if (cutpoint == "randomized") { if (!is.null(seed)) set.seed(seed) R <-(matrix(runif(n.items*n.persons),n.persons,n.items) < psolve)*1 } else { R <- (cutpoint < psolve)*1 } return(R) } eRm/R/summary.LR.r0000755000175100001440000000152214375241642013423 0ustar hornikuserssummary.LR <- function(object,...) # summary method for objects of class "LR" (from LRtest") { cat("\n") cat("Andersen LR-test: \n") cat("LR-value:", round(object$LR,3),"\n") cat("Chi-square df:",object$df,"\n") cat("p-value: ",round(object$pvalue,3),"\n") cat("\n") mt_vek <- apply(object$X,2,max,na.rm=TRUE) for (i in 1:length(object$betalist)) { cat("\n") cat("Subject Subgroup: ",object$spl.gr[i],":",sep="") cat("\n") cat("Log-likelihood: ",object$likgroup[i]) cat("\n\n") cat("Beta Parameters: \n") betavec <- object$betalist[[i]] if (!all(is.na(object$selist[[i]]))) { coeftable <- rbind(betavec,object$selist[[i]]) rownames(coeftable) <- c("Estimate","Std.Err.") print(coeftable) } else { print(betavec) } cat("\n") } } eRm/R/LRtest.Rm.R0000755000175100001440000002273014375241642013150 0ustar hornikusers`LRtest.Rm` <- function(object, splitcr = "median", se = TRUE) { # performs Andersen LR-test # object... object of class RM # splitcr... splitting criterion for LR-groups. "all.r" corresponds to a complete # raw score split (r=1,...,k-1), "median" to a median raw score split, # "mean" corresponds to the mean raw score split. # optionally also a vector of length n for group split can be submitted. # se...whether standard errors should be computed call<-match.call() spl.gr<-NULL X.original<-object$X if((length(splitcr) > 1) & is.character(splitcr)){ # if splitcr is character vector, treated as factor splitcr<-as.factor(splitcr) } if(is.factor(splitcr)){ spl.nam<-deparse(substitute(splitcr)) spl.lev<-levels(splitcr) spl.gr<-paste(spl.nam,spl.lev,sep=" ") splitcr<-unclass(splitcr) } numsplit<-is.numeric(splitcr) if (any(is.na(object$X))) { if (!numsplit && splitcr=="mean") { #mean split spl.gr<-c("Raw Scores < Mean", "Raw Scores >= Mean") X<-object$X # calculates index for NA groups # from person.parameter.eRm dichX <- ifelse(is.na(X),1,0) strdata <- apply(dichX,1,function(x) {paste(x,collapse="")}) gmemb <- as.vector(data.matrix(data.frame(strdata))) gindx<-unique(gmemb) rsum.all<-rowSums(X,na.rm=T) grmeans<-tapply(rsum.all,gmemb,mean) #sorted ngr<-table(gmemb) #sorted m.all<-rep(grmeans,ngr) #sorted,expanded rsum.all<-rsum.all[order(gmemb)] spl<-ifelse(rsum.all Median") # cat("Warning message: Persons with median raw scores are assigned to the lower raw score group!\n") X<-object$X # calculates index for NA groups # from person.parameter.eRm dichX <- ifelse(is.na(X),1,0) strdata <- apply(dichX,1,function(x) {paste(x,collapse="")}) gmemb <- as.vector(data.matrix(data.frame(strdata))) gindx<-unique(gmemb) rsum.all<-rowSums(X,na.rm=T) grmed<-tapply(rsum.all,gmemb,median) #sorted ngr<-table(gmemb) #sorted m.all<-rep(grmed,ngr) #sorted,expanded rsum.all<-rsum.all[order(gmemb)] spl<-ifelse(rsum.all<=m.all,1,2) splitcr<-spl object$X<-X[order(gmemb),] } } if (!is.numeric(splitcr)) { if (splitcr=="all.r") { #full raw score split ### begin MjM 2012-03-18 rvind <- rowSums(object$X, na.rm=TRUE) #person raw scoobject excl_0_k <- (rvind > 0) & (rvind < sum(apply(object$X, 2, max, na.rm=T))) Xlist <- by(object$X[excl_0_k,], rvind[excl_0_k], function(x) x) names(Xlist) <- as.list(paste("Raw Score =", sort(unique(rvind[excl_0_k])))) spl.gr <- unlist(names(Xlist)) } ### end MjM 2012-03-18 if (splitcr=="median") { #median split spl.gr<-c("Raw Scores <= Median", "Raw Scores > Median") #removed rh 2010-12-17 #cat("Warning message: Persons with median raw scores are assigned to the lower raw score group!\n") rv <- apply(object$X,1,sum,na.rm=TRUE) rvsplit <- median(rv) rvind <- rep(0,length(rv)) rvind[rv > rvsplit] <- 1 #group with highraw scoobject Xlist <- by(object$X,rvind,function(x) x) names(Xlist) <- list("low","high") } if (splitcr=="mean") { #mean split spl.gr<-c("Raw Scores < Mean", "Raw Scores >= Mean") rv <- apply(object$X,1,sum,na.rm=TRUE) rvsplit <- mean(rv) rvind <- rep(0,length(rv)) rvind[rv > rvsplit] <- 1 #group with highraw scoobject Xlist <- by(object$X,rvind,function(x) x) names(Xlist) <- list("low","high") } } if (is.numeric(splitcr)) { #manual raw score split spl.nam<-deparse(substitute(splitcr)) if (length(splitcr)!=dim(object$X)[1]) stop("Mismatch between length of split vector and number of persons!") if (any(is.na(splitcr))) stop("Split vector should not contain NA's") rvind <- splitcr Xlist <- by(object$X,rvind, function(x) x) names(Xlist) <- as.list(sort(unique(splitcr))) if(is.null(spl.gr)){ spl.lev<-names(Xlist) spl.gr<-paste(spl.nam,spl.lev,sep=" ") } } #----------item to be deleted--------------- del.pos.l <- lapply(Xlist, function(x) { it.sub <- datcheck.LRtest(x,object$X,object$model) #items to be removed within subgroup }) del.pos <- unique(unlist(del.pos.l)) if (length(del.pos) >= (ncol(object$X)-1)) { stop("\nNo items with appropriate response patterns left to perform LR-test!\n") } if(length(del.pos) > 0){ ### begin MjM 2013-01-27 warning(paste0( "\n", prettyPaste("The following items were excluded due to inappropriate response patterns within subgroups:"), "\n", paste(colnames(object$X)[del.pos], collapse=" "), "\n\n", prettyPaste("Full and subgroup models are estimated without these items!") ), immediate.=TRUE) } ### end MjM 2013-01-27 if (length(del.pos) > 0) { X.el <- object$X[,-(del.pos)] } else { X.el <- object$X } if(ifelse(length(splitcr) == 1, splitcr != "all.r", TRUE)){ ### begin MjM 2012-03-18 # for all cases except "all.r" Xlist.n <- by(X.el, rvind, function(y) y) names(Xlist.n) <- names(Xlist) if (length(del.pos) > 0) Xlist.n <- c(Xlist.n,list(X.el)) # X.el added since we must refit whole group without del.pos items } else { Xlist.n <- by(X.el[excl_0_k,], rvind[excl_0_k], function(y) y) names(Xlist.n) <- names(Xlist) Xlist.n <- c(Xlist.n,list(X.el[excl_0_k,])) # X.el added since we must refit whole group without del.pos items } ### end MjM 2012-03-18 if (object$model=="RM") { likpar <- sapply(Xlist.n,function(x) { #matrix with loglik and npar for each subgroup objectg <- RM(x,se=se) likg <- objectg$loglik nparg <- length(objectg$etapar) # betalab <- colnames(objectg$X) list(likg,nparg,objectg$betapar,objectg$etapar,objectg$se.beta,outobj=objectg) # rh outobj added ###list(likg,nparg,objectg$betapar,objectg$etapar,objectg$se.beta) # rh outobj added }) } if (object$model=="PCM") { likpar <- sapply(Xlist.n,function(x) { #matrix with loglik and npar for each subgroup objectg <- PCM(x,se=se) likg <- objectg$loglik nparg <- length(objectg$etapar) list(likg,nparg,objectg$betapar,objectg$etapar,objectg$se.beta,outobj=objectg) # rh outobj added ###list(likg,nparg,objectg$betapar,objectg$etapar,objectg$se.beta) # rh outobj added }) } if (object$model=="RSM") { likpar <- sapply(Xlist.n,function(x) { #matrix with loglik and npar for each subgroup objectg <- RSM(x,se=se) likg <- objectg$loglik nparg <- length(objectg$etapar) list(likg,nparg,objectg$betapar,objectg$etapar,objectg$se.beta,outobj=objectg) # rh outobj added ###list(likg,nparg,objectg$betapar,objectg$etapar,objectg$se.beta) # rh outobj added }) } ## extract fitted splitgroup models # rh 02-05-2010 if(ifelse(length(splitcr) == 1, splitcr != "all.r", TRUE)){ ### begin MjM 2012-03-18 fitobj <- likpar[6, 1:length(unique(rvind))] } else { fitobj <- likpar[6, 1:length(unique(rvind[excl_0_k]))] } ### end MjM 2012-03-18 likpar <- likpar[-6,] if((length(del.pos) > 0) | ifelse(length(splitcr) == 1, splitcr == "all.r", FALSE)) { #re-estimate full model ### MjM 2012-03-18 pos <- length(Xlist.n) #position of the full model loglik.all <- likpar[1,pos][[1]] #loglik full model # etapar.all <- rep(0,likpar[2,pos]) #etapar full model (filled with 0 for df computation) etapar.all <- rep(0, unlist(likpar[2,pos])) #etapar full model (filled with 0 for df computation) likpar <- likpar[,-pos] Xlist.n <- Xlist.n[-pos] } else { loglik.all <- object$loglik etapar.all <- object$etapar } loglikg <- sum(unlist(likpar[1,])) #sum of likelihood value for subgroups LR <- 2*(abs(loglikg-loglik.all)) #LR value df = sum(unlist(likpar[2,]))-(length(etapar.all)) #final degrees of freedom pvalue <- 1 - pchisq(LR, df) #pvalue betalist <- likpar[3,] #organizing betalist result <- list(X=X.original, X.list=Xlist.n, model=object$model,LR=LR, df=df, pvalue=pvalue, likgroup=unlist(likpar[1,],use.names=FALSE), betalist=betalist, etalist=likpar[4,],selist=likpar[5,], spl.gr=spl.gr, call=call, fitobj=fitobj) ## rh fitobj added class(result) <- "LR" return(result) } eRm/R/vcov.eRm.R0000755000175100001440000000032714375241642013053 0ustar hornikusers`vcov.eRm` <- function(object,...) { if (any(is.na(object$se.eta))) { vcmat <- NA } else { vcmat <- (solve(object$hessian)) #VC-matrix of the parameter estimates } return(vcmat) } eRm/R/thresholds.eRm.r0000755000175100001440000000571114375241642014317 0ustar hornikusersthresholds.eRm <- function(object) # uses matrix approach { #Computation of threshold parameters for polytomous models #object of class "eRm" (but not "dRm") if(object$model %in% c("LLTM", "RM")) stop("Threshold parameters are computed only for polytomous models!") if(object$model %in% c("LRSM", "LPCM")) { mpoints <- object$mpoints ngroups <- object$ngroups vecrep <- mpoints * ngroups } else { mpoints <- 1L ngroups <- 1L vecrep <- 1L } betapar <- object$betapar indmt <- apply(object$X, 2L, max, na.rm = TRUE) # number of categories per item mt_vek1 <- sequence(indmt[1L:(length(indmt)/mpoints)]) # 1 block of beta-items mt_vek <- rep(mt_vek1, vecrep) sq <- ifelse(mt_vek > 1, -1, 0) d1 <- diag(sq[-1L]) k <- length(betapar) d2 <- diag(k) d2[-k,-1L] <- d2[-k, -1L] + d1 T_mat <- t(d2) # MM 2010-02-20 threshpar <- -as.vector(T_mat %*% betapar) # vector with threshold parameters - fix: MM 2010-02-20 names(threshpar) <- paste("thresh", names(betapar)) vc.beta <- object$W %*% solve(object$hessian) %*% t(object$W) # VC matrix beta's se.thresh <- sqrt(diag( T_mat %*% vc.beta %*% t(T_mat) )) # standard errors of thresholds - fix: MM 2010-02-20 names(se.thresh) <- names(threshpar) blocks <- rep(1L:vecrep, each = length(mt_vek1)) thblock <- split(threshpar, blocks) #block of threshholds (as in design matrix) indmt1 <- indmt[1L:(length(indmt)/mpoints)] indvec <- rep(1L:length(indmt1), indmt1) threshtab.l <- lapply(thblock, function(x) { #list of table-blocks location <- tapply(x,indvec,mean) #location parameters thresh.l <- split(x, indvec) threshmat <- t(as.data.frame(lapply(thresh.l, function(i_th){ c(i_th, rep(NA, length.out=max(mt_vek)-length(i_th))) }))) colnames(threshmat) <- paste("Threshold", 1:dim(threshmat)[2]) parmat <- cbind("Location" = location, threshmat) }) #determine item names for block-table cnames <- colnames(object$X) ind.it <- rep(1L:mpoints, each = length(cnames)/mpoints) #item label index itnames1 <- as.vector(unlist(tapply(cnames, ind.it, function(x){ rep(x, ngroups) }))) rep.ind <- unlist(lapply(threshtab.l, nrow)) sp.ind <- rep(1L:length(rep.ind), rep.ind) names.l <- split(itnames1, sp.ind) #names as list for(i in seq_along(threshtab.l)) rownames(threshtab.l[[i]]) <- names.l[[i]] #name the items result <- list("threshpar" = threshpar, "se.thresh" = se.thresh, "threshtable" = threshtab.l) class(result) <- "threshold" return(result) } eRm/R/plotCI.R0000755000175100001440000000737614375241642012561 0ustar hornikusers# $Id: plotCI.R 1318 2009-05-08 21:56:38Z warnes $ plotCI <- function (x, y = NULL, uiw, liw = uiw, ui, li, err='y', ylim=NULL, xlim=NULL, type="p", col=par("col"), barcol=col, pt.bg = par("bg"), sfrac = 0.01, gap=1, lwd=par("lwd"), lty=par("lty"), labels=FALSE, add=FALSE, xlab, ylab, minbar, maxbar, ... ) { if (is.list(x)) { y <- x$y x <- x$x } if(invalid(xlab)) xlab <- deparse(substitute(x)) if(invalid(ylab)) { if(is.null(y)) { xlab <- "" ylab <- deparse(substitute(x)) } else ylab <- deparse(substitute(y)) } if (is.null(y)) { if (is.null(x)) stop("both x and y NULL") y <- as.numeric(x) x <- seq(along = x) } if(err=="y") z <- y else z <- x if(invalid(uiw)) uiw <- NA if(invalid(liw)) liw <- NA if(invalid(ui)) ui <- z + uiw if(invalid(li)) li <- z - liw if(!invalid(minbar)) li <- ifelse( li < minbar, minbar, li) if(!invalid(maxbar)) ui <- ifelse( ui > maxbar, maxbar, ui) if(err=="y") { if(is.null(ylim)) ylim <- range(c(y, ui, li), na.rm=TRUE) if(is.null(xlim) && !is.R() ) xlim <- range( x, na.rm=TRUE) } else if(err=="x") { if(is.null(xlim)) xlim <- range(c(x, ui, li), na.rm=TRUE) if(is.null(ylim) && !is.R() ) ylim <- range( x, na.rm=TRUE) } if(!add) { if(invalid(labels) || labels==FALSE ) plot(x, y, ylim = ylim, xlim=xlim, col=col, xlab=xlab, ylab=ylab, ...) else { plot(x, y, ylim = ylim, xlim=xlim, col=col, type="n", xlab=xlab, ylab=ylab, ...) text(x, y, label=labels, col=col, ... ) } } if(is.R()) myarrows <- function(...) arrows(...) # works only using R!! # else # myarrows <- function(x1,y1,x2,y2,angle,code,length,...) # { # segments(x1,y1,x2,y2,open=TRUE,...) # if(code==1) # segments(x1-length/2,y1,x1+length/2,y1,...) # else # segments(x2-length/2,y2,x2+length/2,y2,...) # } if(err=="y") { if(gap!=FALSE) gap <- strheight("O") * gap smidge <- par("fin")[1] * sfrac # draw upper bar if(!is.null(li)) myarrows(x , li, x, pmax(y-gap,li), col=barcol, lwd=lwd, lty=lty, angle=90, length=smidge, code=1) # draw lower bar if(!is.null(ui)) myarrows(x , ui, x, pmin(y+gap,ui), col=barcol, lwd=lwd, lty=lty, angle=90, length=smidge, code=1) } else { if(gap!=FALSE) gap <- strwidth("O") * gap smidge <- par("fin")[2] * sfrac # draw left bar if(!is.null(li)) myarrows(li, y, pmax(x-gap,li), y, col=barcol, lwd=lwd, lty=lty, angle=90, length=smidge, code=1) if(!is.null(ui)) myarrows(ui, y, pmin(x+gap,ui), y, col=barcol, lwd=lwd, lty=lty, angle=90, length=smidge, code=1) } ## _now_ draw the points (to avoid having lines drawn 'through' points) points(x, y, col = col, lwd = lwd, bg = pt.bg, type = type, ...) invisible(list(x = x, y = y)) } eRm/R/plotGR.R0000755000175100001440000000432414375241642012564 0ustar hornikusersplotGR <- function(object,...){ #TODO: *Add CI around point estimates # require(lattice) # MJM20141101: lattice is imported itms <- object$itms tps <- object$mpoints pplgrps <- object$ngroups/itms if(pplgrps<2) stop("There are no treatment effects in this analysis.") #treatment effects for all treatment groups at tps>1 treat <- object$etapar[1:((pplgrps-1)*itms*(tps-1))] time <- factor(rep(paste("t",2:tps,sep=""),each=itms*(pplgrps-1))) item <- factor(rep(rep(paste("Item",1:itms),each=pplgrps-1),tps-1)) names1 <- unique(names(object$groupvec))[1:(length(unique(names(object$groupvec))))-1] #labeling group <- factor(rep(names1,itms*(tps-1))) plotdats1 <- data.frame(treat,group,item,time) #effects (i.e. zeros) for all treatment groups at tp=1 treat0 <- rep(0,itms*(pplgrps-1)) time0 <- factor(rep("t1",each=itms*(pplgrps-1))) item0 <- factor(rep(paste("Item",1:itms),each=(pplgrps-1))) #labeling group0 <- factor(rep(names1,itms)) plotdats0 <- data.frame(treat0,group0,item0,time0) names(plotdats0) <- c("treat","group","item","time") #effects (i.e. zeros) for control or baseline group for all tps treat00 <- rep(0,itms*tps) time00 <- factor(rep(paste("t",1:tps,sep=""),each=itms)) item00 <- factor(rep(paste("Item",1:itms),tps)) group00 <- factor(rep(unique(names(object$groupvec))[length(unique(names(object$groupvec)))],itms*tps)) plotdats00 <- data.frame(treat00,group00,item00,time00) names(plotdats00) <- c("treat","group","item","time") #all together plotdats <- rbind(plotdats00,plotdats0,plotdats1) #plot key.group <- list(space = "right", text = list(levels(plotdats$group)), points = list(pch = 1:length(levels(plotdats$group)), col = "black") ) plotout <- xyplot(treat ~ time | item, plotdats, aspect = "xy", type = "o", groups = group, key = key.group, lty = 1, pch = 1:length(levels(plotdats$group)), col.line = "darkgrey", col.symbol = "black", xlab = "Time", ylab = "Effect", main = "Treatment effect plot for LLRA" ) print(plotout) } eRm/R/print.ifit.R0000755000175100001440000000304214375241642013437 0ustar hornikusers`print.ifit` <- function(x, visible = TRUE, sort_by = c("none", "p", "outfit_MSQ", "infit_MSQ", "outfit_t", "infit_t", "discrim"), decreasing = FALSE, digits = 3, ...) # print method for itemfit # x...object of class "ifit" from (itemfit) { sort_by <- match.arg(sort_by, c("none", "p", "outfit_MSQ", "infit_MSQ", "outfit_t", "infit_t", "discrim"), several.ok = FALSE) pvalues <- 1-pchisq(x$i.fit,x$i.df-1) coef.table <- cbind(round(x$i.fit,digits), x$i.df-1, round(pvalues,digits), round(x$i.outfitMSQ, digits), round(x$i.infitMSQ, digits),round(x$i.outfitZ, digits),round(x$i.infitZ, digits), round(x$i.disc, digits)) colnames(coef.table) <- c("Chisq","df","p-value","Outfit MSQ", "Infit MSQ", "Outfit t", "Infit t", "Discrim") rownames(coef.table) <- names(x$i.fit) ## sort if (length(sort_by) == 6) sort_by <- "none" if (sort_by != "none") { sort_by <- sort_by[1] if (sort_by == "p") sortcol <- 3 if (sort_by == "outfit_MSQ") sortcol <- 4 if (sort_by == "infit_MSQ") sortcol <- 5 if (sort_by == "outfit_t") sortcol <- 6 if (sort_by == "infit_t") sortcol <- 7 if (sort_by == "discrim") sortcol <- 8 if (sort_by != "discrim") { ind <- order(abs(coef.table[, sortcol]), decreasing = decreasing) } else { ind <- order(coef.table[, sortcol], decreasing = decreasing) } coef.table <- coef.table[ind,] } if (visible){ cat("\nItemfit Statistics: \n") print(coef.table) cat("\n") } invisible(coef.table) } eRm/R/IC.ppar.r0000755000175100001440000000533614375241642012655 0ustar hornikusersIC.ppar <- function(object) { #computes loglik, AIC, BIC, and cAIC for JML, MML, CML #object of class ppar #---------- full likelihood ---------- X <- object$X if (length(object$pers.ex) > 0) X01 <- object$X01[-object$pers.ex,] else X01 <- object$X01 mt_vek <- apply(X,2,max,na.rm=TRUE) #number of categories - 1 for each item mt_ind <- rep(1:length(mt_vek),mt_vek) mt_seq <- sequence(mt_vek) gmemb <- object$gmemb pmat <- pmat(object) pmat.l0 <- tapply(1:length(mt_ind),mt_ind, function(ind) { #expand pmat for 0-th category vec0 <- 1-rowSums(as.matrix(pmat[,ind])) #prob for 0th category cbind(vec0,pmat[,ind]) }) pmat0 <- matrix(unlist(pmat.l0),nrow=length(gmemb)) #X01 matrix 0th category included X01.l0 <- tapply(1:length(mt_ind), mt_ind, function(ind) { #expand X01 for 0-th category vec0 <- 1-rowSums(as.matrix(X01[,ind])) #prob for 0th category cbind(vec0,X01[,ind]) }) X010 <- matrix(unlist(X01.l0),nrow=length(gmemb)) #X01 matrix 0th category included loglik.full <- sum(log(na.exclude(pmat0[X010 == 1]))) #vector of "observed" solving probabilities N.ex <- dim(object$X.ex)[1] #number of persons (excluded) npar.full <- (dim(object$W)[2])+sum(object$npar) #number of item + person parameters AIC.full <- -2*loglik.full + 2*npar.full BIC.full <- -2*loglik.full + log(N.ex)*npar.full cAIC.full <- -2*loglik.full + log(N.ex)*npar.full + npar.full fullvec <- c(loglik.full, npar.full, AIC.full, BIC.full, cAIC.full) #------------ MML ----------- N <- dim(object$X)[1] rv <- rowSums(object$X, na.rm = TRUE) #person raw scores npar.mml <- (dim(object$W)[2])#+(length(table(rv))) lmml <- sum(table(rv)*log(table(rv)/N))+object$loglik.cml #MML likelihood AIC.mml <- -2*lmml + 2*npar.mml BIC.mml <- -2*lmml + log(N)*npar.mml cAIC.mml <- -2*lmml + log(N)*npar.mml + npar.mml mmlvec <- c(lmml, npar.mml, AIC.mml, BIC.mml, cAIC.mml) #------------- CML --------------- npar.cml <- dim(object$W)[2] lcml <- object$loglik.cml AIC.cml <- -2*lcml + 2*npar.cml BIC.cml <- -2*lcml + log(N)*npar.cml cAIC.cml <- -2*lcml + log(N)*npar.cml + npar.cml cmlvec <- c(lcml, npar.cml, AIC.cml, BIC.cml, cAIC.cml) ICtable <- rbind(fullvec, mmlvec, cmlvec) rownames(ICtable) <- c("joint log-lik", "marginal log-lik", "conditional log-lik") colnames(ICtable) <- c("value", "npar", "AIC", "BIC", "cAIC") result <- list(ICtable = ICtable) class(result) <- "ICr" result } eRm/R/pmat.ppar.R0000755000175100001440000000462214375241642013260 0ustar hornikusers`pmat.ppar` <- function(object) # computes a list of expected probabilities for objects of class "ppar" for each NA-subgroup # without category! { X <- object$X mt_vek <- apply(X,2,max,na.rm=TRUE) #number of categories - 1 for each item mt_ind <- rep(1:length(mt_vek),mt_vek) rp <- rowSums(X,na.rm=TRUE) maxrp <- sum(mt_vek) TFrow <- ((rp==maxrp) | (rp==0)) pmat.l <- lapply(object$thetapar, function(theta1) { #runs over missing structures theta <- theta1 p.list <- tapply(object$betapar,mt_ind,function(beta.i) { #matrices of expected prob as list (over items) beta.i <- c(0,beta.i) ind.h <- 0:(length(beta.i)-1) theta.h <- ind.h %*% t(theta) tb <- exp(theta.h+beta.i) denom <- colSums(tb) pi.mat <- apply(tb,1,function(y) {y/denom}) return(pi.mat) }) p.list0 <- lapply(p.list,function(pl) {rbind(pl)[,-1]}) #delete 0th category pmat <- matrix(unlist(p.list0),nrow=length(theta1)) #save as matrix return(pmat) }) #----------item-category labels---------- cnames <- substr(names(object$betapar),6,40) for (i in 1:length(pmat.l)) dimnames(pmat.l[[i]]) <- list(names(object$thetapar[[i]]),cnames) #-----------end labels------- if (length(object$pers.ex) > 0) { X <- object$X[-object$pers.ex,] #list with raw scores X01 <- object$X01[-object$pers.ex,] } else { X <- object$X X01 <- object$X01 } NApos <- tapply(1:length(object$gmemb),object$gmemb,function(ind) { #positions for NA replacement xvec <- X01[ind[1],] which(is.na(xvec)) }) pmat <- NULL for (i in 1:length(pmat.l)) { pmat.l[[i]][,NApos[[i]]] <- NA #insert NA's pmat <- rbind(pmat,pmat.l[[i]]) } #-------------- reorder the p-matrix --------------- ind.orig <- as.vector(unlist(tapply(1:length(object$gmemb), object$gmemb, function(ind) {ind}))) pmat.orig.list <- by(pmat, ind.orig, function(ii) return(ii)) pmat.orig <- as.matrix(do.call(rbind, pmat.orig.list)) #final P-matrix (corresponding to X) rownames(pmat.orig) <- rownames(X) return(pmat.orig) } eRm/R/print.gof.R0000755000175100001440000000057014375241642013262 0ustar hornikusersprint.gof <- function(x, ...) { #print method for objects of class "gof" (from gofIRT.ppar) cdv <- round(x$test.table[1,], 3) cat("\nGoodness-of-Fit Results:") cat("\nCollapsed Deviance = ", cdv[1], " (df = ", cdv[2], ", p-value = ", cdv[3], ")", sep ="") cat("\nPearson R2:", round(x$R2$R2.P, 3)) cat("\nArea Under ROC:", round(x$AUC, 3)) cat("\n\n") }eRm/R/RM.R0000755000175100001440000000353214375241642011673 0ustar hornikusers`RM` <- function(X, W, se = TRUE, sum0 = TRUE, etaStart) { #...X: 0/1 person*item matrix #-------------------main programm------------------- call<-match.call() groupvec <- 1 mpoints <- 1 model <- "RM" if (missing(W)) W <- NA else W <- as.matrix(W) if (missing(etaStart)) etaStart <- NA else etaStart <- as.vector(etaStart) XWcheck <- datcheck(X,W,mpoints,groupvec,model) #inital check of X and W X <- XWcheck$X lres <- likLR(X,W,mpoints,groupvec,model,st.err=se,sum0,etaStart) parest <- lres$parest #full groups for parameter estimation loglik <- -parest$minimum #log-likelihood value iter <- parest$iterations #number of iterations convergence <- parest$code etapar <- parest$estimate #eta estimates betapar <- as.vector(lres$W%*% etapar) #beta estimates if (se) { se.eta <- sqrt(diag(solve(parest$hessian))) #standard errors se.beta <- sqrt(diag(lres$W%*%solve(parest$hessian)%*%t(lres$W))) #se beta } else { se.eta <- rep(NA,length(etapar)) se.beta <- rep(NA,length(betapar)) } X01 <- lres$X01 labs <- labeling.internal(model,X,X01,lres$W,etapar,betapar,mpoints,max(groupvec)) #labeling for L-models W <- labs$W etapar <- labs$etapar betapar <- labs$betapar etapar <- -etapar # output difficulty rh 25-03-2010 npar <- dim(lres$W)[2] #number of parameters result <- list(X=X,X01=X01,model=model,loglik=loglik,npar=npar,iter=iter,convergence=convergence, etapar=etapar,se.eta=se.eta,hessian=parest$hessian,betapar=betapar, se.beta=se.beta,W=W,call=call) class(result) <- c("dRm","Rm","eRm") #classes: dichotomous RM, RM (RM, PCM, RSM), and extended RM (all) result } eRm/R/plotGOF.R0000755000175100001440000000124614375241642012667 0ustar hornikusers`plotGOF` <- function(x, beta.subset = "all", main = "Graphical Model Check", xlab, ylab, tlab = "item", xlim, ylim, type = "p", pos = 4, conf = NULL, ctrline = NULL, smooline = NULL, asp = 1, x_axis = TRUE, y_axis = TRUE, set_par = TRUE, reset_par = TRUE, ...) UseMethod("plotGOF")eRm/R/rstats.R0000755000175100001440000000136614473215436012701 0ustar hornikusers"rstats" <- function(RSobj,userfunc,...) { obj.name <- deparse(substitute(RSobj)) if (!("RSmpl" %in% class(RSobj) || "RSmplext" %in% class(RSobj))){ err.text<-paste(obj.name," is not a sample object - see help(\"rsextrobj\")",sep ="",collapse="") stop(err.text) } # extracts simulated matrices into three dimensional array sim n_tot <- RSobj$n_tot n <- RSobj$n k <- RSobj$k nwords <- c(trunc((k+31)/32)) # store coded simulated matrices in list with n_eff+1 elements sim<-split(RSobj$outvec,gl(n_tot,n*nwords)) # decode simulated matrices and apply user function #RET<-unlist(lapply(sim,rsunpack,n,k,nwords,userfunc)) RET<-lapply(sim,rsunpack,n,k,nwords,userfunc,...) RET } eRm/R/print.ICr.r0000755000175100001440000000024614375241642013224 0ustar hornikusersprint.ICr <- function(x,...) { #print method for objects of class "ICr" (from function "IC") cat("\nInformation Criteria: \n") print(x$ICtable) cat("\n") }eRm/R/plotICC.Rm.R0000755000175100001440000001557614375241642013242 0ustar hornikusers# produces ICC plots # object of class Rm plotICC.Rm <- function( object, item.subset = "all", empICC = NULL, empCI = NULL, mplot = NULL, # ask,mplot added rh 2007-12-01 xlim = c(-4,4), ylim = c(0,1), xlab = "Latent Dimension", ylab = "Probability to Solve", main = NULL, # main rh 2010-03-06 col = NULL, lty = 1, legpos = "left", ask = TRUE, ...) { # save and reset original graphics parameters old_par <- par(mar = c(4,4,3,1)+.25, no.readonly = TRUE) on.exit(par(old_par)) if(item.subset != "all" && length(item.subset) == 1L) ask <- FALSE X <- object$X if(is.null(col)) col <- 1:(max(apply(X, 2L, max, na.rm = TRUE))+1) main.arg <- main # rh added 2010-11-23 otherwise always same item in title if NULL # some sanity checks if(is.null(empICC)){ emp.plot <- FALSE } else if(!(empICC[[1L]] %in% c("raw", "loess", "tukey", "kernel"))) { emp.plot <- FALSE warning('empICC must be one of "raw", "loess", "tukey", "kernel"!\n') } else if(object$model != "RM"){ warning("Empirical ICCs can only be plotted for a dichotomous Rasch model!\n") emp.plot <- FALSE } else { th.est <- person.parameter(object) thetapar <- th.est$thetapar if(length(thetapar) != 1) { # Too complicated with NA'groups (for each NAgroup separate plots...) warning("Empirical ICCs are not produced for different NA groups!\n") emp.plot <- FALSE } else { thetapar.u <- unique(round(unlist(thetapar), 5)) if(length(thetapar.u) < 4){ warning("No empirical ICCs for less the 4 different person parameters!\n") emp.plot <- FALSE } else { emp.plot <- TRUE } } } theta <- seq(xlim[1], xlim[2], length.out = 201L) # x-axis p.list <- plist.internal(object, theta) # matrix of probabilities th.ord <- order(theta) if(any(item.subset=="all")){ textlab <- colnames(object$X) ivec <- seq_along(p.list) } else { if(is.character(item.subset)){ #item names specified ivectemp <- matrix(seq_along(p.list), nrow = 1L) colnames(ivectemp) <- colnames(object$X) ivec <- ivectemp[, item.subset] textlab <- item.subset textlab[ivec] <- textlab it.legend <- item.subset } else { #numeric vector specified textlab <- colnames(object$X)[item.subset] textlab[item.subset] <- textlab ivec <- item.subset } } if(object$model=="RM"){ # Rasch model p.list <- lapply(p.list,function(x) {x[,-1]}) # Delete 0-probabilites p.mat <- matrix(unlist(p.list),ncol=length(p.list)) # matrix with solving probabilities text.ylab <- p.mat[(1:length(theta))[theta==median(theta)],] } ## plot for non RMs ################# if(object$model != "RM"){ if(ask) par("ask" = TRUE) # added rh 2007-12-01 if(is.null(mplot)) mplot <- FALSE if(mplot) par(mfrow = c(2L, 2L)) for(j in seq_along(ivec)){ # loop for items i <- ivec[j] yp <- as.matrix(p.list[[i]]) yy <- yp[th.ord,] if(is.null(main.arg)) main <- paste0("ICC plot for item ", textlab[i]) # rh 2010-03-06 matplot(sort(theta),yy,type="l",lty=lty,col=col, #main=paste("ICC plot for item ",textlab[i]),xlim=xlim, # replaced to allow for user titles rh 2010-03-06 main=main, xlim=xlim, ylim=ylim,xlab=xlab,ylab=ylab,...) if(is.character(legpos)) legend(legpos, legend = paste0(c("Category "), 0:(dim(yp)[2]-1)), col = col, lty = lty, ...) # added rh 2007-12-01 } ## plot for RMs ##################### } else { if(is.null(mplot)) mplot <- TRUE ### FIX MM 2012-03-18 if(length(ivec) == 1) mplot <- FALSE ### FIX MM 2012-03-18 if(mplot) par(mfrow = c(2L, 2L)) if(ask) par("ask" = TRUE) # added rh 2007-12-01 for(j in seq_along(ivec)){ #runs over items i <- ivec[j] yp <- as.matrix(p.list[[i]]) yy <- yp[th.ord,] if(is.null(main.arg)) main<-paste("ICC plot for item ",textlab[i]) # rh 2010-03-06 matplot(sort(theta),yy,type="l",lty=lty,col=col, #main=paste("ICC plot for item ",textlab[i]),xlim=xlim, # replaced to allow for user titles rh 2010-03-06 main=main, xlim=xlim, ylim=ylim,xlab=xlab,ylab=ylab,...) ##ylim=ylim,xlab=xlab,ylab=ylab,"ask"=TRUE,...) ## empirical ICC if(emp.plot){ freq.table <- as.matrix(table(rowSums(X), X[,i])) rel.freq <- freq.table[,2]/rowSums(freq.table) idx <- as.numeric(rownames(freq.table)) xy <- cbind(th.est$pred.list[[1]]$y[idx+1], rel.freq) if(empICC[[1]]=="loess") if(!is.null(empICC$smooth)) smooth <- empICC$smooth else smooth <- 0.75 if(empICC[[1]]=="kernel") if(!is.null(empICC$smooth)) smooth <- empICC$smooth else smooth <- 0.5 nn <- rowSums(freq.table) switch(empICC[[1]], "raw"={}, "loess"={xy[,2]<-loess(xy[,2]~xy[,1],span=smooth)$fitted},#+;cyf<-cbind(xy[,2] * nn, nn)}, "tukey"={xy[,2]<-smooth(xy[,2])},#;cyf<-cbind(xy[,2] * nn, nn)} "kernel"={xy[,2]<-ksmooth(xy[,1],xy[,2],bandwidth=smooth,x.points=xy[,1])[[2]]} ) xy[,2] <- ifelse(xy[,2] > 1, 1, ifelse(xy[,2] < 0, 0, xy[,2])) # bounding p in [0,1] if(is.null(empICC$type)) empICC$type <- "p" if(is.null(empICC$pch)) empICC$pch <- 1 if(is.null(empICC$col)) empICC$col <- "black" if(is.null(empICC$lty)) empICC$lty <- "solid" # confidence intervals for empirical ICC if(!is.null(empCI)) { # functions from prop.test() p.L <- function(x, n, alpha){ if (x <= 0) 0 else qbeta(alpha, x, n - x + 1) } p.U <- function(x, n, alpha){ if (x >= n) 1 else qbeta(1 - alpha, x + 1, n - x) } CINT <- function(x, n, conf.level){ alpha <- (1 - conf.level)/2 c(p.L(x,n, alpha), p.U(x,n, alpha)) } if(is.null(empCI$clevel)) empCI$clevel <- 0.95 if(is.null(empCI$col)) empCI$col <- "red" if(is.null(empCI$lty)) empCI$lty <- "dotted" cyf <- cbind(xy[,2L]*nn, nn) cy <- apply(cyf, 1L, function(x){ CINT(x[1L], x[2L], empCI$clevel) }) apply(cbind(xy[,1L], t(cy)), 1L, function(x){ segments(x[1L],x[2L],x[1L],x[3L],lty=empCI$lty,col=empCI$col) }) } # plots the point estimates of the empirical ICC lines(xy[,1], xy[,2], type = empICC$type, pch = empICC$pch, col = empICC$col, lty = empICC$lty, ...) } # end if(emp.plot) } } } eRm/R/llra.datprep.R0000755000175100001440000000263214375241642013745 0ustar hornikusersllra.datprep<-function(X, mpoints, groups, baseline=NULL){ Xwide <- X if (ncol(Xwide) %% mpoints > 0) stop("Number of items must be the same for each timepoint.") nitems <- dim(Xwide)[2]/mpoints if(missing(groups)) groups <- rep("CG",dim(Xwide)[1]) covs.prep<-function(groups,baseline){ groups<-as.matrix(groups) grstr<-apply(groups,1,paste,collapse=":") grstr <- factor(grstr) if(!is.null(baseline)) { basel <- paste(baseline,collapse=":") grstr <- relevel(grstr,basel) } cov.groupvec<-as.numeric(grstr) names(cov.groupvec)<-grstr cov.groupvec } # sort data according to cov.groupvec cov.groupvec<-covs.prep(groups,baseline) Xwide<-Xwide[order(cov.groupvec,decreasing=TRUE),] cov.groupvec<-sort(cov.groupvec) # number of people per group grp_n<-table(cov.groupvec) names(grp_n)<-unique(names(cov.groupvec)) # convert to long format Xlong <- matrix(unlist(Xwide), ncol = mpoints) # assignment vector item x treatment assign.vec <- as.vector(sapply(1:nitems, function(i) cov.groupvec + (i-1)*max(cov.groupvec))) assign.vec <- rev(assign.vec) assign.vec <- abs(assign.vec-max(assign.vec))+1 names(assign.vec)<-rev(rep(names(cov.groupvec),nitems)) list(X=Xlong, assign.vec=assign.vec, grp_n=grp_n, nitems=nitems) } eRm/R/IC.r0000755000175100001440000000005214375241642011702 0ustar hornikusers`IC` <- function(object)UseMethod("IC") eRm/R/phi.range.R0000755000175100001440000000023114375241642013221 0ustar hornikusers"phi.range" <- function(mat){ cmat<-cor(mat)+diag(NA,ncol(mat)) ma<-max(cmat,na.rm=TRUE) mi<-min(cmat,na.rm=TRUE) RET <- ma-mi RET } eRm/MD50000644000175100001440000002641414505226141011332 0ustar hornikusers439cbcf5c24e67b223c994457885a273 *DESCRIPTION 9719bdf13eb405b815399845a578d879 *NAMESPACE d2d22f8b2176c97ca7df720f7a089794 *R/IC.default.R 2bedf16f88332f159bfad9cdb36f4689 *R/IC.ppar.r 2e4b547352dd7af179635bc46f9cdf87 *R/IC.r 4bf43e52d582082bb387c70910851f74 *R/LLRA.R 7826640f34c84fbb51764108b0961824 *R/LLTM.R bf407bc699aa2a8a6bb1e507cc32f049 *R/LPCM.R 559e1ab0a83b6e78e7ae67ddb4a41b1e *R/LRSM.R 1f36a87476e55123248725365c74d9bf *R/LRtest.R beef04d08b4afd9f116efe89cf55396c *R/LRtest.Rm.R 84fce84bef7d147fee133562dbaf065c *R/MLoef.R a89307616e4411dbc299a0f1a2f4013a *R/NPtest.R bbd93fc79991f98878c94fff0bcfaf30 *R/PCM.R 98e3e15a1b79501b15a45a0e9cf3e7bf *R/PersonMisfit.R 136ebfb819fe8287b48d0d33c194815d *R/RM.R 8f3a897135420e5fb99b1adebc4c8765 *R/ROCR_aux.R 83e714c0d5bd37f8299292e3bf574a09 *R/RSM.R bc7be7af543fb355b3452bade6befcef *R/Rsquared.R 38d0a77248a5d30a8ff7d2be2549d89f *R/SepRel.R f2527f30f48fcf4cfda14c9951186ead *R/Waldtest.R e3cc111546e6458ff6baa890d1e54e7c *R/Waldtest.Rm.R 0c232a63ae4fb206d91678d2b9c30f1a *R/anova.eRm.R ba403c28ae655f2a76c605d43123512c *R/anova.llra.R b2e5064d8aa93edded5747f9f64f315c *R/build_W.R a8aa6e591ab2b76117211cdef4cdcf52 *R/checkdata.R 40e9100130fde20aa73a04818d9909b3 *R/cldeviance.R 013c3532078f0f62c326f5f7fe10e23e *R/cmlprep.R 9f91686f144add619bbaaec474974fbb *R/coef.eRm.R e7bc0b0d98d621a66a84a196d057c00b *R/coef.ppar.R 2a665e30eb32b2b8b9a7ee2cb846831b *R/collapse_W.R 323a5c6fe9d49f18031aeeff22de0ee5 *R/confint.eRm.r a98e2b8f8c0dc9f184159e94c210611b *R/confint.ppar.r fd0612d832c6044df83689d42631a9af *R/confint.threshold.r b9da6dc9d83605723db2e81c69fd81b8 *R/cwdeviance.r 9f6fff516f1257a642e18175e82ec53d *R/datcheck.LRtest.r 4c96fecd0305d59cb4c7433f54c63125 *R/datcheck.R 3ed2f9de5c5ec9a4d3dd66b40e0425d1 *R/datprep_LLTM.R b9868aa42173751e8d9fd8a1a16c49e1 *R/datprep_LPCM.R 5bd2486b21ae4a9f196c7445aea4c958 *R/datprep_LRSM.R 8eff0f65d596844d9810c3cfa58bc0a2 *R/datprep_PCM.R ca0af91c768a48fff0782a8b92d5ed9d *R/datprep_RM.R 977fc96896e111fcf2692e274d9be346 *R/datprep_RSM.R 8dc12ddd263a8642fd9e72b7fb905b4b *R/fitcml.R 4878fc213dcd9d9a0b3b59353f06eebe *R/gofIRT.R 57242fed1520c63de85bdc52e6a70c31 *R/gofIRT.ppar.R f9850156706dcad20dfedfc80c220b04 *R/hoslem.R 71212f4c14003458fc3e30638f339629 *R/invalid.R 3b9efec2c24655b49b709ac1b9fe82e1 *R/item_info.R e2acfcf0f69a54046e7500f37b11cce7 *R/itemfit.R 4316db130afb259b399966aac32b051f *R/itemfit.ppar.R d12c6019315fbc11dca8ce109e1883ab *R/labeling.internal.r b442d226c694aed7bc57103a009bc7ef *R/likLR.R 9c56aa9ca79069fd2fa2a02f14d8e7b4 *R/llra.datprep.R 927abf7f0a6f93732d2a2365f67df008 *R/llra.internals.R 5bea9ef9bfb310d9d57960b335cc6e2f *R/logLik.eRm.r 6f889b8ad497988f236902afa009cba3 *R/logLik.ppar.r a4b58be8d00e8a61a442e6e7f5709138 *R/model.matrix.eRm.R a6b7d14e41d61615570f0887ee96c4cc *R/performance.R ad14b6669d085f886f032ff60fd2643b *R/performance_measures.R 166e801703a416aa2a2cdbde298651db *R/performance_plots.R adabedf84b1cecfce267c7be91d7cbbb *R/person.parameter.R 63adfc67f4d2a3a4f2f413b5142ee01e *R/person.parameter.eRm.R 1580451632297ddae0e4ae6c262a9bb0 *R/personfit.R 15a3f4fa5f0cd5dc7fc051e1b8cfb0b8 *R/personfit.ppar.R 37383b86a5a2d72e3c196556e3eaf09c *R/phi.range.R 2da3e508955ee682575545a4386caf98 *R/pifit.internal.R 4fd3e6bc84d8590d22bcbd1f7ff8c0d0 *R/plist.internal.R f57714dbe81ed2a76321d62598d810d7 *R/plot.ppar.r fa5b8a3513fcdf05e0533c7549d7adb7 *R/plotCI.R 37dcc904261c3584396ba4f73d210485 *R/plotDIF.R e48371dabb5391299c0bfe2d343dab71 *R/plotGOF.LR.R 1c269a725ebdda2824ca8092dd8c7348 *R/plotGOF.R 5194f5d3f572f07456c9364c6a23eb29 *R/plotGR.R c65fe90a731609939b208064669aa5c6 *R/plotICC.R 3cb469fc8bcecbaa8c600776f3794196 *R/plotICC.Rm.R 934bef0d1f912fe72e7d9f5b7b8efbb6 *R/plotINFO.R 3bf4d1afa311698cdf6c68d3d272515a *R/plotPImap.R 166d058dc492f9c34316dad641cae170 *R/plotPWmap.R 174d96eea6f45dba27f4b701573da45b *R/plotTR.R f3331bb586c29beaa1c691caf9a4f50e *R/plotjointICC.R e50b7c7339afc9e95ceb7507bdf6d3c4 *R/plotjointICC.dRm.R 503d39882ff1519f9a9c822525df881b *R/pmat.R 978c189f51d4c525f6a1d53377c72fab *R/pmat.default.R 3b8b125515c56d967e0184d9bae4fe87 *R/pmat.ppar.R 75667db3c392cce69583eb02f93739bb *R/predict.ppar.R c6520d9937a5432bba0921b1c1ddc154 *R/prediction.R 2ef33bcb8ff18bada70cc9cd28167b6b *R/print.ICr.r e419bb90c13b3e34d60f809d2aab7a8c *R/print.LR.R baa854c72760319d47628d9cdeab5847 *R/print.MLoef.r 6321ea71362e6d0e7baa24913ffaf7cc *R/print.PersonMisfit.R 4fab83773c727ff7382af7fdf6788656 *R/print.eRm.R c5312a2efff02316933e78574a2d7072 *R/print.gof.R 10dc2f8c8802ab9c867cba7bfecab589 *R/print.ifit.R eceef6e388090c985b69bb7495fd898b *R/print.llra.R 37817e03ebd0e3395fb011928892e97b *R/print.logLik.eRm.R e7e35e2b4d5cfd70f341b852793c0e4b *R/print.logLik.ppar.r ae0c91d5cdfde5d20945fc0e804708f7 *R/print.pfit.R 22c7359fd707bd836a258c6e02f484b3 *R/print.ppar.R cb2c9116b9ede352bb567fa9eb8ac393 *R/print.resid.R 45ce31571c765ec1a1bb87a16ff82184 *R/print.step.r 22252f71f8a50bf9726528501c70b443 *R/print.summary.llra.R 5aa80f82e5e72c24602c8525b6389d71 *R/print.threshold.r 2ba6872ce486a3b88889f50ab34046f1 *R/print.wald.R 681692c0b23c20c07fd6e27eb6823d03 *R/residuals.ppar.R 7a34777d662d5c0f5c9c1e473bf52746 *R/rostdeviance.r 8c15da19ec72fd9a7af3204059c42a4b *R/rsampler.R 58c7acdcb60e5fef2d4bad8ff79f3751 *R/rsctrl.R 14341cef1bad5ef9d689318c2671b31d *R/rserror.R 436aeb1e75c25d0ccc14890e440e2748 *R/rsextrmat.R a8e81b44711fb6015d4ade7bed501d84 *R/rsextrobj.R 2d74c76df1f353579678f7c7b1e94dc5 *R/rstats.R e1414590f20a4138cd04abda1c5066f4 *R/rsunpack.R b3f9c25354a6b9bddf925bcab2648687 *R/sim.2pl.R 4b54d34fbb18f74fac3b93da2c11a84f *R/sim.locdep.R f882b1817e7bbcef9b27c276f257a626 *R/sim.rasch.R 74ee5835cc74c86395748a51c3e87073 *R/sim.xdim.R 50fba0ca19951546155a7d644228d24f *R/stepwiseIt.R ec78daaa3f45ed12a62e483f3ee1ce63 *R/stepwiseIt.eRm.R a389fc4a22eb006dd3226f10f8790f58 *R/summary.LR.r 65d0e9b84e5f96d02e9de47a6e8a5a90 *R/summary.MLoef.r 25e277c8cd2e0fa4e581d554c9771967 *R/summary.PersonMisfit.R ad5211ab843e04ee7e0564032f0a5f1e *R/summary.RSctr.R bb58a9a1c07452f36f935b101a61e52a *R/summary.RSmpl.R c164f97f003fe597393346ebc34ed98f *R/summary.RSmplext.R e6db9b0df7e9ea045e8b57d0f7a13f8b *R/summary.eRm.R a201d1040cd729f62e09a45ff0402957 *R/summary.gof.R c03bb3ccc34c43a90ce88a799cda8cc3 *R/summary.llra.R bde67b4f83ca342816e87e9c39fde213 *R/summary.ppar.R d28668718027ba4f7d4210dcac0c6b76 *R/summary.threshold.r a00c44137f3f341aa1a71db916a38a85 *R/test_info.R a6419721b8ee926aa7c97c9810fa0de9 *R/thresholds.eRm.r 3c6f6ec631aeacf22e73fadf8074fc12 *R/thresholds.r 54259c5861ddc4a41474b0f47dc7ff13 *R/vcov.eRm.R 68dade378c849fd1b1e7f539aaf0f1e5 *R/zzz.R 7080893e02c49cd296d4424b9be55069 *build/partial.rdb 7deffd77acc8c19d20b26bba82526153 *build/vignette.rds 460165565169b8896f2b34d3bcb8b384 *data/llraDat1.rda 6eff759b3773b364f2b80dfc1dfd48c2 *data/llraDat2.rda 75011d511f7f8ef5815d3dd46e3b01b9 *data/llradat3.rda cea390751c663db78489b12d83d1d808 *data/lltmdat1.rda 09788d4ec22cfb172bff75452802ed2e *data/lltmdat2.rda dca73c89db35dfeaa0a88acdb4b0932f *data/lpcmdat.rda c7c66439965b038787d99cc1e363b284 *data/lrsmdat.rda 5830c7d646f066585b5695e469c2e4ad *data/pcmdat.rda 5da9d61d08d065d42e10183b5f0354a5 *data/pcmdat2.rda 11aab00147b6a45d5ca9dadcc2107a92 *data/raschdat1.rda 3f7c47e9bb09efc4a7e54467f902206d *data/raschdat1_RM_fitted.RData 0b2d2f5d5a9fd117d03476b4a156ce5b *data/raschdat1_RM_lrres2.RData 5c5328452b86204e7c3b1ad9f90cb525 *data/raschdat1_RM_plotDIF.RData 429b0265ce496c5c4d7ce4278427ede7 *data/raschdat2.rda 4f398a6bc3d250e870088a064317b1c1 *data/raschdat3.rda aa5135b65eec3a05a1c6c6f23ffd45fb *data/raschdat4.rda fe698696f11b30133fd7667a28bf7dbe *data/rsmdat.rda d6ef4432484b6f07a9fb2178baa4a879 *data/xmpl.RData 5ef84c3ef4febfaac942d321d43d40da *data/xmplbig.RData 28dcdf86eab731c9707c482030b07721 *inst/CITATION bbec190aa1af8f8b2d5718c347883e73 *inst/NEWS.Rd 4d6d70f06d012eb2f1f3d8c2de188a25 *inst/NEWS.pdf f2f1dde1411e624090270f2d52c77dfc *inst/NEWSRd2txt.R 247474716eb4357e4b4cf92c55cab612 *inst/doc/eRm.R 9f0d0175f42da4e7b4021e9cec1b9146 *inst/doc/eRm.Rnw 5eed273cca94da86a263992a6e62f117 *inst/doc/eRm.pdf bba1ee0605c426e109144ecad35d39be *man/IC.Rd 195afb5068e99c072ee2b01abefd25ea *man/LLRA.Rd 4640617a3b1d2bab3ee71f94fbb04c21 *man/LLTM.Rd cd6d3227703aae9c394e9e4c16e38830 *man/LPCM.Rd f3d7a332c4ff086be9688df3eafb9baf *man/LRSM.Rd ef081ec0e66763854fc1624e4d589bcd *man/LRtest.Rd a2434611522236c5074a56314e93843b *man/MLoef.Rd 09cf7dd41c389c6fe0bbc7ae53451539 *man/NPtest.Rd 11e5535f73e03c32f6df3684e42e4845 *man/PCM.Rd 95b227b4298dc0b7d19b2e1737ce11bc *man/PersonMisfit.Rd e11d28158fbbd3f3ca27e1ddf35b0b02 *man/RM.Rd e3b03791bdc647ec37fb54b5276e7d03 *man/RSM.Rd 8ddd37ae0df397f3a0b31e05eb70a188 *man/RSctr.Rd 442383d3bd01caef71f789f164cdc8cd *man/RSmpl.Rd 10cacee291a1b7b0105235a56792e8c9 *man/RaschSampler.Rd e9a7985658f9e3523e748bf7139a0968 *man/SepRel.Rd c92d8df332fcd8c2f4bfad193d9f5bbf *man/Waldtest.Rd de7f86cbe19f2c3537b5373f8abcfdf0 *man/anova.eRm.Rd 37f5d40e0adc158ed2b99135ed04d033 *man/anova.llra.Rd f8e70c65f43a56d7a3e500e373d88af7 *man/build_W.Rd 04512a3ff30672f04a230bc1ddf56f00 *man/collapse_W.Rd 0fcd3bce302e222d026d1c5ee809c719 *man/eRm.data.Rd 0ba205dca37c394b8ae21e0c970b626f *man/gofIRT.Rd 7a213a241fc3d245493ed660e2c7792b *man/item_info.Rd 8f22c5f73ef0e2c1696e6f88126b1685 *man/itemfit.ppar.Rd 63a16723424c844e2bc2679707a460cd *man/llra.datprep.Rd de6e211ae11b35af2daf45e775d9ba75 *man/llraDat1.Rd cff20d696570c3ef5e77ee168536e6b6 *man/llraDat2.Rd 44b7b8adf2b14e372e8661227b832dc2 *man/llradat3.Rd ae3376e960e09f6eb4de696b08236c49 *man/person.parameter.Rd 00d861e02078d473d0ca39410ee19fdf *man/phi.range.Rd b84fb54040dbc7685042dc38a61effe5 *man/plotDIF.Rd b290fcb7968aa06e1c70fa6037661854 *man/plotGR.Rd 1bafc16eed12867d64255ec19ec3ba2c *man/plotICC.Rd b9eaff18feef7c0d6ce773d17b2dad4d *man/plotINFO.Rd 59d8f2d0f54f67b2749ec07b12a12bcb *man/plotPImap.Rd ad5e200ccdaf9e37f68b893695fb534a *man/plotPWmap.Rd 7636949b2ed3aa9df02a8e3625fcb5e1 *man/plotTR.Rd 6b609f99cb2aa4d4304d1baf00c386af *man/predict.ppar.Rd 816e1da8b2ee90e6d3e07cb7dbb72682 *man/print.eRm.Rd 68c458d8e4e4ef7c7b7c473185f78a72 *man/rsampler.Rd d1094279d3d2481d8b22a28f25c77f9d *man/rsctrl.Rd a5c9818ac52912853fba4e73177e4797 *man/rsextrmat.Rd d588c926da237096d48b1be266fbc75c *man/rsextrobj.Rd 2df433fe6f36358cca9acaa1b59903a0 *man/rstats.Rd 76df31d3513f7a420bd6cfcc3bd84c6a *man/sim.2pl.Rd 2ff986362cce0119f3b2f04338c5096f *man/sim.locdep.Rd 64e2be5183ec749727c7fff9eea70b11 *man/sim.rasch.Rd 32381ef2cff1049fb6f85b7e301fe0bb *man/sim.xdim.Rd 02abc88ad7d29b90190f5b0e4fb77096 *man/stepwiseIt.Rd 3946b80ff77445fac4d9d7cedabfe10f *man/summary.RSctr.Rd c8a60360773dd87988a5dc0aa041b79e *man/summary.RSmpl.Rd 6a3998417cef6ddba5b51ec270c450b1 *man/summary.llra.Rd f1da4d2b46f216407e888a605104fe28 *man/test_info.Rd f7728e3a39f3ca1dfad30e8be4304864 *man/thresholds.Rd 34895a0b93ea8ec50341c83fd8138cca *man/xmpl.Rd 7cb8aefd698c61a00c9076832b73aa0d *src/RaschSampler.f90 d0d66f1a61eae0e016a6e9401d0e5917 *src/components.c ce4282b827566f0ef0572ae06eb7bf04 *src/components.h b318d7bfff0ba1eccadc86d34e1f0c5f *src/geodist.c c44d6148a344eb9e3deb558f5d453d8c *src/geodist.h 7c22b1b500cab25872924e218f1645f5 *src/registerDynamicSymbol.c 2c08e25aef0443820778321885461ba0 *vignettes/UCML.pdf bf9f1c8ecc2038ca20a5964c62101641 *vignettes/UCML.svg 9f0d0175f42da4e7b4021e9cec1b9146 *vignettes/eRm.Rnw 61d680540f93d252561fa615bd95511b *vignettes/eRm_object_tree.pdf 8fc81af9e3f5bbbee5393869304292f1 *vignettes/eRmvig.bib e97dfac8265ca8a3cbae7ff1d64ac832 *vignettes/modelhierarchy.pdf eRm/inst/0000755000175100001440000000000014505105713011771 5ustar hornikuserseRm/inst/doc/0000755000175100001440000000000014505105713012536 5ustar hornikuserseRm/inst/doc/eRm.Rnw0000755000175100001440000017706414375241640014000 0ustar hornikusers%\VignetteIndexEntry{eRm Basics} \SweaveOpts{keep.source=FALSE} \documentclass[10pt,nojss,nofooter,fleqn]{jss} \usepackage[utf8]{inputenx} \usepackage[noae]{Sweave} \usepackage{amsmath,amssymb,amsfonts} \usepackage{lmodern} \usepackage[nosf,nott,notextcomp,largesmallcaps,easyscsl]{kpfonts} \usepackage{booktabs} \usepackage{bm} \usepackage{microtype} \makeatletter% \let\P\@undefined% \makeatother% \DeclareMathOperator{\P}{P} \newcommand{\gnuR}{\proglang{R}} \newcommand{\eRm}{\pkg{eRm}} \newcommand{\ie}{i.\,e.} \newcommand{\eg}{e.\,g.} \newcommand{\acronym}[1]{\textsc{\lowercase{#1}}} % from Rd.sty \author{Patrick Mair\\Wirtschaftsuniversität Wien\And% Reinhold Hatzinger\\Wirtschaftsuniversität Wien\And% Marco J.\ Maier\\Wirtschaftsuniversität Wien} \Plainauthor{Patrick Mair, Reinhold Hatzinger, Marco J. Maier} \title{Extended Rasch Modeling: The \gnuR\ Package \eRm} \Plaintitle{Extended Rasch Modeling: The R Package eRm} \Shorttitle{The \gnuR\ Package \eRm} \Abstract{\noindent% This package vignette is an update and extension of the papers published in the Journal of Statistical Software (special issue on Psychometrics, volume 20) and Psychology Science \citep{Mair+Hatzinger:2007, Mair+Hatzinger:2007b}. Since the publication of these papers, various extensions and additional features have been incorporated into the package. We start with a methodological introduction to extended Rasch models followed by a general program description and application topics. The package allows for the computation of simple Rasch models, rating scale models, partial credit models and linear extensions thereof. Incorporation of such linear structures allows for modeling the effects of covariates and enables the analysis of repeated categorical measurements. Item parameter estimation is performed using \acronym{CML}, for the person parameters we use joint \acronym{ML}. These estimation routines work for incomplete data matrices as well. Based on these estimators, item-wise and global (parametric and non-parametric) goodness-of-fit statistics are described and various plots are presented.} %%% ADD: LLRA %%% ADD: NP-Tests \Keywords{\eRm\ Package, Rasch Model (\acronym{RM}), \acronym{LLTM}, \acronym{RSM}, \acronym{LRSM}, \acronym{PCM}, \acronym{LPCM}, \acronym{LLRA}, \acronym{CML} estimation} \begin{document} % % % % % %\citep{RuschMaierHatzinger:2013:LLRA} %%% LLRA Proceedings %\citep{HatzingerRusch:2009:IRTwLLRA} %%% PSQ %\citep{Ponocny:2002:ApplicabilitysomeIRT} % % % % % \section{Introduction} \citet{Ro:99} claimed in his article that ``even though the Rasch model has been existing for such a long time, 95\% of the current tests in psychology are still constructed by using methods from classical test theory'' (p.\ 140). Basically, he quotes the following reasons why the Rasch model \acronym{(RM)} is being rarely used: The Rasch model in its original form \citep{Ra:60}, which was limited to dichotomous items, is arguably too restrictive for practical testing purposes. Thus, researchers should focus on extended Rasch models. In addition, Rost argues that there is a lack of user-friendly software for the computation of such models. Hence, there is a need for a comprehensive, user-friendly software package. Corresponding recent discussions can be found in \citet{Kub:05} and \citet{Bor:06}. In addition to the basic \acronym{RM}, the models that can be computed with \eRm\ package are: the linear logistic test model \citep{Scheib:72}, the rating scale model \citep{And:78}, the linear rating scale model \citep{FiPa:91}, the partial credit model \citep{Mast:82}, and the linear partial credit model \citep{GlVe:89,FiPo:94}. These models and their main characteristics are presented in Section \ref{sec:erm}. A more recent addition to \eRm\ has been the linear logistic models with relaxed assumptions \citep{Fisch:95b,FischPonocny:95} that provides a very flexible framework with a wide range of applications. %%% ADD: ref to sec Concerning estimation of parameters, all models have an important feature in common: Conditional maximum likelihood \acronym{(CML)} estimation, which leads to separability of item and person parameters. Item parameters $\beta$ can be estimated without estimating the person parameters $\theta$ by conditioning the likelihood on the sufficient person raw score. \acronym{CML} estimation is described in Section \ref{sec:cml}. Several diagnostic tools and tests to evaluate model fit are presented in Section \ref{Gof}. In Section \ref{sec:pack}, the corresponding implementation in \gnuR\ \citep{gnuR} is described by means of several examples. The \eRm\ package uses a design matrix approach which allows to reparameterize the item parameters to model common characteristics of the items or to enable the user to impose repeated measurement designs as well as group contrasts. By combining these types of contrasts, item parameter may differ over time with respect to certain subgroups. To illustrate the flexibility of \eRm, some examples are given to show how suitable design matrices can be constructed. % % % % %----------------- end introduction ---------------- \section{Extended Rasch models} \label{sec:erm} % % % \subsection{General expressions} Briefly after the first publication of the basic Rasch Model \citep{Ra:60}, the author worked on polytomous generalizations which can be found in \citet{Ra:61}. \citet{And:95} derived the representations below which are based on Rasch's general expression for polytomous data. The data matrix is denoted as $\bm{X}$ with the persons $v$ in the rows and items $i$ in the columns. In total there are $v=1,\,\ldots,\,n$ persons and $i=1,\,\ldots,\,k$ items. A single element in the data matrix $\bm{X}$ is expressed as $x_{vi}$. Furthermore, each item $i$ has a certain number of response categories, denoted by $h=0,\,\ldots,\,m_i$. The corresponding probability of response $h$ on item $i$ can be derived in terms of the following two expressions \citep{And:95}: \begin{equation}\label{eq1} \P(X_{vi}=h)=\frac{\exp[\phi_h(\theta_v+\beta_i)+\omega_h]}{\sum_{l=0}^{m_i} \exp[\phi_l (\theta_v+\beta_i)+\omega_l]} %%%Q: X_vi or x_vi? \end{equation} or \begin{equation}\label{eq2} \P(X_{vi}=h)=\frac{\exp[\phi_h \theta_v+\beta_{ih}]}{\sum_{l=0}^{m_i} \exp[\phi_l \theta_v+\beta_{il}]}. \end{equation} Here, $\phi_h$ are scoring functions for the item parameters, $\theta_v$ are the uni-dimensional person parameters, and $\beta_i$ are the item parameters. In Equation \ref{eq1}, $\omega_h$ corresponds to category parameters, whereas in Equation \ref{eq2} $\beta_{ih}$ are the item-category parameters. The meaning of these parameters will be discussed in detail below. Within the framework of these two equations, numerous models have been suggested that retain the basic properties of the Rasch model so that \acronym{CML} estimation can be applied. % % % \subsection{Representation of extended Rasch models} \label{Rep} For the ordinary Rasch model for dichotomous items, Equation \ref{eq1} reduces to \begin{equation}\label{eq:rasch} \P(X_{vi}=1)=\frac{\exp(\theta_v - \beta_i)}{1+\exp(\theta_v-\beta_i)}. \end{equation} The main assumptions, which hold as well for the generalizations presented in this paper, are: uni-dimensionality of the latent trait, sufficiency of the raw score, local independence, and parallel item characteristic curves (\acronym{ICC}s). Corresponding explanations can be found, e.g., in \citet{Fisch:74} and mathematical derivations and proofs in \citet{Fisch:95a}. \begin{figure}[hbt]\centering% \includegraphics[height=60mm, width=40mm]{modelhierarchy.pdf} \caption{Model hierarchy} \label{fig1} \end{figure} For dichotomous items, \citet{Scheib:72} proposed the (even more restricted) linear logistic test model \acronym{(LLTM)}, later formalized by \citet{Fisch:73}, by splitting up the item parameters into the linear combination \begin{equation} \label{eq4} \beta_i=\sum_{j=1}^p w_{ij} \eta_j. \end{equation} \citet{Scheib:72} explained the dissolving process of items in a test for logics (``Mengenrechentest'') by so-called ``cognitive operations'' $\eta_j$ such as negation, disjunction, conjunction, sequence, intermediate result, permutation, and material. Note that the weights $w_{ij}$ for item $i$ and operation $j$ have to be fixed a priori. Further elaborations about the cognitive operations can be found in \citet[p.~361ff.]{Fisch:74}. Thus, from this perspective the \acronym{LLTM} is more parsimonious than the Rasch model. Though, there exists another way to look at the \acronym{LLTM}: A generalization of the basic Rasch model in terms of repeated measures and group contrasts. It should be noted that both types of reparameterization also apply to the linear rating scale model \acronym{(LRSM)} and the linear partial credit model \acronym{(LPCM)} with respect to the basic rating scale model \acronym{(RSM)} and the partial credit model \acronym{(PCM)} presented below. Concerning the \acronym{LLTM}, the possibility to use it as a generalization of the Rasch model for repeated measurements was already introduced by \citet{Fisch:74}. Over the intervening years this suggestion has been further elaborated. \citet{Fisch:95b} discussed certain design matrices which will be presented in Section \ref{sec:design} and on the basis of examples in Section \ref{sec:pack}. At this point we will focus on a simple polytomous generalization of the Rasch model, the \acronym{RSM} \citep{And:78}, where each item $I_i$ must have the same number of categories. Pertaining to Equation \ref{eq1}, $\phi_h$ may be set to $h$ with $h=0,\,\ldots,\,m$. Since in the \acronym{RSM} the number of item categories is constant, $m$ is used instead of $m_i$. Hence, it follows that \begin{equation}\label{eq5} \P(X_{vi}=h)=\frac{\exp[h(\theta_v+\beta_i)+\omega_h]}{\sum_{l=0}^m \exp[l(\theta_v+ \beta_i)+\omega_l]}, \end{equation} with $k$ item parameters $\beta_1,\,\ldots,\,\beta_k$ and $m+1$ category parameters $\omega_0,\,\ldots,\,\omega_m$. This parameterization causes a scoring of the response categories $C_h$ which is constant over the single items. Again, the item parameters can be split up in a linear combination as in Equation \ref{eq4}. This leads to the \acronym{LRSM} proposed by \citet{FiPa:91}. Finally, the \acronym{PCM} developed by \citet{Mast:82} and its linear extension, the \acronym{LPCM} \citep{FiPo:94}, are presented. The \acronym{PCM} assigns one parameter $\beta_{ih}$ to each $I_i \times C_h$ combination for $h=0,\,\ldots,\,m_i$. Thus, the constant scoring property must not hold over the items and in addition, the items can have different numbers of response categories denoted by $m_i$. Therefore, the \acronym{PCM} can be regarded as a generalization of the \acronym{RSM} and the probability for a response of person $v$ on category $h$ (item $i$) is defined as \begin{equation}\label{eq6} \P(X_{vih}=1)=\frac{\exp[h\theta_v + \beta_{ih}]}{\sum_{l=0}^{m_i}\exp[l\theta_v + \beta_{il}]}. \end{equation} It is obvious that (\ref{eq6}) is a simplification of (\ref{eq2}) in terms of $\phi_h = h$. As for the \acronym{LLTM} and the \acronym{LRSM}, the \acronym{LPCM} is defined by reparameterizing the item parameters of the basic model, i.e., \begin{equation}\label{eq:lpcmeta} \beta_{ih}=\sum_{j=1}^p w_{ihj}\eta_j. \end{equation} These six models constitute a hierarchical order as displayed in Figure \ref{fig1}. This hierarchy is the base for a unified \acronym{CML} approach presented in the next section. It is outlined again that the linear extension models can be regarded either as generalizations or as more restrictive formulations pertaining to the underlying base model. The hierarchy for the basic model is straightforward: The \acronym{RM} allows only items with two categories, thus each item is represented by one parameter $\beta_i$. The \acronym{RSM} allows for more than two (ordinal) categories each represented by a category parameter $\omega_h$. Due to identifiability issues, $\omega_0$ and $\omega_1$ are restricted to 0. Hence, the \acronym{RM} can be seen as a special case of the \acronym{RSM} whereas, the \acronym{RSM} in turn, is a special case of the \acronym{PCM}. The latter model assigns the parameter $\beta_{ih}$ to each $I_i \times C_h$ combination. To conclude, the most general model is the \acronym{LPCM}. All other models can be considered as simplifications of Equation \ref{eq6} combined with Equation \ref{eq:lpcmeta}. As a consequence, once an estimation procedure is established for the \acronym{LPCM}, this approach can be used for any of the remaining models. This is what we quote as \textit{unified \acronym{CML} approach}. The corresponding likelihood equations follow in Section \ref{sec:cml}. % % % \subsection{The concept of virtual items} \label{sec:design} When operating with longitudinal models, the main research question is whether an individual's test performance changes over time. The most intuitive way would be to look at the shift in ability $\theta_v$ across time points. Such models are presented, e.g., in \citet{Mi:85}, \citet{Glas:1992}, and discussed by \citet{Ho:95}. Yet there exists another look onto time dependent changes, as presented in \citet[p~158ff.]{Fisch:95b}: The person parameters are fixed over time and instead of them the item parameters change. The basic idea is that one item $I_i$ is presented at two different times to the same person $S_v$ is regarded as a pair of \textit{virtual items}. Within the framework of extended Rasch models, any change in $\theta_v$ occuring between the testing occasions can be described without loss of generality as a change of the item parameters, instead of describing change in terms of the person parameter. Thus, with only two measurement points, $I_i$ with the corresponding parameter $\beta_i$ generates two virtual items $I_r$ and $I_s$ with associated item parameters $\beta^{\ast}_r$ and $\beta^{\ast}_s$. For the first measurement point $\beta^{\ast}_r=\beta_i$, whereas for the second $\beta^{\ast}_s=\beta_i+\tau$. In this linear combination the $\beta^{\ast}$-parameters are composed additively by means of the real item parameters $\beta$ and the treatment effects $\tau$. This concept extends to an arbitrary number of time points or testing occasions. Correspondingly, for each measurement point $t$ we have a vector of \textit{virtual item parameters} $\bm{\beta}^{\ast(t)}$ of length $k$. These are linear reparameterizations of the original $\bm{\beta}^{(t)}$, and thus the \acronym{CML} approach can be used for estimation. In general, for a simple \acronym{LLTM} with two measurement points the design matrix $\bm{W}$ is of the form as given in Table \ref{tab1}. \begin{table}\centering% $\begin{array}{c|c|rrrr|r} & & \eta_1 & \eta_2 & \hdots & \eta_k & \eta_{k+1}\\ \hline \textrm{Time 1} & \beta_1^{\ast(1)} & 1 & 0 & 0 & 0 & 0\\ & \beta_2^{\ast(1)} & 0 & 1 & 0 & 0 & 0\\ & \vdots & & & \ddots& & \vdots\\ & \beta_{k}^{\ast(1)} & 1 & 0 & 0 & 1 & 0\\ \hline \textrm{Time 2} & \beta_{k+1}^{\ast(2)} & 1 & 0 & 0 & 0 & 1\\ & \beta_{k+2}^{\ast(2)} & 0 & 1 & 0 & 0 & 1\\ & \vdots & & & \ddots& & \vdots\\ & \beta_{2k}^{\ast(2)} & 1 & 0 & 0 & 1 & 1\\ \end{array}$ \caption{A design matrix for an \acronym{LLTM} with two timepoints.} \label{tab1} \end{table} The parameter vector $\bm{\beta}^{\ast(1)}$ represents the item parameters for the first test occasion, $\bm{\beta}^{\ast(2)}$ the parameters for the second occasion. It might be of interest whether these vectors differ. The corresponding trend contrast is $\eta_{k+1}$. Due to this contrast, the number of original $\beta$-parameters is doubled by introducing the $2k$ virtual item parameters. If we assume a constant shift for all item parameters, it is only necessary to estimate $\hat{\bm{\eta}}'=(\hat{\eta}_1,\,\ldots,\,\hat{\eta}_{k+1})$ where $\hat{\eta}_{k+1}$ gives the amount of shift. Since according to (\ref{eq4}), the vector $\hat{\bm{\beta}}^\ast$ is just a linear combination of $\hat{\bm{\eta}}$. As mentioned in the former section, when using models with linear extensions it is possible to impose group contrasts. By doing this, one allows that the item difficulties are different across subgroups. However, this is possible only for models with repeated measurements and virtual items since otherwise the introduction of a group contrast leads to overparameterization and the group effect cannot be estimated by using \acronym{CML}. Table \ref{tab2} gives an example for a repeated measurement design where the effect of a treatment is to be evaluated by comparing item difficulties regarding a control and a treatment group. The number of virtual parameters is doubled compared to the model matrix given in Table \ref{tab1}. \begin{table}[h]\centering% $\begin{array}{c|c|c|rrrr|rrr} & & & \eta_1 & \eta_2 & \hdots & \eta_k & \eta_{k+1} & \eta_{k+2} \\ \hline \textrm{Time 1} & \textrm{Group 1} & \beta_1^{\ast(1)} & 1 & 0 & 0 & 0 & 0 & 0\\ & & \beta_2^{\ast(1)} & 0 & 1 & 0 & 0 & 0& 0\\ & & \vdots & & & \ddots& &\vdots &\vdots\\ & & \beta_{k}^{\ast(1)} & 1 & 0 & 0 & 1 & 0 & 0\\ \cline{2-9} & \textrm{Group 2} & \beta_{k+1}^{\ast(1)} & 1 & 0 & 0 & 0 & 0 & 0\\ & & \beta_{k+2}^{\ast(1)} & 0 & 1 & 0 & 0 & 0 & 0\\ & & \vdots & & & \ddots& &\vdots & \vdots\\ & & \beta_{2k}^{\ast(1)} & 1 & 0 & 0 & 1 & 0& 0\\ \hline \textrm{Time 2} & \textrm{Group 1} & \beta_1^{\ast(2)} & 1 & 0 & 0 & 0 & 1 & 0\\ & & \beta_2^{\ast(2)} & 0 & 1 & 0 & 0 & 1 & 0\\ & & \vdots & & & \ddots& &\vdots &\vdots\\ & & \beta_{k}^{\ast(2)} & 1 & 0 & 0 & 1 & 1 & 0\\ \cline{2-9} & \textrm{Group 2} & \beta_{k+1}^{\ast(2)} & 1 & 0 & 0 & 0 & 1 & 1\\ & & \beta_{k+2}^{\ast(2)} & 0 & 1 & 0 & 0 & 1 & 1\\ & & \vdots & & & \ddots& &\vdots & \vdots\\ & & \beta_{2k}^{\ast(2)} & 1 & 0 & 0 & 1 & 1 & 1\\ \end{array}$ \caption{Design matrix for a repeated measurements design with treatment and control group.} \label{tab2} \end{table} Again, $\eta_{k+1}$ is the parameter that refers to the time contrast, and $\eta_{k+2}$ is a group effect within measurement point 2. More examples are given in Section \ref{sec:pack} and further explanations can be found in \citet{Fisch:95b}, \citet{FiPo:94}, and in the software manual for the LPCM-Win program by \citet{FiPS:98}. By introducing the concept of virtual persons, \pkg{eRm} allows for the computation of the linear logistic test model with relaxed assumptions \citep[\acronym{LLRA};][]{Fisch:77}. Corresponding explanations will be given in a subsequent version of this vignette. % % % % %------------------------ end extended Rasch models -------------------------- \section{Estimation of item and person parameters} \label{sec:cml} % % % \subsection[CML for item parameter estimation]{\protect\acronym{CML} for item parameter estimation} The main idea behind the \acronym{CML} estimation is that the person's raw score $r_v=\sum_{i=1}^k x_{vi}$ is a sufficient statistic. Thus, by conditioning the likelihood onto $\bm{r}'=(r_1,\,\ldots,\,r_n)$, the person parameters $\bm{\theta}$, which in this context are nuisance parameters, vanish from the likelihood equation, thus, leading to consistently estimated item parameters $\hat{\bm{\beta}}$. Some restrictions have to be imposed on the parameters to ensure identifiability. This can be achieved, e.g., by setting certain parameters to zero depending on the model. In the Rasch model one item parameter has to be fixed to 0. This parameter may be considered as baseline difficulty. In addition, in the \acronym{RSM} the category parameters $\omega_0$ and $\omega_1$ are also constrained to 0. In the \acronym{PCM} all parameters representing the first category, i.e., $\beta_{i0}$ with $i=1,\ldots,k$, and one additional item-category parameter, e.g., $\beta_{11}$ have to be fixed. For the linear extensions it holds that the $\beta$-parameters that are fixed within a certain condition (e.g., first measurement point, control group etc.) are also constrained in the other conditions (e.g., second measurement point, treatment group etc.). At this point, for the \acronym{LPCM} the likelihood equations with corresponding first and second order derivatives are presented (i.e., \textit{unified \acronym{CML} equations}). In the first version of the \pkg {eRm} package numerical approximations of the Hessian matrix are used. However, to ensure numerical accuracy and to speed up the estimation process, it is planned to implement the analytical solution as given below. The conditional log-likelihood equation for the \acronym{LPCM} is \begin{equation} \label{eq:cmll} \log L_c = \sum_{i=1}^k \sum_{h=1}^{m_i} x_{+ih} \sum_{j=1}^p w_{ihj} \eta_j - \sum_{r=1}^{r_{max}} n_r \log \gamma_r. \end{equation} The maximal raw score is denoted by $r_{max}$ whereas the number of subjects with the same raw score is quoted as $n_r$. Alternatively, by going down to an individual level, the last sum over $r$ can be replaced by $\sum_{v=1}^n \log \gamma_{r_v}$. It is straightforward to show that the \acronym{LPCM} as well as the other extended Rasch models, define an exponential family \citep{And:83}. Thus, the raw score $r_v$ is minimally sufficient for $\theta_v$ and the item totals $x_{.ih}$ are minimally sufficient for $\beta_{ih}$. Crucial expressions are the $\gamma$-terms which are known as \textit{elementary symmetric functions}. More details about these terms are given in the next section. However, in the \pkg {eRm} package the numerically stable \textit{summation algorithm} as suggested by \citet{And:72} is implemented. \citet{FiPo:94} adopted this algorithm for the \acronym{LPCM} and devised also the first order derivative for computing the corresponding derivative of $\log L_c$: \begin{equation}\label{eq:dcml} \frac{\partial\log L_c}{\partial\eta_a} = \sum_{i=1}^k \sum_{h=1}^{m_i} w_{iha}\left(x_{+ih} - \epsilon_{ih} \sum_{r=1}^{r_{max}} n_r \frac{ \gamma_{r}^{(i)}}{\gamma_r}\right). \end{equation} It is important to mention that for the \acronym{CML}-representation, the multiplicative Rasch expression is used throughout equations \ref{eq1} to \ref{eq:lpcmeta}, i.e., $\epsilon_i=\exp(-\beta_i)$ for the person parameter. Therefore, $\epsilon_{ih}$ corresponds to the reparameterized item $\times$ category parameter whereas $\epsilon_{ih} > 0$. Furthermore, $\gamma_{r}^{(i)}$ are the first order derivatives of the $\gamma$-functions with respect to item $i$. The index $a$ in $\eta_a$ denotes the first derivative with respect to the $a^{th}$ parameter. For the second order derivative of $\log L_c$, two cases have to be distinguished: the derivatives for the off-diagonal elements and the derivatives for the main diagonal elements. The item categories with respect to the item index $i$ are coded with $h_i$, and those referring to item $l$ with $h_l$. The second order derivatives of the $\gamma$-functions with respect to items $i$ and $l$ are denoted by $\gamma_r^{(i,l)}$. The corresponding likelihood expressions are \begin{align} \label{eq:2dcml} \frac{\partial\log L_c}{\partial\eta_a \eta_b} = & -\sum_{i=1}^k \sum_{h_i=1}^{m_i} w_{ih_ia}w_{ih_ib}\epsilon_{ih_i} \sum_{r=1}^{r_{max}} n_r \frac{\log \gamma_{r-h_i}}{\gamma_r}\\ & -\sum_{i=1}^k \sum_{h_i=1}^{m_i} \sum_{l=1}^k \sum_{h_l=1}^{m_l} w_{ih_ia}w_{lh_lb} \left[\epsilon_{ih_i} \epsilon_{lh_l} \left( \sum_{r=1}^{r_{max}} n_r \frac{\gamma_{r}^{(i)}\gamma_{r}^{(l)}}{\gamma_r^2} - \sum_{r=1}^{r_{max}} n_r \frac{\gamma_{r}^{(i,l)}}{\gamma_r}\right)\right] \notag \end{align} for $a\neq b$, and \begin{align} \label{eq:2dcmlab} \frac{\partial\log L_c}{\partial\eta_a^2} = & -\sum_{i=1}^k \sum_{h_i=1}^{m_i} w_{ih_ia}^2 \epsilon_{ih_i} \sum_{r=1}^{r_{max}} n_r \frac{\log \gamma_{r-h_i}}{\gamma_r}\\ & -\sum_{i=1}^k \sum_{h_i=1}^{m_i} \sum_{l=1}^k \sum_{h_l=1}^{m_l} w_{ih_ia}w_{lh_la}\epsilon_{ih_i} \epsilon_{lh_l}\sum_{r=1}^{r_{max}} n_r \frac{\gamma_{r-h_i}^{(i)}\gamma_{r-h_l}^{(l)}}{\gamma_r^2} \notag \end{align} for $a=b$. To solve the likelihood equations with respect to $\hat{\bm{\eta}}$, a Newton-Raphson algorithm is applied. The update within each iteration step $s$ is performed by \begin{equation}\label{eq:iter} \hat{\bm{\eta}}_s=\hat{\bm{\eta}}_{s-1}-\bm{H}_{s-1}^{-1}\bm{\delta}_{s-1}. \end{equation} The starting values are $\hat{\bm{\eta}}_0=\bm{0}$. $\bm{H}_{s-1}^{-1}$ is the inverse of the Hessian matrix composed by the elements given in Equation \ref{eq:2dcml} and \ref{eq:2dcmlab} and $\bm{\delta}_{s-1}$ is the gradient at iteration $s-1$ as specified in Equation \ref{eq:dcml}. The iteration stops if the likelihood difference $\left|\log L_c^{(s)} - \log L_c^{(s-1)} \right|\leq \varphi$ where $\varphi$ is a predefined (small) iteration limit. Note that in the current version (\Sexpr{packageDescription("eRm", fields = "Version")}) $\bm{H}$ is approximated numerically by using the \pkg{nlm} Newton-type algorithm provided in the \pkg{stats} package. The analytical solution as given in Equation \ref{eq:2dcml} and \ref{eq:2dcmlab} will be implemented in the subsequent version of \pkg{eRm}. % % % \subsection[Mathematical properties of the CML estimates]{Mathematical properties of the \acronym{CML} estimates} \label{sec:mpcml} A variety of estimation approaches for \acronym{IRT} models in general and for the Rasch model in particular are available: The \emph{joint maximum likelihood} \acronym{(JML)} estimation as proposed by \citet{Wright+Panchapakesan:1969} which is not recommended since the estimates are not consistent \citep[see e.g.][]{Haberman:77}. The basic reason for that is that the person parameters $\bm{\theta}$ are nuisance parameters; the larger the sample size, the larger the number of parameters. A well-known alternative is the \emph{marginal maximum likelihood} \acronym{(MML)} estimation \citep{Bock+Aitkin:1981}: A distribution $g(\theta)$ for the person parameters is assumed and the resulting situation corresponds to a mixed-effects \acronym{ANOVA}: Item difficulties can be regarded as fixed effects and person abilities as random effects. Thus, \acronym{IRT} models fit into the framework of \emph{generalized linear mixed models} \acronym{(GLMM)} as elaborated in \citet{deBoeck+Wilson:2004}. By integrating over the ability distribution the random nuisance parameters can be removed from the likelihood equations. This leads to consistent estimates of the item parameters. Further discussions of the \acronym{MML} approach with respect to the \acronym{CML} method will follow. For the sake of completeness, some other methods for the estimation of the item parameters are the following: \citet{CAnd:07} propose a Pseudo-\acronym{ML} approach, \citet{Molenaar:1995} and \citet{Linacre:2004} give an overview of various (heuristic) non-\acronym{ML} methods, Bayesian techniques can be found in \citet[Chapter 7]{BaKi:04}, and for non-parameteric approaches it is referred to \citet{LeVe:86}. However, back to \acronym{CML}, the main idea behind this approach is the assumption that the raw score $r_v$ is a minimal sufficient statistic for $\theta_v$. Starting from the equivalent multiplicative expression of Equation \ref{eq1} with $\xi_v=\exp(\theta_v)$ and $\epsilon_i=\exp(-\beta_i)$, i.e., \begin{equation}\label{eq7} \P(X_{vi}=1)=\frac{\xi_v \epsilon_i}{1+\xi_v \epsilon_i}, \end{equation} the following likelihood for the response pattern $\bm{x}_v$ for a certain subject $v$ results: \begin{equation}\label{eq8} \P(\bm{x}_v|\xi_v,\bm{\epsilon})=\prod_{i=1}^k \frac{(\xi_v \epsilon_i)^{x_{vi}}}{1+\xi_v \epsilon_i}= \frac{{\theta_v}^{r_v} \prod_{i=1}^k {\epsilon_i}^{x_{vi}}}{\prod_{i=1}^k (1+\xi_v \epsilon_i)}. \end{equation} Using the notation $\bm{y}=(y_1,\ldots ,y_k)$ for all possible response patterns with $\sum_{i=1}^k y_i=r_v$, the probability for a fixed raw score $r_v$ is \begin{equation}\label{eq9} \P(r_v|\xi_v,\bm{\epsilon})=\sum_{\bm{y}|r_v} \prod_{i=1}^k \frac{(\xi_v \epsilon_i)^{x_{vi}}}{1+\xi_v \epsilon_i}=\frac{{\theta_v}^{r_v} \sum_{\bm{y}|r_v} \prod_{i=1}^k {\epsilon_i}^{x_{vi}}}{\prod_{i=1}^k (1+\xi_v \epsilon_i)}. \end{equation} The crucial term with respect to numerical solutions of the likelihood equations is the second term in the numerator: \begin{equation}\label{eq:gamma} \gamma_r(\epsilon_i) \equiv \sum_{\bm{y}|r_v} \prod_{i=1}^k {\epsilon_i}^{x_{vi}} \end{equation} These are the \emph{elementary symmetric functions} (of order $r$). An overview of efficient computational algorithms and corresponding simulation studies can be found in \citet{Li:94}. The \pkg{eRm} package uses the summation algorithm as proposed by \citet{And:72}. Finally, by collecting the different raw scores into the vector $\bm{r}$ the conditional probability of observing response pattern $\bm{x}_v$ with given raw score $r_v$ is \begin{equation}\label{eq:xraw} \P(\bm{x}_v|r_v,\bm{\epsilon})=\frac{\P(\bm{x}_v|\xi_v,\bm{\epsilon})}{\P(r_v|\xi_v,\bm{\epsilon})} \,. \end{equation} By taking the product over the persons (independence assumption), the (conditional) likelihood expression for the whole sample becomes \begin{equation}\label{eq:likall} L(\bm{\epsilon}|\bm{r})=\P(\bm{x}|\bm{r},\bm{\epsilon})=\prod_{v=1}^n \frac{\prod_{i=1}^k {\epsilon_i}^{x_{vi}}}{\gamma_{r_v}}. \end{equation} With respect to raw score frequencies $n_r$ and by reintroducing the $\beta$-parameters, (\ref{eq:likall}) can be reformulated as \begin{equation}\label{eq12a} L(\bm{\beta}|\bm{r})= \frac{\exp \left(\sum_{i=1}^k x_{+i}\beta_i \right)}{\prod_{r=0}^k\gamma_r^{n_r}}\,, \end{equation} where $x_{+i}$ are the item raw scores. It is obvious that by conditioning the likelihood on the raw scores $\bm{r}$, the person parameters completely vanished from the expression. As a consequence, the parameters $\bm{\hat{\beta}}$ can be estimated without knowledge of the subject's abilities. This issue is referred as \emph{person-free item assessment} and we will discuss this topic within the context of specific objectivity in the next section. Pertaining to asymptotical issues, it can be shown that under mild regularity conditions \citep{Pf:94} the \acronym{CML} estimates are consistent for $n\rightarrow \infty$ and $k$ fixed, unbiased, asymptotically efficient, and normally distributed \citep{Andersen:1970}. For the computation of a Rasch model, comparatively small samples are sufficient to get reliable estimates \citep{Fischer:1988}. Whether the \acronym{MML} estimates are unbiased depends on the correct specification of the ability distribution $g(\theta)$. In case of an incorrect assumption, the estimates are biased which is surely a drawback of this method. If $g(\theta)$ is specified appropriately, the \acronym{CML} and \acronym{MML} estimates are asymptotically equivalent \citep{Pf:94}. \citet{Fischer:1981} elaborates on the conditions for the existence and the uniqueness of the \acronym{CML} estimates. The crucial condition for the data matrix is that $\bm{X}$ has to be \emph{well-conditioned}. To introduce this issue it is convenient to look at a matrix which is \emph{ill-conditioned}: A matrix is ill-conditioned if there exists a partition of the items into two nonempty subsets such that all of a group of subjects responded correctly to items $i+1,\ldots,k$ ($\bm{X}_2$) and all of all other subjects failed for items $1,\ldots,i$ ($\bm{X}_3$), i.e., \begin{table}[h]\centering% \[ \bm{X}= \left( \begin{array}{c|c} \bm{X}_1 & \bm{X}_2\\ \hline \bm{X}_3 & \bm{X}_4\\ \end{array} \right) = \left( \begin{array}{ccc|ccc} & & & 1 & \ldots & 1 \\ & \bm{X}_1 & & \vdots & \ddots & \vdots \\ & & & 1 & \ldots & 1 \\ \hline 0 & \ldots & 0 & & & \\ \vdots & \ddots & \vdots & & \bm{X}_4 & \\ 0 & \ldots & 0 & & & \\ \end{array} \right) \] \end{table} Thus, following the definition in \citet{Fischer:1981}: $\bm{X}$ will be called \emph{well-conditioned} iff in every possible partition of the items into two nonempty subsets some subjects has given response 1 on some item in the first set and response 0 on some item in the second set. In this case a unique solution for the \acronym{CML} estimates $\hat{\bm{\beta}}$ exists. This issue is important for structurally incomplete designs which often occur in practice; different subsets of items are presented to different groups of persons $g=1,\ldots,G$ where $G\leq n$. As a consequence, the likelihood values have to be computed for each group separately and the joint likelihood is the product over the single group likelihoods. Hence, the likelihood in Equation \ref{eq12a} becomes \begin{equation}\label{eq:glik} L(\bm{\beta}|\bm{r})=\prod_{g=1}^G \frac{\exp \left(\sum_{i=1}^k x_{+i}\beta_i \right)}{\prod_{r=0}^k {\gamma_{g,r}}^{n_{g,r}}} \end{equation} This also implies the necessity to compute the elementary symmetric functions separately for each group. The \pkg{eRm} package can handle such structurally incomplete designs. From the elaborations above it is obvious that from an asymptotical point of view the \acronym{CML} estimates are at least as good as the \acronym{MML} estimates. In the past, computational problems (speed, numerical accuracy) involved in calculating the elementary symmetric functions limited the practical usage of the \acronym{CML} approach \citep[see e.g.][]{Gustafsson:1980}. Nowadays, these issues are less crucial due to increased computer power. In some cases \acronym{MML} estimation has advantages not shared by \acronym{CML}: \acronym{MML} leads to finite person parameters even for persons with zero and perfect raw score, and such persons are not removed from the estimation process \citep{Molenaar:1995}. On he other hand the consideration of such persons does not seem meaningful from a substantial point of view since the person parameters are not reliable anymore -- for such subjects the test is too difficult or too easy, respectively. Thus, due to these covering effects, a corresponding ability estimation is not feasible. However, if the research goal is to find ability distributions such persons should be regarded and \acronym{MML} can handle this. When estimates for the person parameters are of interest some care has to be taken if the \acronym{CML} method is used since person parameters cancel from the estimation equations. Usually, they are estimated (once having obtained values for the item parameters) by inserting $\hat{\bm{\beta}}$ (or equivalently $\hat{\bm{\epsilon}}$) into Equation \ref {eq8} and solving with respect to $\bm{\theta}$. Alternatively, Bayesian procedures are applicable \citep{Hoijtink+Boomsma:1995}. It is again pointed out that each person in the sample gets an own parameter even though limited by the number of different raw scores. % % % \subsection[CML and specific objectivity]{\acronym{CML} and specific objectivity} In general, the Rasch model can be regarded as a measurement model: Starting from the (nominally scaled) 0/1-data matrix $\bm{X}$, the person raw scores $r_v$ are on an ordinal level. They, in turn, are used to estimate the item parameters $\bm{\beta}$ which are on an interval scale provided that the Rasch model holds. Thus, Rasch models allow for comparisons between objects on an interval level. Rasch reasoned on requirements to be fulfilled such that a specific proposition within this context can be regarded as ``scientific''. His conclusions were that a basic requirement is the ``objectivity'' of comparisons \citep{Ra:61}. This claim contrasts assumptions met in \emph{classical test theory} \acronym{(CTT)}. A major advantage of the Rasch model over \acronym{CTT} models is the \emph{sample independence} of the results. The relevant concepts in \acronym{CTT} are based on a linear model for the ``true score'' leading to some indices, often correlation coefficients, which in turn depend on the observed data. This is a major drawback in \acronym{CTT}. According to \citet{Fisch:74}, sample independence in \acronym{IRT} models has the following implications: \begin{itemize} \item The person-specific results (i.e., essentially $\bm{\theta}$) do not depend on the assignment of a person to a certain subject group nor on the selected test items from an item pool $\Psi$. \item Changes in the skills of a person on the latent trait can be determined independently from its base level and independently from the selected item subset $\psi \subset \Psi$. \item From both theoretical and practical perspective the requirement for representativeness of the sample is obsolete in terms of a true random selection process. \end{itemize} Based on these requirements for parameter comparisons, \citet{Ra:77} introduced the term \emph{specific objectivity}: \emph{objective} because any comparison of a pair of parameters is independent of any other parameters or comparisons; \emph{specifically objective} because the comparison made was relative to some specified frame of reference \citep{Andrich:88}. In other words, if specific objectivity holds, two persons $v$ and $w$ with corresponding parameters $\theta_v$ and $\theta_w$, are comparable independently from the remaining persons in the sample and independently from the presented item subset $\psi$. In turn, for two items $i$ and $j$ with parameters $\beta_i$ and $\beta_j$, the comparison of these items can be accomplished independently from the remaining items in $\Psi$ and independently from the persons in the sample. The latter is crucial since it reflects completely what is called sample independence. If we think not only of comparing $\beta_i$ and $\beta_j$ but rather to estimate these parameters, we achieve a point where specific objectivity requires a procedure which is able to provide estimates $\hat{\bm{\beta}}$ that do not depend on the sample. This implies that $\hat{\bm{\beta}}$ should be computable without the involvement of $\bm{\theta}$. \acronym{CML} estimation fulfills this requirement: By conditioning on the sufficient raw score vector $\bm{r}$, $\bm{\theta}$ disappears from the likelihood equation and $L(\bm{\beta}|\bm{r})$ can be solved without knowledge of $\bm{\theta}$. This issue is referred to as \emph{separability of item and person parameters} \citep[see e.g.][]{Wright+Masters:1982}. Furthermore, separability implies that no specific distribution should be assumed neither for the person nor for the item parameters \citep{Rost:2001}. \acronym{MML} estimation requires such assumptions. At this point it is clear that \acronym{CML} estimation is the only estimation method within the Rasch measurement context fulfilling the requirement of \emph{person-free item calibration} and, thus, it maps the epistemological theory of specific objectivity to a statistical maximum likelihood framework. Note that strictly speaking any statistical result based on sample observations is sample-dependent because any result depends at least on the sample size \citep{Fischer:1987}. The estimation of the item parameters is ``sample-independent'', a term indicating the fact that the actually obtained sample of a certain population is not of relevance for the statistical inference on these parameters \citep[][p.\ 23]{Kubinger:1989}. % % % \subsection{Estimation of person parameters} \acronym{CML} estimation for person parameters is not recommended due to computational issues. The \pkg{eRm} package provides two methods for this estimation. The first is ordinary \acronym{ML} where the \acronym{CML}-based item parameters are plugged into the joint \acronym{ML} equation. The likelihood is optimized with respect to $\bm{\theta}$. \citet{And:95} gives a general formulation of this \acronym{ML} estimate with $r_v=r$ and $\theta_v=\theta$: \begin{equation}\label{eq17} r - \sum_{i=1}^k \sum_{h=1}^{m_i} \frac{h \exp(h \theta+\hat{\beta}_{ih})}{\sum_{l=0}^{m_i}\exp(h \theta_v+\hat{\beta}_{il})}=0 \end{equation} \citet{Warm:1989} proposed a weighted likelihood estimation \acronym{(WLE)} which is more accurate compared to \acronym{ML}. For the dichotomous Rasch model the expression to be solved with respect to $\bm{\theta}$ is \begin{equation} \P(\theta_v|\bm{x}_v, \hat{\bm{\beta}}) \propto \frac{exp(r_v\theta_v)}{\prod_i (1+exp(\theta_v-\hat{\beta}_i)}\sum_i p_{vi}(1-p_{vi}) \end{equation} Again, the item parameter vector $\hat{\bm{\beta}}$ is used from \acronym{CML}. This approach will implemented in a subsequent \pkg{eRm} version. Additional explanations and simulation studies regarding person parameter estimation can be found in \citet{Hoijtink+Boomsma:1995}. % % % % %----------------- end parameter estimation ----------------- \section{Testing extended Rasch models} \label{Gof} Testing \acronym{IRT} models involves two parts: First, item- and person-wise statistics can be examined; in particular item-fit and person-fit statistics. Secondly, based on \acronym{CML} properties, various model tests can be derived \citep[see][]{Glas+Verhelst:1995a, Glas+Verhelst:1995b}. % % % \subsection{Item-fit and person-fit statistics} Commonly in \acronym{IRT}, items and persons are excluded due to item-fit and person-fit statistics. Both are residual based measures: The observed data matrix $\bm{X}$ is compared with the model probability matrix $\bm{P}$. Computing standardized residuals for all observations gives the $n \times k$ residual matrix $\bm{R}$. The squared column sums correspond to item-fit statistics and the squared row sums to person-fit statistics both of which are $\chi^2$-distributed with the corresponding degrees of freedom. Based on these quantities unweighted (\textsl{outfit}) and weighted (\textsl{infit}) mean-square statistics can also be used to evaluate item and person fit \citep[see e.g.][]{Wright+Masters:1982}. % % % \subsection{A Wald test for item elimination} A helpful implication of \acronym{CML} estimates is that subsequent test statistics are readily obtained and model tests are easy to carry out. Basically, we have to distinguish between test on item level and global model tests. On item level, sample independence reflects the property that by splitting up the sample in, e.g., two parts, the corresponding parameter vectors $\hat{\bm{\beta}}^{(1)}$ and $\hat{\bm{\beta}}^{(2)}$ should be the same. Thus, when we want to achieve Rasch model fit those items have to be eliminated from the test which differ in the subsamples. This important issue in test calibration can be examined, e.g., by using a graphical model test. \citet{FiSch:70} propose a $\mathcal{N}(0,\,1)$-distributed test statistic which compares the item parameters for two subgroups: \begin{equation}\label{eq:wald} z=\frac{\beta_i^{(1)}-\beta_i^{(2)}}{\sqrt{Var_i^{(1)}-Var_i^{(2)}}} \end{equation} The variance term in the denominator is based on Fisher's function of ``information in the sample''. However, as \citet{Glas+Verhelst:1995a} point out discussing their Wald-type test that this term can be extracted directly from the variance-covariance matrix of the \acronym{CML} estimates. This Wald approach is provided in \pkg{eRm} by means of the function \code{Waldtest()}. % % % \subsection{Andersen's likelihood-ratio test} In the \pkg{eRm} package the likelihood ratio test statistic $LR$, initially proposed by \citet{And:73} is computed for the \acronym{RM}, the \acronym{RSM}, and the \acronym{PCM}. For the models with linear extensions, $LR$ has to be computed separately for each measurement point and subgroup. \begin{equation} \label{eq15} LR = 2\left(\sum_{g=1}^G \log L_c(\hat{\bm{\eta}}_g;\bm{X}_g)-\log L_c(\hat{\bm{\eta}};\bm{X})\right) \end{equation} The underlying principle of this test statistic is that of \textit{subgroup homogeneity} in Rasch models: for arbitrary disjoint subgroups $g=1,\,\ldots,\,G$ the parameter estimates $\hat{\bm{\eta}}_g$ have to be the same. $LR$ is asymptotically $\chi^2$-distributed with $df$ equal to the number of parameters estimated in the subgroups minus the number of parameters in the total data set. For the sake of computational efficiency, the \pkg {eRm} package performs a person raw score median split into two subgroups. In addition, a graphical model test \citep{Ra:60} based on these estimates is produced by plotting $\hat{\bm{\beta}}_1$ against $\hat{\bm{\beta}}_2$. Thus, critical items (i.e., those fairly apart from the diagonal) can be identified and eliminated. Further elaborations and additional test statistics for polytomous Rasch models can be found, e.g., in \citet{Glas+Verhelst:1995a}. \subsection{Non-parametric (``quasi-exact'') Tests} Based on the package \pkg{RaschSampler} by \citet{Verhelst+Hatzinger+Mair:2007} several Rasch model tests as proposed by \citep{Ponocny:2001} are provided. \subsection{Martin-Löf Test} Applying the LR-principle to subsets of items, Martin-Löf \citep[1973, see][]{Glas+Verhelst:1995a} suggested a statistic to evaluate if two groups of items are homogeneous, i.e., to test the unidimensionality axiom. %-------------------------- end goodness-of-fit ------------------ %---------------------------- APPLIED SECTION ---------------------------- \section{The eRm package and application examples} \label{sec:pack} The underlying idea of the \pkg{eRm} package is to provide a user-friendly flexible tool to compute extended Rasch models. This implies, amongst others, an automatic generation of the design matrix $\bm{W}$. However, in order to test specific hypotheses the user may specify $\bm{W}$ allowing the package to be flexible enough for computing \acronym{IRT}-models beyond their regular applications. In the following subsections, various examples are provided pertaining to different model and design matrix scenarios. Due to intelligibility matters, the artificial data sets are kept rather small. A detailed description in German of applications of various extendend Rasch models using the \pkg{eRm} package can be found in \citet{Poinstingl+Mair+Hatzinger:07}. \subsection{Structure of the eRm package} Embedding \pkg{eRm} into the flexible framework of \proglang{R} is a crucial benefit over existing stand-alone programs like WINMIRA \citep{Davier:1998}, LPCM-WIN \citep{FiPS:98}, and others. Another important issue in the development phase was that the package should be flexible enough to allow for \acronym{CML} compatible polytomous generalizations of the basic Rasch model such as the \acronym{RSM} and the \acronym{PCM}. In addition, by introducing a design matrix concept linear extensions of these basic models should be applicable. This approach resulted in including the \acronym{LLTM}, the \acronym{LRSM} and the \acronym{LPCM} as the most general model into the \pkg{eRm} package. For the latter model the \acronym{CML} estimation was implemented which can be used for the remaining models as well. A corresponding graphical representation is given in Figure \ref{fig:body}. \begin{figure}[hbt]\centering% \includegraphics[width=157mm, keepaspectratio=true]{UCML}% \caption{Bodywork of the \pkg{eRm} routine}% \label{fig:body}% \end{figure} An important benefit of the package with respect to linearly extended models is that for certain models the design matrix $\bm{W}$ can be generated automatically \citep[LPCM-WIN;][]{FiPS:98} also allows for specifying design matrices but in case of more complex models this can become a tedious task and the user must have a thorough understanding of establishing proper design structures). For repeated measurement models time contrasts in the \pkg{eRm} can be simply specified by defining the number of measurement points, i.e., {\tt mpoints}. To regard group contrasts like, e.g., treatment and control groups, a corresponding vector ({\tt groupvec}) can be specified that denotes which person belongs to which group. However, $\bm{W}$ can also be defined by the user. A recently added feature of the routine is the option to allow for structurally missing values. This is required, e.g., in situations when different subsets of items are presented to different groups of subjects as described in Section \ref{sec:mpcml}. These person groups are identified automatically: In the data matrix $\bm{X}$, those items which are not presented to a certain subject are declared as \code{NA}s, as usual in \proglang{R}. After solving the \acronym{CML} equations by the Newton-Raphson method, the output of the routine consists of the ``basic'' parameter estimates $\hat{\bm{\eta}}$, the corresponding variance-covariance matrix, and consequently the vector with the standard errors. Furthermore, the ordinary item parameter estimates $\hat{\bm{\beta}}$ are computed by using the linear transformation $\hat{\bm{\beta}}=\bm{W}\hat{\bm{\eta}}$. For ordinary Rasch models these basic parameters correspond to the item easiness. For the \acronym{RM}, the \acronym{RSM}, and the \acronym{PCM}, however, we display $\hat{\bm{\eta}}$ as $-\hat{\bm{\eta}}$, i.e., as difficulty. It has to be mentioned that the \acronym{CML} equation is solved with the restriction that one item parameter has to be fixed to zero (we use $\beta_1=0$). For the sake of interpretability, the resulting estimates $\hat{\bm{\beta}}$ can easily be transformed into ``sum-zero'' restricted $\hat{\bm{\beta}^*}$ by applying $\hat{\beta}_i^*=\hat{\beta}_i-\sum_i{\hat{\beta}_i}/k$. This transformation is also used for the graphical model test. % % % \subsection{Example 1: Rasch model} We start the example section with a simple Rasch model based on a $100 \times 30$ data matrix. First, we estimate the item parameters using the function \code{RM()} and then the person parameters with \code{person.parameters()}. <<>>= library("eRm") res.rasch <- RM(raschdat1) pres.rasch <- person.parameter(res.rasch) @ Then we use Andersen's LR-test for goodness-of-fit with mean split criterion: <<>>= lrres.rasch <- LRtest(res.rasch, splitcr = "mean") lrres.rasch @ We see that the model fits and a graphical representation of this result (subset of items only) is given in Figure \ref{fig:GOF} by means of a goodness-of-fit plot with confidence ellipses. <>= plotGOF(lrres.rasch, beta.subset=c(14,5,18,7,1), tlab="item", conf=list(ia=FALSE,col="blue",lty="dotted")) @ \begin{figure}[hbt]\centering% <>= <> @ \caption{Goodness-of-fit plot for some items with confidence ellipses.} \label{fig:GOF} \end{figure} To be able to draw confidence ellipses it is needed to set \code{se = TRUE} when computing the LR-test. % % % \subsection[Example 2: LLTM as a restricted Rasch model]{Example 2: \acronym{LLTM} as a restricted Rasch model} As mentioned in Section \ref{Rep}, also the models with the linear extensions on the item parameters can be seen as special cases of their underlying basic model. In fact, the \acronym{LLTM} as presented below and following the original idea by \citet{Scheib:72}, is a restricted \acronym{RM}, i.e. the number of estimated parameters is smaller compared to a Rasch model. The data matrix $\bm{X}$ consists of $n=15$ persons and $k=5$ items. Furthermore, we specify a design matrix $\bm{W}$ (following Equation \ref{eq4}) with specific weight elements $w_{ij}$. <<>>= W <- matrix(c(1,2,1,3,2,2,2,1,1,1),ncol=2) res.lltm <- LLTM(lltmdat2, W) summary(res.lltm) @ The \code{summary()} method provides point estimates and standard errors for the basic parameters and for the resulting item parameters. Note that item parameters in \pkg{eRm} are always estimated as easiness parameters according to equations \ref{eq1} and \ref{eq2} but not \ref{eq:rasch}. If the sign is switched, the user gets difficulty parameters (the standard errors remain the same, of course). However, all plotting functions \code{plotGOF}, \code{plotICC}, \code{plotjointICC}, and \code{plotPImap}, as well as the function \code{thresholds} display the difficulty parameters. The same applies for the basic parameters $\eta$ in the output of the \acronym{RM}, \acronym{RSM}, and \acronym{PCM}. % % % \subsection[Example 3: RSM and PCM]{Example 3: \protect\acronym{RSM} and \protect\acronym{PCM}} Again, we provide an artificial data set now with $n=300$ persons and $k=4$ items; each of them with $m+1=3$ categories. We start with the estimation of an \acronym{RSM} and, subsequently, we calculate the corresponding category-intersection parameters using the function \code{thresholds()}. <<>>= data(pcmdat2) res.rsm <- RSM(pcmdat2) thresholds(res.rsm) @ The location parameter is basically the item difficulty and the thesholds are the points in the \acronym{ICC} plot given in Figure \ref{fig:ICC} where the category curves intersect: <>= plotICC(res.rsm, mplot=TRUE, legpos=FALSE,ask=FALSE) @ \begin{figure}[hbt]\centering% <>= <> @ \caption{\acronym{ICC} plot for an \acronym{RSM}.} \label{fig:ICC} \end{figure} The \acronym{RSM} restricts the threshold distances to be the same across all items. This strong assumption can be relaxed using a \acronym{PCM}. The results are represented in a person-item map (see Figure \ref{fig:PImap}). <>= res.pcm <- PCM(pcmdat2) plotPImap(res.pcm, sorted = TRUE) @ \begin{figure}[hbt]\centering% <>= <> @ \caption{Person-Item map for a \acronym{PCM}.} \label{fig:PImap} \end{figure} After estimating the person parameters we can check the item-fit statistics. <<>>= pres.pcm <- person.parameter(res.pcm) itemfit(pres.pcm) @ A likelihood ratio test comparing the \acronym{RSM} and the \acronym{PCM} indicates that the \acronym{PCM} provides a better fit. %Since none of the items is significant we can conclude that the data fit the \acronym{PCM}. <<>>= lr<- 2*(res.pcm$loglik-res.rsm$loglik) df<- res.pcm$npar-res.rsm$npar pvalue<-1-pchisq(lr,df) cat("LR statistic: ", lr, " df =",df, " p =",pvalue, "\n") @ % % % \subsection[An LPCM for repeated measurements in different groups]{An \protect\acronym{LPCM} for repeated measurements in different groups} The most complex example refers to an \acronym{LPCM} with two measurement points. In addition, the hypothesis is of interest whether the treatment has an effect. The corresponding contrast is the last column in $\bm{W}$ below. First, the data matrix $\bm{X}$ is specified. We assume an artificial test consisting of $k=3$ items which was presented twice to the subjects. The first 3 columns in $\bm{X}$ correspond to the first test occasion, whereas the last 3 to the second occasion. Generally, the first $k$ columns correspond to the first test occasion, the next $k$ columns for the second, etc. In total, there are $n=20$ subjects. Among these, the first 10 persons belong to the first group (e.g., control), and the next 10 persons to the second group (e.g., treatment). This is specified by a group vector: <<>>= grouplpcm <- rep(1:2, each = 10) @ Again, $\bm{W}$ is generated automatically. In general, for such designs the generation of $\bm{W}$ consists first of the item contrasts, followed by the time contrasts and finally by the group main effects except for the first measurement point (due to identifiability issues, as already described). <<>>= reslpcm <- LPCM(lpcmdat, mpoints = 2, groupvec = grouplpcm, sum0 = FALSE) model.matrix(reslpcm) @ The parameter estimates are the following: <<>>= coef(reslpcm, parm="eta") @ Testing whether the $\eta$-parameters equal 0 is mostly not of relevance for those parameters referring to the items (in this example $\eta_1,\,\ldots,\,\eta_8$). But for the remaining contrasts, $H_0: \eta_9=0$ (implying no general time effect) can not be rejected ($p=.44$), whereas hypothesis $H_0: \eta_{10}=0$ has to be rejected ($p=.004$) when applying a $z$-test. This suggests that there is a significant treatment effect over the measurement points. If a user wants to perform additional tests such as a Wald test for the equivalence of two $\eta$-parameters, the \code{vcov} method can be applied to get the variance-covariance matrix. % % % % % \section{Additional topics} This section will be extended successively with new developments and components which do not directly relate to the modeling core of \pkg{eRm} but may prove to be useful add-ons. % % % \subsection{The eRm simulation module} A recent \pkg{eRm} development is the implementation of a simulation module to generate 0-1 matrices for different Rasch scenarios. In this article we give a brief overview about the functionality and for more detailed descriptions (within the context of model testing) it is referred to \citet{Mair:2006} and \citet{Suarez+Glas:2003}. For each scenario the user has the option either to assign $\bm{\theta}$ and $\bm{\beta}$ as vectors to the simulation function (e.g., by drawing parameters from a uniform distribution) or to let the function draw the parameters from a $\mathcal{N}(0,1)$ distribution. The first scenario is the simulation of Rasch homogenous data by means of the function \code{sim.rasch()}. The parameter values are plugged into equation \ref{eq:rasch} and it results the matrix $\bm{P}$ of model probabilites which is of dimension $n \times k$. An element $p_{vi}$ indicates the probability that subject $v$ solves item $i$. In a second step the matrix $\bm{P}$ has to be transformed into the 0-1 data matrix $\bm{X}$. The recommended way to achieve this is to draw another random number $p^{\star}_{vi}$ from a uniform distribution in $[0;1]$ and perform the transformation according to the following rule: \begin{equation*} x_{vi} = \left\{ \begin{array}{rl} 1 & \text{if } p^{\star}_{vi} \leq p_{vi}\\ 0 & \text{if } p^{\star}_{vi} > p_{vi}\\ \end{array} \right. \end{equation*} Alternatively, the user can specify a fixed cutpoint $p^{\star}:=p^{\star}_{vi}$ (e.g., $p^{\star} = 0.5$) and make the decision according to the same rule. This option is provided by means of the \code{cutpoint} argument. Caution is advised when using this deterministic option since this leads likely to ill-conditioned data matrices. The second scenario in this module regards the violation of the parallel \acronym{ICC} assumption which leads to the two-parameter logistic model (2-\acronym{PLM}) proposed by \citet{Birnbaum:1968}: \begin{equation}\label{eq:2pl} \P(X_{vi}=1)=\frac{\exp(\alpha_i(\theta_v - \beta_i))}{1+\exp(\alpha_i(\theta_v-\beta_i))}. \end{equation} The parameter $\alpha_i$ denotes the item discrimination which for the Rasch model is 1 across all items. Thus, each item score gets a weight and the raw scores are not sufficient anymore. The function for simulating 2-\acronym{PL} data is \code{sim.2pl()} and if $\bm{\alpha}$ is not specified by the user by means of the argument \code{discrim}, the discrimination parameters are drawn from a log-normal distribution. The reasons for using this particular kind of distribution are the following: In the case of $\alpha_i = 1$ the \acronym{ICC} are Rasch consistent. Concerning the violations, it should be possible to achieve deviations in both directions (for $\alpha_i > 0$). If $\alpha_i > 0$ the \acronym{ICC} is steeper than in the Rasch case and, consequently, if $\alpha_i < 1$ the \acronym{ICC} is flatter. This bidirectional deviation around 1 is warranted by the lognormal distribution $LN(\mu,\sigma^2)$ with $\mu = 0$. Since it is a logarithmic distribution, $\alpha_i$ cannot be negative. The degrees of model violation can be steered by means of the dispersion parameter $\sigma^2$. A value of $\sigma^2 = .50$ already denotes a strong violation. The lower $\sigma^2$, the closer the values lie around 1. In this case the $\alpha_i$ are close to the Rasch slopes. Using the function \code{sim.xdim()} the unidimensionality assumptions is violated. This function allows for the simulation of multidimensional Rasch models as for instance given \citet{Glas:1992} and \citet{Adams+Wilson+Wang:1997}. Multidimensionality implies that one single item measures more than one latent construct. Let us denote the number of these latent traits by $D$. Consequently, each person has a vector of ability parameters $\bm{\theta}_v$ of length $D$. These vectors are drawn from a multivariate normal distribution with mean $\bm{\mu} = \bm{0}$ and VC-matrix $\bm{\Sigma}$ of dimension $D \times D$. This matrix has to be specified by the user with the argument \code{Sigma}. In order to achieve strong model violations, very low correlations such as .01 should be provided. To specify to which extend item $i$ is measuring each of the $D$ dimensions, a corresponding vector of weights $\bm{z}_i$ of length $D$ is defined. If the resulting $k \times D$ matrix $\bm{Z}$ is not provided by the user, \code{sim.xdim()} generates $\bm{Z}$ such that each $\bm{z}_i$ contains only nonzero element which indicates the assigned dimension. This corresponds to the \emph{between-item multidimensional model} \citep{Adams+Wilson+Wang:1997}. However, in any case the person part of the model is $\bm{z}_i^T \bm{\theta}_v$ which replaces $\theta_v$ in Equation \ref{eq:rasch}. Finally, locally dependent item responses can be produced by means of the function \code{sim.locdep()}. Local dependence implies the introduction of pair-wise item correlations $\delta_{ij}$. If these correlations are constant across items, the argument \code{it.cor} can be a single value $\delta$. A value $\delta = 0$ corresponds to the Rasch model whereas $\delta = 1$ leads to the strongest violation. Alternatively, for different pair-wise item correlations, the user can specify a VC-matrix $\Delta$ of dimension $k \times k$. The formal representation of the corresponding \acronym{IRT} model is \begin{equation} \P(X_{vi}=1|X_{vj}=x_{vj})=\frac{\exp(\theta_v - \beta_i + x_{vj}\delta_{ij})}{1+\exp(\theta_v-\beta_i + x_{vj}\delta_{ij})}. \end{equation} This model was proposed by \citet{Jannarone:1986} and is suited to model locally dependent item responses. % % % % % \section{Discussion and outlook} \label{sec:disc} Here we give a brief outline of future \pkg{eRm} developments. The \acronym{CML} estimation approach, in combination with the \acronym{EM}-algorithm, can also be used to estimate \textit{mixed Rasch models} (MIRA). The basic idea behind such models is that the extended Rasch model holds within subpopulations of individuals, but with different parameter values for each subgroup. Corresponding elaborations are given in \citet{RoDa:95}. In Rasch models the item discrimination parameter $\alpha_i$ is always fixed to 1 and thus it does not appear in the basic equation. Allowing for different discrimination parameters across items leads to the two-parameter logistic model as given in Equation \ref{eq:2pl}. In this model the raw scores are not sufficient statistics anymore and hence \acronym{CML} can not be applied. 2-\acronym{PL} models can be estimated by means of the \pkg{ltm} package \citep{Riz:06}. However, \citet{Verhelst+Glas:1995} formulated the one parameter logistic model \acronym{(OPLM)} where the $\alpha_i$ do not vary across the items but are unequal to one. The basic strategy to estimate \acronym{OPLM} is a three-step approach: First, the item parameters of the Rasch model are computed. Then, discrimination parameters are computed under certain restrictions. Finally, using these discrimination weights, the item parameters for the \acronym{OPLM} are estimated using \acronym{CML}. This is a more flexible version of the Rasch model in terms of different slopes. To conclude, the \pkg{eRm} package is a tool to estimate extended Rasch models for unidimensional traits. The generalizations towards different numbers of item categories, linear extensions to allow for introducing item covariates and/or trend and optionally group contrasts are important issues when examining item behavior and person performances in tests. This improves the feasibility of \acronym{IRT} models with respect to a wide variety of application areas. % % % % % \bibliography{eRmvig}% \newpage% \rotatebox[origin=c]{90}{\includegraphics[width=1.1\textheight]{eRm_object_tree.pdf}}% % % % \end{document} eRm/inst/doc/eRm.pdf0000644000175100001440000177167614505105713014005 0ustar hornikusers%PDF-1.5 % 134 0 obj << /Length 3080 /Filter /FlateDecode >> stream xڵZIs6W2UTsJtRi&t[HBRv~|@婙A o|#~;)@摒i?RQYAD'ip~ 2ZKcԮ?gYWʼnS0i}=g"aU^=.djMyGeTKHELJ"VM@ZD 2BeQM7aBf'B&i;~;QR!䏺oB2!H$s, ?U]2vPSE$|{ )dP (֘(.IB?/+yʌ> <.L&Q)cFk" sPL Βe)eT΀7M>%W`<0/6JoZ}a5Ԏmo=~X4lݢᒈaK~_m6=Bf`ky= ڇ Uy'Ahh y%Md-~^!Cw(y̬v9jRmFfв_c1z9CSy@"_MۿF:Obw$g!vF58K$.Zæg%dմǞ7/Sg;j=%3uCla!P7B,yfG 1/k7r"%YjLˢ2 >5EPMvL|u׮iX[^=̺G)<~0VxX7sfE2{mC>u_wbWdV&XVIDn1ÜDR:YTf]8.!q*7ar1v}IE<@ORwJ1{LDWʣ #*&; [T~2q~0#{ 4M}ҷc,w6YQ~X#[Y=)Iq֭f6%lCBZq2Y}s}I_v^0UJw )Y 5?ݬTzНc;^bN\:)4d]Y䑈c(ֻ)vQgniSq1];t|-fl';w˾cY" pq ͥZsOQXQ]{u ;O$b+\gF;3"FDvk1X[ƘOht'-G$t5GQ5|S> ߷ds]Ee$t:\#4Rb܇s86(iT ,\vDH٭ʼӖ4ʋQiWoI2"KƐJb̨X="av#B+a".Ehs@*F * !e7@:I[נt[ mꈴ|%QSa $!lZN0Rז) N NVJĩ~&[տH,?J"Q7퇳)zyE"˲+V͎6)iT4AU1 wL5N*kN!$Ǎ۪yrpSlsL/a)y; SxBB)#'Ls&Eu4B|XۭѤzX͜!T'T>I>}oPvC+&F&1f`;VIbǖY9;[fT|v%n1sWĈd de87wJҼZ&' l>=9z|2qSDD d3e¦, 3q0g`gÉ/FI]ѵtZ1GnM}kS2ʕUnl]c|iK|ڝMI {{Ocơm-a#HeJ%t8u?"R(r\)!~sII7.JxfC}ܕBffWkm5Y&,{1apl uz$% 2QQb_SKI3n+DŽ񘘁vBˇX.9E2u6hF3 unGX ݛϽy2yb|4tO7T&VSg&6DX P vZ@;1PЄޏ凗Ьk+6{~lO=; %Dz){UDA}j@6 QX6:/c׵> stream xێ}B}*Zӹ_\!)4 5`+qW%Q!:_37jKJa̹͹fxͷ7`5#l~L mAoYFHI Pܤut%ge2Ny.IQ.?s"b.qκg 1O@cRnahvP7r3_P!mTo-bS6iV~S.`HaJJ$Uvs7N$a0RUw\V$/Dr7UX}EQ՛6~R}~9Y Nk$ǽڮ0|.~ _=,PQR$ мÄO '͊ [Uc}X7p?Kai‰($E<+%T Mt!a1!wn;uFNMJ&tǨx 75QCH5e]@\$i8Uz -Bƙb,qNA531oɦkn4(\LmUu˶JFTHڇY||쭛2 ׷قHT͉.*'M\^Fo6(k~ |8nd,FfU0 ml^8`42la?~(̵( /IePyZ8{6ouTIMKSzʍl<&_g((T*$FD| n߁۹wY'nznpY AeLn[λe]*DAT(h(C3#Ep$JcWK!HOa~6fc9k1á yqVi<~V{ zM/YZe#om֌qFb[Ibta\t6Z pG_ lm{ւp\cL~EN!R}xb}X l.I7*0X))>јڼr !BSe&lwۃ7/&UI)A =>S.8{VoeX4pƪk+1RdM9l!"u/#6z)-DZ]<^1[ku 7R"&G7G# ۴ YAțEț>lzqĸN!qf DP"uӡڭOx]vsB B8D" 0pV;xn}MG:d-%NBm[WV#pޙ} :] v?merɊF/wݺ-j  O`gj[b".!! +nͶ9:QŃL{PԦATP3Y܃n>M!:Ǭ +ȉ j=7ͭ{!VW!6b"6W#s*Y1qOwUHk}tM);nb?Sc'n[/ ӺrI/O=WrF75!cC=]`HB!~s)Q%b 1 !n=[3oCH6 f[zV~ȧXg 1/ (!'a&)%cvsqK:Csm=`U\ψXNsRSDDd@3g/!vS@/*<= 3*Mr*9[E>m53 Ӫbo^wnWS&nջ^ PnL2s> :3n@!/L"b"/C(H1H>D;]%X/eTJ&Ypt60FoOZ 6d1U>d,ՉE I1&j c,J3' Tɴ)2'E)a#i ]> stream x[koF_1baj34nҤA°6PtFU {.5DXIus30meBX33{&S;ʹu5ϜL Haq Jx grΔ>vLi&b IQCL &-J i5D:!dx@͔13-a @vʙY0LPCEǙR3@ʹC%hjY; ű ŀf=5Au`11, '= .CaVq~Xf}sqsIzJ9-@c; QCfXŖL42KM? )cdy ~̻cV@X @'@a`WG5 6K{z 9'@\$0 @6ʐ`A(b➆ R0sajxsӓQ#ɒp!s0@4.Iđ X9G;PIk@m R G,lx͆ _﮳΋iģ7Ӻ,Fš໷Y7ҦMI6#iWcu6eURwcRq'|nZDERhE6U nIWF¸}K:fe2&IYUTF5kKxVY{W6P]e. hqb郖u#suE3?mets٬^Q)/yMzyidh.iz?7Z&y]'nɆkrOw̲Z\%e2j Ϫk7CkI7gV18i7du4$:q-OM \|m/-_Y'mt"2R6]ɬ,=uU+ dtErU|bn+&v{e;lxnx\zYjm6_»vDP%(mQvI6vZ_zQoozlj~C0p2~6 dE HI{m't}~p'T=i":#%úd|Owuxuh+mx ꫈[9w(ѵ>k 8btRKveOl+߯Tأ]~'rWѯE5O$goӔ4z?G*[nn tL- D!ءh7[LO*koo$ʞy*U nۯUӏɇl-%Ѳ8۝׷M;-=RaҊu=?W 0+AQyZl]2goH̻֯ H$Nn]~;}xE?\WC6j\46%bklܴqjIE>ft\NZZJ|q@T\39.WSh=z)YǘdI0ɦu;y(Je1U.sN]zl-f]oI"Y_un3!kЇdw*ga(9{]̨;uIxݝ߷1( ݊Z-qp;xm^-Uoҳ >ޕ[^U:oV⸘G"mڹ.| bWQW-[ ήU^#|ϟ7_f^/iM!˄t`xUżLyҜFyc^,ZD>~7$p&Y~6{F7O {>^a/^}'< Oy"ȓA d'< Oy2ȓA Tsj!ݠl`|q0(17j? _i ci9M_@TUz #3)&?'釬<P8WPXcW@?*y 9ZzU+%8VQ]q|<)h&CK k61l3m\̗f#.6+fqC(L $N HAԑ/#G_@RHͣXArDr{D 1ZbDIz ES@&1Ve}c*H)uzO<" BQ? -}$+E#cstt``G,>7H DqR)rlSJ͜㰯4 $WZ$JH-DYoZ$0O1ER$FM$RSCn:MYҳ?SVx VDj hk@}V@y`N&2Ql֍Nv\X^Dp@,p[͗G}2# /"@-^|ņ7zscsȫ#/~z 7vyolXaƆolXaƅ y.sa: +b]ȑ/F XGݛa2r-7;u 8b!:b|REqČP\|@n:}(a::f3Q W\@"R<6 ixBCb=4|G;VGBxИ{$q8I6Vښ88QPM+āI84Gu%fBA4=f׆VH^>>бEOyI.i+ ȭ^ۯ?& endstream endobj 225 0 obj << /Length 2794 /Filter /FlateDecode >> stream xڽZݏ ߿b=b}Z͵ pmzه>x='c{b{KҌ(z$HJX/_{OY|V2fLg,zZ4<)Y2tUQh|(nfn'+'jK7^ʖ>`vO?DH")-S,= R_/lʌL|T꧍F&uQ5%2OvC6=JdL S~5ѿ.IvK^{[9ܜޘP9k7Db/5V rzOkbK?fvӔt"Xyԝ3xo2y>YR rCsສ2 Q]ߟRFハ2kUY؄j&匰=9\)x%ڵ }mXڃECώx߬"fFj)lJw1֋nGT}|4uIL(Spљ7Vtkyoߘp׵K?(ŹwOQB)f)Toq'蛦]/>Eqc8bNy`f2(.ΑA&Ю\A8"yl 0bgdCI (C[zMB U=o]iN͆CqhXR Tva.)OG6۪qEcX%B$*XQHZQ8",F<,vbR.e ]E/%!3q!J)kHbpnrq. iQ`$~xawz]gYUBt萟j'>,=L#ﲭ&?RIdLdrS.6dpuXk@  4:k=Xn2Z)/Y 9 gmXUJy=j@$uӌN~9JvX&"Bo9e }=0)Ѥq)K6>S5Yn}}& YчUl\OrF]j;K\H]\yU=@ph[>\Btyw=EZMx̘Ym^1 8gz.6}Bxi&EնM~^%W?cIl-IYѬ&Qx.zߨÒJ\H|M`>j]CV@4cok|?lR$Xǒ2σcǎzDhuo;jJ >* &ڃb۷Ջn )fT\ bt,d|*>ڑRH=v}}{O=K~'ZC 13$Sbg! UzegLrUsvTK@W2^L"|7~ `հcc8g,o0.Zvt;Ԋ/חRMفNifr)HVSd#D9jlcƋ~%=)r=arWwN %ǚt`9bͶ$hT Q:{]6+5uɡsWjI9]hըIwmWxZaY ,H̆ ĀoClcвGc!Ȱfp2*,w\zTu ݾ$&Fn?aZ܌x]@f?y, oI s&{߯!5`x%gˡ0AVīݨ@(9rkr_xܻ}}\_+MW.4];+̽V5SCcG%?2֜_k*u|ipZfPs %2瘀&&0ƘۺYn\ƧxGСvv) P䮭oaZS=** >PЩ%2z$'2/>Х$@nknxn!y+y*Ÿ́C۬ sEIB- VKFFѿ?I;zcȕqЉ0XgFGPPIgjKGڮr}4?vǐxﻧI endstream endobj 180 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./modelhierarchy.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 229 0 R /BBox [0 0 98 150] /Resources << /Font << /F1 232 0 R >> /ProcSet [ /PDF /Text ] /ExtGState << /GS1 233 0 R >>>> /Length 926 /Filter /FlateDecode >> stream HV=o1+\ ǟ-"!"!n;DP"PRQy36.7=oQI8yg?Yg[V_락߾;Ӽ9yx˚L5do= >82e<MD/XVj%f1C8D\}{!jaYo֘;W?b~D;v7ZD:;VN3l'`8r\o_#|XG3q{O W<)6~!EVǔ5pZw:JX'>7V-QHCX;ksē׮{J ml LM$8],n͞t*,x:v8Ej~UWLųL=)nXyS!CNP_5dh=lYMI%tMQJTa ܐKaCԺD5[Xsay*n^%uJ9J0;ɇ߻jmx"^Or\qϘ%'޳WhG5n[ڹب\ǙU\ ʼn6*uK,TS ]7e&*Ϡ/ ^> stream x[Y~_Drqʯ90lrATDeN}W]~Ke[r+3f 9͛3a>|u(- csF*Ii-|uJ,FI+Bul'4dlRnwka$^hٯkfx۝8EQX9c{s"IB`pnܽ=/c}~ӛS(w<{TD2O`~Zñ[pEW_گbńX%t'<>& 1*`#c eägAEvvѹp"1ݤvSN 9+ H"id%t?Ib%[:e&Uz|h*p~2&E)*p%Ӂt&ˇ:;JgU 9dz}c߭r5rP⻻y/7Ӳְ<@ χWFz2by1Wda>F4WnI&Kd%!<xȔԏcC9v{c.I'QĔW7@0)ozv4.wZA F`u#?gd>)xw<>|) :<RsvbcQddVLmm9@!Ar zDL"s@bS H҅Re6+x{_7YΛeR/u׳H>hc)eۂ?ö+~ܬAGbhJ;)^T3& TDB-k[b0+~QplT1!я\p.&s,YA4 [:ɰ()o"@:DEx~a=ږDxTbGB:1aq╄'Y h:lƦvm 0>,{-X[;Ax`DWx%e~ K> YN3F%Py€7X %!U`;+m3I)i'`ORFfrJB}q!v&$g[ j.R!Lg( eV`ν! A,ReJ(Ƿ1_Dm[+/ubiY+=J{-jR֔dmPFLq\2i>qLfiL.lmifp8!ݮ8Nkʫ IA=N i'"Sz(A)5'j0@lҚ=#hgm|KuS^b"ˏU۬aSoRuM0y`0nK#i&Z1"qr`ɼqfDz_zy(*]@'NZt>9 Xo|r\?7joe !rk=-$,\s\3=B }x0BKM 2$x..ו;7S*O&AֻB:2'@yT44'K/b_?^[EGC.$ǽbi|ѿ^67w Cv /z<w6웶=ۓp-ףcUW2AwoTpH̚+R]s &ٛlY8XI-Ebl֬7|S(kAܞ;Nc}MF*~p,nz=J/GbY) 7f09 k',^9M=s|*ttֱ ;W):2ѱ,rH5SDo@IbPMw>N#1}f8u n*3ᴙU9]M~*u,fr8E_O+^*Bt(t20=8 HqJ&b9~ELxj뼺&Z^62S7 ^*JxyGȪ¸_lDax +$رKB-saI} [Ŀ+Rs~B!BtLydzgR#)l*o{ >±MJ'&(0^ͮKb6׶(=rM얦hٗps6YrJw5V^hxycXO ӦGp_&jav%``w]xZ+ˮV4@]{-|8*rR6ŜA(/Toi+J=0=S9gY3r4ﴬ5yQa'j7+i+j6χCYjGRTajCuYKIon)R%]mkFZm9,[T_N1JʩXb]d&OUGmѴ_]* 4o&_(f$e֥RcdhRiZoO8o~u=N`wFf endstream endobj 285 0 obj << /Length 4186 /Filter /FlateDecode >> stream xYݿB;Hm&"WwYKVv~}%- ,9~W՛W"lͻ VJ(dXٮ~*(ת Q|WǵōnMH=߸ և5E֓Rfq3BaV Ĥ'rtD&<#7Z/5I.x\`pMlSg#uƀ_.GҖXݯlM |(ўȸ ~#: |_cw*w~1+%ph3Qe pRְC}yz\Ҽv#5[} 0iB+7j-0n}2k u5[-qDV^m4fs:32]dHu2Aj0I`WCp,. 9w2 +c-+-k8Ls+"~Y%a7.sXHipӚ+ÌP0'!C z1}B}UcO>Y;fS 6t٤ & &S!mmzvĆDr@$?6%Mɔ^K8Ҕ擇 bZ^tW+3yYo@sQұ ڃ*5u3nfF$x=^q˝ti,I-(p.t FaJmljm 󭳈i~nF _2A!o!&'jX 2y;l2JU3U4u v<<-J-~k\4_Q$U8gZLKOj{eg̰|w,I{oNJ4˲"@I'Ϡ4-\=&Ԇ4#Y$̤:>DUChUy0ABfp wK>NbHfTΧrr!sV)Ȝoǩ1SchkbCiidST1xp؋Ű M2-=s,=Pie|Ns|M,w`ƫ!O,ˣĘ+^K[?S (v()Ϭ6r@(2 (HAXtmk u(T{6/t xWwNb N;_4QCQ$Oם:PI1'cB-RY"37 5Z|!`& dtI1h =3PU;UM.veBog!bÆhxeŮ:wfɧ+dPɦ9M,>Vn%D>jh=8ceFs^23ӈ}mf> ɒc$!˖wDAT3Bbᄄ )Nm,gvL>2/^yy|r0m<d1`V3w53s*lmq糓t^1 h*d@ U郣)hi<ؕ~LݦdSO}8 ko}imH$^^j B(ln@ lBwhg}!p$@n28E#E|2zf$Ul`fJKϥ{n,[ dDv~V.l0+w:$Ux-  gn6l3^2=nRR{ҩ0d fJAZ#hCQ uAo:-."%e OrSCt{{:bXS@ٝQ٧'Єƞc,q!vV:3I (┎HBz1@ۉlRd9/yms/>}l$CT#!TZ2\dErmjlYdz[C8veuB;Cn~gU]@|#- OUZ.)զj[72svrۻ'-%xl"q蹵?ҡ猬3%+kkna_ؒCZ{s3xC,6M^2? &ث<[fkR;[*i&Bn"X׸L!* 6+D"SR~Z{EjaJ*<6It_|cS˅CX=7@2Jww sR5CU 6KI[S&.뉝,~!ϷOl dǚ :/he+!>-aX`̸s0iBa© ΐ;mW \6> stream x\YsF~ׯ>-X+}$M6ImjS]v Peߞ (pR=_w=$gw3^7 ˙ ॥!x!Dt9)#sEqI \ZEbF#m{=pi5L' ++!0d8߀h(@d0,:X8q"n8j3@b^سMC sYbhJeyMh \Ǹ19i[$ QME$38DҼ蕗x 0IvxjDD¼D!/$k'1/JOkuAZ r70_aKܝ>6B#wא;lܖ8}.FH6W!wB{I:yr'4i_襵fa`M{` \,p:ߛFZDxTgt:]5a}GutϒibK՝);O\3ꦱpTDDw99W]V>^E>Gug*8TDD¼/T##el9F؜ftln "ᘞ;F7as"ne9tB~vaݙT34hxթq#&0 1@t\w)'>NSivAxj DDwq +]Oc_\3$&8; jYt70_-a^/e!xji"(DHIn;߀)#o@D{Y;u~9?"MםgxZt7,1\udy W3p~eTK=6|M,Y$ܰE]m}&l__#n&UUpURcUl\dZ%s>{ߺ7̻]˝kvkL w wlFͅ`z܏ǜn.^~34rkd}rI ߿FvveD %ٯ-ŗ|3'8{XQ e6xCbV[h;؇cX|S׾qoD7AhF G75Dp9!K+BWLxm$1Fta⺵[.CѺ9l٢~yb'w> 7v! 91_۹vneyHL~֯ @"{vw>cXh1,&SAY+֥WZPY5>(M!*3HELVZ̳r7=\}w>2wp:Y #[w V$.L ^%)u߼ \cYI%"Wdmq;< Z} <$Ha'3B)Uʷ߸#Zj-;$X{\[3/Xjg˵-&@_;YWҙ9q CUf~̒N߅bֆ@Qos~xBB*' AϜ7~_xBtBe2OC׈f+cKƊۣHcr ^eR,ʬI˦+(pGȳ &%#Q SLm%>V/v^4}yG Þ5tClL@`&v?伩 ʩ ^Lx*^ڳzHrxf9=]? wtkNz-aeZ lY#=JPE$$ Fhʕ'WT{\碶 1<ώ::bfE-:,p[ Ka ; } 1;籷"Cpb 58w5Ͼ%ʇhKNK%΃;`J*m//]WҺ5l5njc`Z\6ժ =ILtRPxz&ۅ:ڭI-D+o#4)yrA& IݣAp/WYrgCGEB@$ٲ`CGtwTWTnU<]ܔzocfٿ=:أm^[ϡ6u:-|[4ukn kZ_[$/1fk{gHC ܞU.PibGfœ}2٪> stream x\ݏ66.։,>mMHtWER)S{f͏bYM_?W-1rE䆬޾[2*3LW[d]lT_6[*j6"_^,C}޻T 2}j׬_"X>1qÀbKNrr O4Y)J\#է ˮTQvsXV0ɷ?~qb"v Ӝgcp54WnRx,eӺ|lʶ6su &4N{weVɽ=<}s4ӥu&g jhjwAD .VlÃe雜a X}ޜuPNh!| )ka3¨rTф;b`WW;dٚk0yƸYm[G54H1k'j @{&%˻.UH RW[h?ޑ 2)$u eNSuM`U, `*" Ժ(\[Ip2`QlȈ$A7$I ]F@[nǾI۞R$&Fu%6IxE3{=$(;HM gs "[3"_l<ŁC08!5ނa&IqF6Q7/tz$ڻ E)I1KK!͖׳%+߯IA8ɀcpX8`1iCUG\- H`үwJ)s!"77".ĺT<#^F<Õn)Ϝ1z 8i/)=ЪgM$ݗAGx0#ku84#.Efǧ,<C" yC{ܝ}wÁ-ɂYr3yQ՞iy\׿^<ϠhxF3a9wCB2SP1O}$?l>>=H_u_?\LǓ\㭹8lև@ ~( k=^_q7]lN hΑL\H6%zzipXN}⇔j&a Υ{W9{.K . U|x} ߞBٱ>qp~gwOp8 ŝ6P?!,Eb=1/S=y/tc}a!x8VB&>ebܯ 0@A030 &y}c 63ȹv'pPs3׀[XYGzN:p ff T31M "='"撃K!>M"W`(uwR*(Qr$(/PPi.;F}`Exz1FRN<X.qA`es<=TV߆rr(Ɉew0mDiG`Xb׽v>Ņ̌V^;‚ ֧ \]}m4rKءma ^mAw10h8rOmiaC: Z|W)1 Hx#S1p z>PCL rv @!:)e,KHF8% cp ;ur <5, 炸mu݆>IK[ (waq3ӎ̀gL * E}w'̷}te?O׏>FAUf=by< ^;Gd&F|ٗ﫶#g 63#xʔd'sI(<Ǚ&.#ʻrp86?˹9QI>]t r[#|x ]M@Wկu1lɴY펯| cuȓyXp^+[ aXC S+3>Bx^/.<$!B81Ñf,Q=nAF%=,dQ&1z=CѝqSj2˯פpb yх) T67;]\h3:̤ >oS]xK\Rr~h:=uR7y;e4PKm(,2ۄnǛu2A:4o\f8hئHt&Z}Xc#v}k.xę;IJw U$"q8цʦts"d$9[D1Ȍ?԰^£7`wIhg`$x`E`qoi7w!Qm0Zdrl0GoWYsHxEswܠdIˇd=isq]!>GrpHΆ)y%w܀ -Vwr\՗QV{KdV "SR\ l),;NmnS$Wk,jp}"U^ ӓosL$SaњKĚuNI3 iyI,A8Iu iwiҔ^xf\B G|漘]7:m980(Ǵ6`z;uG3ۏn1&W a+ccB.\܇G0BHf` * #`eNa]*crj>yL!IYdQAaoG== ? lf0C#:"$3.Dd<;hm2xm<94і+FNzPEȘD:K1r x'I nNKNmMR^/7؋64>Kin\ ZS,,lG. 5v2w?_QuͮJf{]:"7[0FI'-+>V8r I~=*35]'?8EE|=*1s/t endstream endobj 205 0 obj << /Type /ObjStm /N 100 /First 905 /Length 3618 /Filter /FlateDecode >> stream x[[s8~&up;9;猓3L(DIe5 ɒ'Vlݍa`2c2 :|uلR1gP$Jü1B"= B@Z3ѯTILyF&b0J(T"ό@=2=}Ōb NZQ%1kz>kHƢ he0+|2'-: D1SMā94cԩ҅atZ+%ڃhP`kLc^g$x-Ya3<ֲ,cG"F%,؞~r'4:t,c@4$vigYKp%8d]# G4*  ܁%R4DA XJjIA&a&1TêKOB")jxuRJ*0@PJ ^2ЋC $&z$8qThIdOC`Ą@/XVKVzv$|3X=&UA4UL@8hbRt7Ubl9mwxV rڳ&(iTG RC:b|5&ٓeW͂kȤ!;3$zwHL %X ` WG,9foA_a0nC,˺~Y22Khd zI$FG.Sw|w; mEY:>Zsڈ 㓆T4bh h'z>Q'96?AYu Rs5c04v Wm3=+!L:~cm<0rwPaR$]le7l0ë*m>A/ < `0 h{4$o2r-mcrs+KKKKKܟܟܟ[sY[ z\%{r|%1oRikZd~{A'YsuV=cUӢf'%;k?ú̖MfR*pOb/' %n fV֗U]vYXS5/iyK=!:Ƞ?ܕ+"muE"aoTK;9YLY4zQz켨;Hjs|;h%\mI_  PVF8}lRr>)ۮXYSE+J(ĢXF֥"~ b 䲭^vb煸,[DWݥl,Jш-KqՇRtGѕЦ:]T 6uy5m1 ,[+;gQH|+cq"?AWďLo񫘴}s:BoWVմj˹X.gvӦ-BLT".ĥĿ{QXF\E+:ы ŵs#HPY)&0e/NY,%릭ޕu m:1+..GZY{6-Z0bYCӓՐ&pW0na8˾-fhߋifğ_fPf)а" 1-bblI5Dj61cCҲff9$m }AJђ>zYe֒QG86$h\5wZщxt26>l4>Yz1Ҽi^lмXӜqӑt$? ?VeWW8F76__6-lI݉"+h[.  Ҋ ظujFjZӔ`bɛ o2լPы ˱rlh\?W}i7n#NHT}jy&0aZ%^u`lQpWH\@IWn:INQ׀xJAp<%WV}&AK@fR*X (±ڢ̸)eM.{7u%! D/2?C1 b>PF5C [Z `<(ʑautڧC@ WP tVE9͇GX;~q_!Ck 1p:WH62DduځRJ)zD&]/CgZ^c>X$ \s, +c; e{wNv"WC[Xr\Yh/*h1; q(lt B P/q j4"6GiN8ˣngN)Э\vu+sϧhsHQʈzˈ ݐSyt<7{0 N*sL͙Nu_u_u_s?3gN|(<H_ {<>s {2uc,r}Hv" L~I6Zq#rM0zd\CA'@N<:X>Y s a^]wa#5GbdWH<ދ{[pجx!S'xAv2-!`d`KH)H=;tu:xP ;<C85ݥqtMK~ПW˶ 7d,},=.+Fb " [$BDU b;f-,B-/6N0ft5 Ě;ju.m*6`$ZC2k+~;ǡC&j=!eA)HroG k eXG^=($J iybּ>PMss7e"C쾌fn]ٌ?w/ѣS!ݮi4*'yO,WBBBւ{\tv28eڡ{Mo8BPq?XnbF*|.Ⱥ!FS`I(}1w`p_#4X wb\1L?sqdK}I27gCX|Xlv&;N\޾vjtm0dwr%˕#-W ?o Xf˖gMw\ĪTj'߃1F! L#ovUy:yڀB!b_&uUj ݑ)>ʎ FRTba?،fAjF~b,]@rvvx`dž$V_ \iO"]E{j!:J6Dо m+AwȔXAđ|]'.1Q8ߺ'벽̘TMՌW77U3fjqZF\\\\\\HP endstream endobj 344 0 obj << /Length 4788 /Filter /FlateDecode >> stream x\KȑWdlzơ[gcXV؎MBXD@eUDG Q峇Y>7^Xnf,ϊ`wg͌2Y!z.Uq/flf,ӻǪqqV&*2uDžfr|X05HI)-zNZr*-ʬ~E1oZ?k~wQ&3j.5ICvLʴdr}Is8ԋΓL@iY'<)@PmTe̜N2ŽeB l&؍`'mb*,}<նT0 5aJBfѪR'{"56^оK']I=›Ue Ruq%\6[F|9:c֖פ`RRH3].<0ÿ,K <P^#\g{#8/1W$/c7IWN(^"9+uHi5_ǔQϾKyzi fS 6Ҿ+-,2f( _?)ao1-!-04'#hU.*I-;oqD"~<ob]Y+o?MԏM_fzڪ{V0CXv4PA$YP7jva1;fSp(ΓS?n|z]x2o{ӦYM/P S@v" ?I>?W?{Yn_=%JWA3jFz5Zj[?;Nӳ{غ#̎L|4u{ŋ >^KTb #@0{i8L1*`ߟE@%b&STDP/2bPzXbڌ}͘-Dhz(r9ҜޝR<'Ϥt1w[jv_/)me[EP3݊" ]۝ u{wY>hFz8ټ?CEH(G\0_4 QH٬b{`tΫ I﫮Kr" ֟U]|t ,8Q6ն0$Neo?1ڇYf?^ct. es. =Pxyf@t R9婱 q$zk =l$pH a9)èuiŹI:[*b6bN*Hje`s^rL!~y1@Rpe6or7O~!-&o1_*˧+N gcɡz2jݪJ}h ^%1-6n>HP⋎T'T_T1P$T^ZHo@Aȓe` ϕO`^X*huFR:%XmV aHm"UQXtl\5=i=?Vmu ZU.9K4b au7` %BD] DOmEwFBmmk::F`y1S2SFAWX]< W| -aR.gR5)혥QOߟV? I8oIS|} TOu Cndĝ ǷU[ ,diC$=t>~׶NQH#֕%6۫3ƅB*OC"Vp^{jCHvSukDKlFH;M7LA]DMRf-_TJ+\ @N"z tszvC0I- W9D` !Hm3]_>C<f"8K 7;fxH豽?:?VʜtB2]v)̏ZIv?Z?jpT&I !{tUU-Bp27| lj7"×rH|Qq1pKv0_`LyG |}&]Ww1ƕ<^`+W ZUd*`=d%L/v;MJ0X]Jˮ^Ƕ*!=f-1nB89N{yL!v5(v*$ίʵ 'ivиU81o+"EW8upΏMIDΆ$A&5^ fa<|Euؚy;|wކw 4b"-1ewQ]\L}Cq:SH#@8{t3^jMUe͢qS hY}[]Hp[?7Z=/޲ՓkҖ"Wm}V >aj,F#)42*0#5H䚜[uVF8ތ(a;M8/Zg? ~Cf&|hoOzY%+}QMedB_4"@j5da#KKar|\ (-+B9Ǿzp9'|!01{dBUm@zҮ2lA>%~^x^cݲ@.<9x_o y.!zL#bS~D3P>FI qN[]LxE]? dW\[){D(F7M(`aAxt^ftIeh['ӖOhlWW4@BxPP6H*IVH蚡ˠRp>ʋMS_&o lkN zyST}}Xu?M_^ yhc$EۙL@:2Ts( oi)oFgUb|I 0p(P\wa73&2(ѢήZ~UF@H*JQ/1bC9tCɎ1 7Vw(sRCҗs7z3X;gWB$jW2cfC<6~]_>T>Bc# y>R龽|Pe;5 bWuݝuͶdўm<4-ؠ{Pe-Co , e# (>n<7`cοB&d[g^ͧ s# 3 ,*53׏ }fyRPhx`2k%~[I* cveٞ^ð7 uFJrbwW?,|-xF[!$Dcuh׎qm17؏e}]x7eg 1møM_Lv ξZ=_=nga"~pُz{Ei 3ڄbXXχ%f1e{0*dct솿]<{iyt\D+w">"<(\7=qRBU b_ f:+&zpw̧5BiSES[uٯo5g)poJΒ.cO$?F&?Ri,ۿ[gk9@CV#{qq$K%tB+.4'E_<4~ (Vw C g IqH䗊bJD>}ktBD'P endstream endobj 379 0 obj << /Length 3734 /Filter /FlateDecode >> stream x[s _>=$3ML2sv<2m,)vZJ}ZbX̾?/QfX:;QsILK[.g痳_fũM5==cRf?Us*I?+M84o>Z]R?ͼ?=9L?s ˁcNjA'$,av&qMI^ڬ^8dý]T墺6e{WtV.gP!\Rffr,0Xx>R06y٬jrgв&'vL3Ylݾ TN`Km)J$In9@SRȜH9XI/_ '4bJ8uju<7Fn:)Pk$51eќ)5po4ĐBp\5ԏ.5K#s j_?\cpG8ARrΏW>Jz,ޘd*-{`Tתjpilo@g'=?If`F"LY|yodv ?0#r.g-p[.f89x΅a3eHNHv`IT쫔_.{ ]{T@h*W90 `MB`*(RƞGċ.l"V.69lmAgF9\㤯W9=dz$ fw-V xUDz[ބ|/tw+ɾHN9}0vS /7(r-:-D t*:^\E $|.a?[Xq|7zNK:׊U =(x71a(LGދN(ȡ+ RשuE4U4mr"7"g8de(]wsWmu*>mj}򈝪h@&}ڻ}[ɿP ПԓPbG(~vD<Gx}Jm QC,x0s~H::B dӾO! -fȵ"*A{0~gB?~>_0->('6aO?\lgY3ϧH(ǁ~iJ}r!)^Oe6s> ?fMlJY FG8N5:L})e8/= AGMƙ.$yљWK:f^ |W6Kw+a]+,oeS:k/~T}&+:+&?ј.Ɵ^]b NI"2}e:i5:g`a Ue {fQ1B$/IDhʵb>TG%0|rNiS)i#ԻfBLn 56Paw͊& 12=-*0 X(j]4P\dWܻ `SgV;Fqe Q@ʗeTR-c 9, 31S} ߟR}U>7NttRtBGsPu;!K;*W~y"f]%}BsA.$+\cj@XW.}^yEq|yп^o.2|?/ۋ_]cRK05׳'_?V&n:֊ї.yo愧L%52!,j[o+淅i0,}MW|Mx>k껺*AcYhՎ\Y4K Ε‚!ou}W+,Xz#tVUzp`HA8fDf*7Rd2mjz p^@kM0DEΦ; CV2RfוJ,#Cb%"%&֕!cOYVg4G AH? ٗYG}?F' L倃|L@\Q;e./RP~*Or7x\ q=LćUq2oC\Ca]x} +j^vd.=H*8sN뗱=W~MTM³=_ǖt/EǏR#{lOL87`VLQȵ1{>]bO1NQ+s ́5#cWO`z&Y+Ѯ:zO)UyAZ?B|\](ǩȵaU;ב p *vfXu$RF=cj2b.yy)߀nWHu<*%?FᚘV>𘶯a C>,u9#A cHoENOj@[|ԝLHg}܁PRy%Qap.S8`8<S5 nZ["N\'Y$i~H3JD體KW^n;ҩ6A,WO Z-1>|O *wV"U*@aS%jf:ސJD # 'rQ0DFA$0 әD8-|jjmuj':~HQĜz)Qp⯞ծwu00mCsw?HY.]y(a0⾪7mG̵P|[j i0gܳbр+]6˾HEewlKtеGR>CأNtecc^}WWײ]Wmt7X7kpe_W ~ݿtQTڬ}F.Q_*e_0*kXLlO\9]5Tdeiu;`ۛlOiѿt7ڛ!B0p}ħ̴qkCSlS'JaEVl[W8Y^DmwM٩օ-v\I=D`w;{!F)<\ծ$UhU*57p'RC+ XO?M3ɒTۃ3Y[; h?j;tD~64 ~9DQD}CQj> stream x;ێƑq~a N8^`zfC2)뷪o")Jn6'W,dw;JK CZr,RP`UiԈRS`g4FKFM,([ӔX*ZTOӒ"e Z gݑxђD[R )(zvg-WLB% TR /N5)9ㅮ?jUqPWۄۻ&iw+<~`v[Kw;BlXx:en+b Kt. ,ษCW?=$JnF̔!F>͒EH2HNsK‡A"#3V|4QX6PF j%%!̉kD0txy|;,Mq%(+Ji@tK πHJpOK-pu7׮1Qǻ}-a$tIA0J'퉊b}WW@C%%h2/Ӄz/`fgOpQѲnvnysɀdQ52r{U( cyI>;twd|=-Pq?.)zjF #F#?6CGSd[5*1\nZC0 5Coz(ݦF-'<.AtIGЪnNxL8n\{_Q.g}FQ5 OZs* }@Tgw\U_ҙ4 /jW^tKԨRyDW\9F7 Z'>^\}%@)ƀ^\Ӭ2&:Dvp7\vIdAU'p*e?cxpt$@&of?cz}젾$A@mѰfzwOa4'uqXU,͵ls5)/(I|)!*Д)[ 5'F,+hoɃ [O%"74`%P67>/)\7[H>&|/1x˜'R1ufO?3IS8ᜦ3)mPqwIS:yx268'-5RC\CHH`kx#a i!چ˷4ƦT&C1%ucqby$ΈTLa:7Fs$^ؤt)PJ9M%t[0ʹm Ũ=-˕ˋ<8U*A% f>}9,n݆ō;0wɗ`B*xx슏K^r&u &hQ2 ֤//2@ ֹ.WL8H)gA9&7ieB3#>)V~o[YZ |)`tZ]cJZ_@@Ao0ՋSsNߓExjK&kg\ 3^ -fMb^~)ƻg>W\6VNmD;#݇I?~nXy%1ն%8Ÿ xHJrS.7rs O ZRIsz9yw\(=DM 3 aJd'HL.gh(lt;~1h4[ppnVNa'Ϊ\zJ{Gd |R)N~ 07.ey}U>c)Ij#ďs94Sr} l3x+0YO35Wt l8,~5jJ)ZrCBS;3m)+Pr O 9HhC!?1 Pٓ/zDfzwL%l *=ڭkFяs06 ܻIB 3RLw,52Ni0̙p LLů;g:s$gaB bpifi+GV `hYAYD.Ve5rR>m>+(pc7}Ix{ #Fu~b\SڅAW17äгF@pcC}w|lsBUbRcGfUmt.S},f7ajI.GZ'` O"S9Xm>/{~`>e.$g f }^o"J#o@[/~Ecsţ7ǐBIRnK!c  0ޅOsOum98+8wqޯWniUv"Me!@wXԹm4Q%,Ѽ_T_2xrmvUսU(ÁMl;J6OiOݿ{=:p( \qntFٴ.6F'iأc&'Ǝ^߾tmT^:x;9K7јXI!"ZlWl AE˓kU(61&朑yTP8:}jp!:8lbx-H'ٱGKyx]ZS|g ˛t endstream endobj 426 0 obj << /Length 3794 /Filter /FlateDecode >> stream xڭZݏ_G 1o2}qE>Pe-W%;3K򤓝~of|z7߳JoXWE6V\fc+6_n5ɦ6\[Udve,c~laTƝy:?E|De.+{Zs^ OņmJ1煮6uhǶ-+-߷U”etޑ}i݋&GtlGjjzbp--ʊy -*r^_ &1ht "ZM eMجvΥѡWSw8f=/v̑HW\*yAغe,vĖölDvFlv0g̝5 "ߝP B5֭4KkKMln02 L֎&5Rele]Ck@ȨiICVR^p[Kh>^zV0xa Ƞ`zPl5JEx!B߆{;[Ƴ޼{ja_y3zqJz%q~\3>%aar棘M\\(ɏqVesm* x'<ͫ&ZW f[oUɴK&ʨdlC; _>ɞ-op:λ09оWRA HII&RJG2 ͳz #冑gϝ=8bv+ cy7ȍ*S\P?!MZ X\2R QcPG7 GPyWI}E0|=sÎh <:p4@"x-WoƸ_EЏЃHC,e lq+6 =1L o/E,NM dr]7׉1RMP8 gHHʫ@22]bG/B]a>PcM`OMO!N,]A"B~=@or Xzr!31<¾sz {)qtJKdބWjцTv k&g 2D>[gVk?UȜ29<ۅ`.{5 ,!s:8~Sxn{mH ӓ9>=5$+b1eC[?wQV   !j<gE̠F\"0빯vqtцxgK6=7!08iG;䫴DG*\!Q$!Lc6e]I*7գm!1?q.P.80Os'|AF=b0jA}eh&dfМ`XҜj{%erƉxAC![u")xΤNypo ;֤! ^OI!rD8ȶH5to9@8(݄[d:$ ù]k1;0g&  tu M>܎P ^f q]6\Bt.@\ݾ}l៫ bedkĸlM`%XC\\<㱱qeiC ZB <]Vס3l0s][<ɨ^zo5 6hf[r9f%m2{jk:ף?i1ʇoOqɵr d-7!J1R>ZQ~%)qxsᙨ@V%S|c֘`_]'-(Y4aS8"5ŋx{g]S~Ac"(/?/+”.6{>\J3WgȨxcUopHTfXqme؀A?@c^ RPKB/Kফ8Chpry(#{d@(&|IM*Y-дq?̆!`ÇngiɴW|FSO\/ _CU: 4$t vT@fxxo'(:ni Gwl:T+W?ǫDI8RN58 8Vк}!T܌?4G!ƅXBQm@LtX#(U̟嫯Aq%Us  )XRz<vL L.{ 1N 큪`n?/.;CIJUvr>^C 626ˠ`K\Al ̅$FB^<x `f!d:l{sc)U*H2RMѩ9{vumAu;s T<XFt,-%*I?B}FJ`v*!`* ӹ}\%%Fa 1$+_ RJT¥4S:` ;qm:35Dν.B]{z_8V3s֗8Y_pؒAwV4i<݅ ud_a0KC8FlC27F~ ?%).T L''U .FI0 ɋA0ɎoؤxDIJR~Nx3D7==zInf|e>K͜mPw@ˀT\4 a%ᰭʚؐ;ewC @jKmT_T[]jQ\0ٻ|3ʼ,ttPEKiHNGEjo#wJVY3*gwQ폐sה8Ȕeo9u0}m mz l>@I=h]Ǡh#߽_ endstream endobj 446 0 obj << /Length 4047 /Filter /FlateDecode >> stream xڵZ[6r~_Gbaq-?ةlʞn>p$ }$Q&3ƅ(JwkF$4ЍFݠ]gԬ%Zz|^le!VncoݬNR$q_؍8#ׇER.֬5SE )OHFqDွh`#F`8?PmW[7TũmkU ׺}CGJֿO?ۡ ]޿UknXq^lz߫zڇơ .|9TkS @Ѧ\c3EU@N\)aɢВ(g^ZikuXOq?G;J:-N7 >< 9-44uYR~fD63o)k{&j ;;S7m%E!bi P7Ƌ|feQꠄBE^ 3(cr)e&F| 6j"@!QlϚI* ~{ Wנ?Tq q{ϑkzpEeweL9JMnͿ[ ta;-L)d>Gww?nS6}EBfS횾: &𹃳@o>mwg6θak,%VB-A DK"YN,GOP:Y&j\ZUA,O )MTԠIr/۾ށߕE?6BDj^R7H=soW?)ꮋߪkYCe"OU8zjΧC}ԏaS V O6=k.P$P:_ ^V]uYt-Uq#HIْgF-ֹj}/$н;;  #KQ4 C<9/KS^+ОC>_g̎7n/zؓpc<.g:AvCMŇ޷O6Sʖ?Pisf9.,AڀuMq*}{'E{Ǩǧ&oB3YQJa&I[/}J1~]3mPN4qFC;U&tK% j"R& RJ;-ZM1?>9G_ƓTվy6`I7:WH uܻǠ0:)p8Kk{/gw&-&@Ya3=3·C-*!9097:9}³AmPyhC1Pէ48ebr -TUMOUͨ,$]ڧXcl|8(seKLsu=iB,)B> gcfld^ OMW Һ{Y*D(߅M$[{tD#1IElJ8?4l_@]-нGv:V/lt-=h&s-P5G9U1ė\]z[wH_0s:Hk$̅7xCWkm훢#,DZq>qar :+{/VZLٻPڹA\@c*Lo%>^`ڲLse\`,nnjKbywQMy-ocx!sMlOη__\dtY٩ +}ӓdDF{ʯ^d,ex̳q!9$i "t>`U޿ U3`&4LYD0OLN]>8vͱ?}E7`ruazGSFJFJi'uGc%pr6=Zq1ʧm Wκ%d\XSwx-E<$̨|X <.vI^Z%w"O9*[ Ck1Hq*#e:^y-3 NUK8V(ExUk1{͟SJGcpb,DRKRTW4"SrB-O%ŎgT;LB6 @LTNnR՞y7 ϋ+5R&ݾYdof QvR]I[c/*]pM?rr RTzsB;23l(I*\O̦TDk`%@}8u5c/X\7l 5vc/s;EVeVNsr!^V.faJw@cX_Pʷ\9M);^#Ŀ`wA+UTi'Һ흺TP ~B@|tG*3x|a)oo?vЈ՛zXAqß| =} EJ}[6( 4&ŧ˻3 Gr>P &Z-| ۯ!theY%bI}^P9g]yJ(MTYC\Uu9`z` <`uR `?VbC Dv9aJjΙ4hof -lêJlBuC{pZ'싹#v6g X|sU=K5a@E(]Y8Cg㈏=50-^aC{h?) ] BP#~܌<{ .@e[1B !Ab :3,< ~0!e,Z,ʗ&W}1X4P ȘE~ܹNUp1/`_JÖTĂĀA8PiN?o  @A'$ҢH:60ҰK(Uᤌ7Q^6ށ_Jt+bhKz'.7 JjabtaLƭ>-PZ6k.Z@dF/teuԅ7W-Ўuh!H~%.UFXQYRwoM + H-w"G6Cӳ u;\גN%ix2. ׸(@k8%>sbUb;lŸqb\ ;O}Nw1^)sjln]xi<l_geWw[fLMp5u N-12%D0b TQ%SPts<m+>6? S8=2~C5-vIʽѳFbq͘d' B3<:K+aX|\ ڎW&2q'ŘS|(I@8k`vctwfitl6hP]sjx !_xWP)^[U]Vo{}*noU%a{.2ܱjiSwvZ|ܿy52My@"#ucXWcqwHzp>"k|LwC}.A]PMfncے4@!$70_\0hRnWĒo4Ms˨05_n1{W.%rU6*yHM' !b endstream endobj 315 0 obj << /Type /ObjStm /N 100 /First 907 /Length 2772 /Filter /FlateDecode >> stream x[]o[7}ׯ(~ 9.$nȃꨍ6ԕ-ǖ@ޫKΜNBƙ1&h@8EMVL.Lm658W{}.r/} `"/1QRKp&q^1*8Y I~d  pB&4^1>&&obWY(sD*ncZtHCDNEՈ'YHhbͱ20cQIx>DPRRpѾݠ&NBJą^_b0TMV,V Yqyr1VF=-3PoTr& UuXG ighppJd\Ӂ8  +) ()@xq P ٛR#GS _QԘ)Uk3Cr#5U`k?6B;hzJ(ZhwI7BqD"qPFrBZIkSf?i$ ?A0*+>DO6ClFOoԌh/vlq4~X.vد_/pq3ϐP% UYQM<}joۅ49Iߘoa` ٌ!jVڊ*nNmjy? ʿTC(:ݫ×`K3Ά8-N AK$+\:nHF۬0`Bv7d=[-ڀ@jy x\ Cx Ms]O H]hSCz㽝\bv:.U.;ͱnH;\_H}D/x͝Ÿh~GS_6/rqf yS3~;cmlt4~zwf W/yӫDj< ճS@}<+ HZ\o}oCoM[؟>>o>o_brM]<$ ΐB\O⬦ ]|$c{#p; 1"PW dr:->rv xQC ^oI` JjTXTlS@{\ݏoO&' J> Ho [eֱmb|"pt]k_@: . ̰1QЈ&KG wrP/=Zt;OgV8hKN DM\ӀF hwur<<%CcV/X`r[x*GS6Q' bk1ZgL6;IDɠHKG@Z0YB۔$~}zRKR*,هr-ʩX&r@yano J0K!^ݶ M-vFmH egF%Y /Q2%3ܞvM&a*"Gӛ0 m$ߔZIOQoJ\M`r7fv>iMh*uMS'NrO:=usVU-T'r,8m⒪ O'HT]w:0%/*TF`~ &y ]ws ׬ŗN 99ygut‡8eľ{;GH̸Kwty8E09CΖvH\ ;:.'WdD;/KvW! x  )A-Y`l-bbmaFOd.VkC{ّ!Ӗ0<ÜqX5Z6G&.4020f=pZr08׏a%K":dboXH% 1 H/w_Vɯ+o6C:.EZxQVn%LeOJWFWBJ~:ZE`vc޴t{*Kv; ’+\SqKyC٦ޖn%66Vz-`2S!i3]>7 ~-* wݳ=W&ƧL/HCi|M 䱴w:;OןJ?^*T׉JDBcDWE f85+3H~Y=jZO+. endstream endobj 476 0 obj << /Length 3873 /Filter /FlateDecode >> stream xڵk4|# uU,G-SU|pķ=k;,ïndX[ݭ~I|wKم,X?,D"1 ˔Y?-_YWɲkZ6/W盢a%rG3_Je7ۚ_|5p#Jpx B0 B,RHdf#>5&ߔ{F*zy(Y3ں"ŸHƨ-&.RDH>_>:j7ˬ)rS~h a-j- fVԛh~YSUK?<0. YgKl|E+W,(-r-h,MлY(Sf$E!А@JoT1,v5*(9Ztf 1G}!c6nc<K?Օj]q\:#M]K~͔&F&IL,^TOl`#I,<M[W=a6" SӨ~OLF)2zU2,EqeeHG6)hmGY*a˂fBiEXsG |E'F,]~ ́gEtꊶQ`%P*ġs7aװ07rb׾8<=\˒櫔0y8DAd(jxʙh콤8T[Hw Sy?ߕ@{UPL0+G M+9{E S4ҩs!Ϣ) T+&u\Rn1F|l):ZYTDgb @4logf3F5ț{{+JVhqJ粲d6IcB˅ ,K87@*Bp#@4ɔeZ5j³g-5,c}} ~"*͙537%Lӹ STS0NM7]}! o@CCKUaji{Q ~ӥ09s wFeuHUqrWX^X (oi A h;*@;tn1~!p>M'TLMbvs(7\҃oQ`)F𥾌+~͏I|sNI 9ZGi`^z0|&]usPlQBBzd< xzbg26:0un mUj(z sDk' Yҷ2IQs6_Pp }BBQ3̚wPC7;m~<[1QAmv JuL{ꚗ5r64rZDpХG[*^x85~),jʢ,}qcH4F1lw?;9@$wv٣\r4TJihڌ#S UFDZ ofFXb{Kh;}vmsSXw"Fy5O ^ZU֥n^攬ZBHalo!CP_%zTm}M} TY9 + \*}F\ k8JUp[pՊRlT[ m"(-A)32.=> ppܭ1gz~*FŸB#H3+eHv扥ů.W6P Uؔb[o_VfȣN"߆6΅B?,L,j"gښDVyy~)w!Uԁ|zLS9Ffu.l|M1O1q$h&OLۀC+B>[ɤgL?I%EIGITM-hjGPj`_׻uF}%5G/}QM%BSG:Z~N 2ihS}? KvG )Q~]/;)+G5dz_Sɶ^7DtⳄ}M:JiNEqY HHWǸEu+6=HJ P`>m[HP' _|Ms_2e(RL}5K@&L~_~ v Ʋ~[gRz )Ε lpZ<gui1Fx߼d2dȶT5|t0aRP{afr)xz'sT5@"LE6$)J0IEU^?/Qg7!A6m>] Ea$k;r+bƭ|>se|it>)B4u_acxSJ@r0%6;Me-< 5|W/{df2"ɧqXq8$ǜ@b.Ѿ>C+_B֊ =FvpH1Пj_m+"pSR}<ڐHB玽ԓp)fq? rpG~{}IX0d1>)R7yt ڱzzxGZZf ܕY7Y<|H'Bkzy%LPC.{ c1?ID}݄Iv%&h`-6f5vj/u䲢ngV|qS=[soFD)_(C%nWRٔiLuv͜_?$+6G䏧2ʝjJDhyׯ'4{˅~=)z2Ry,7DMArnqS4pf?Oo`Lun/?2`  )nszȨ7rY=X]sĞ^Mכ7o{Wr}s^OqeKFbcOC/nk6/)ӛ8$I#SfeEF/++jp(((hP%vZ,+"\,r7su:j8!36_qH,M Z~JV0_c * 8>G0q&$SŖd G~.SeHODuŮo#2759txa g$}J=}S=y1AU4FO7D-+v;4^>(kAM|Cx^>"~q_' endstream endobj 502 0 obj << /Length 3469 /Filter /FlateDecode >> stream xڥZK6ϯQ"ER4$, il=m[r$y[*Jnwv@X$XNWUzW^JLK\r\YoW'R}OV0YhK Q{aJ %0ũJQ< umeRm>V4 OR5'Rh ^r1 )(ˌ(%2-XߩH~iSխMRi!5?U_߹/fX+VJ'IR뇞Y)EFA&^i*TomacM8-%Y<,BǓ}u\NܝJ"gyʒ?aVn޾Z/XL\w 5CΓϺ!6@㧪a.:;?vDiLT`}Z/TZKI@,NCۭ;?Q߬yS;H?o5,6Y+|6`EyŪs>[3E~*2KE|Ús usӇDžB_hAz[ciJE|s:EfZ%?[*;uuA!whٟz4#uփ;1<ݨe޹ 4o/B*]RzYx:^8IT*HDy"TLEN? *t,ur}9|Ζv]{>w/M^c}{li'k( $Y '|S9p|dCdM붩fR}\Cȴj k֩P4=iO]os^!ywd_Fؿ@+m9aJ`ú `us_v׳uTZ zG綧tVFd0pC=5 o+L5klܗ4CB$zHpvJf28%_QH]&5VCOul xɪ8Z)gǓBES. iϻ=(FjO4md4h/i WH,xߑmm *HZ;;*~^/.]"+A،͸_#O V] :"J{XPuCU7<f[ k]1R]HhcBׁÃFڻ \"cLŪ&|{߸oώ>x>!pwCAqgNX@f[{HXi|o=^(IG07ܶ̒7ԵupV oO?d#;VSR3|$2 !Ex% 3?Mj-yH21\lG~ĐCR7#uӣG9%>!!2SB$iz#9"8I1 {!vΛ1j9Yhrn'{B "QD %!d邎-5˙>7FLXnv6~DPQ$?{CݷucoSg̩ī ~~Ct[ߣ jpA`%o>{>/^fs(a1KI Dovr [cC^{ 1$@OCq:i_< \Dt ξ=Y_g2 ^؄RFrʀ zgy)r@ U T BFhZ_A‘/DSvXEt9%QU9HK ~xQAs OFZ mhanf˿Uݘ|h;ˈpԚc2*=Ol8 Ga\ܯd!8FC<N݄aR!/JF=#/"ȍR`<; J*tD8|F[, . EL58K440b嗨[r?- 4kpP~Pz/<_Ƌ_TQz ^cG%V,)ŤS^!/6N`zxgHqD6g$Xr"ɦd>zbsGΕ@Be4 ;,smcDH{s'D<̹5\R A3waZ 2Y( ({g7O Fh~z'`"&wEݖ^-*55 9 MVG5I蹌lƉZXg*,Gl" ϘR fCWe]@ʘo\u>kz :6fyi GTeNfMW]~|oi0G:rc$E Q|ٚ)"lc4$!-r-l6^[Hpibz!SvbsxvOwQ%|t>mXx_ rEI'˅}JHor.;ǹܖKK}=E ʥ|"/mSDY*(NfScXõX%8ѿ̂ 88qḢ[!p]ኰ_,=\U{sL$ uj)jCT_{¯^AO 6ݿ/5 8 endstream endobj 517 0 obj << /Length 2374 /Filter /FlateDecode >> stream xڵYm۸ȗ5oȠ)k/mCXhAkkc5l~}rHYRHLC gŇ_۫-g[_XE̪tqY+2I̓+ɻj)Oz"?ÇHrHh5 bq O)e {YDꨮx!x{%0 0bβ\,߯\B:b&W_<:pjp2o,6DjI7*ՇSSrDPo`q vۖjtA0f~j2e#USPZDL'%3,nWniGHe=@rnpd/}p$Q,$ 6@.)"3) Kiܷ4|V- $uG3ǦlF.74Ձ(eՁuw> .$Ԧ\@bhI3filnz^}tF?S!47,r$ru,:h+Ғ{}!NW'-=M>x{h;>s]rFcxcɻ\UZ~:~))۶>⾄lG:AO0Z@@{}#IRƄSxIKZciX"Yl"lG&-8K 0ψ{)\$ӘYq& ~ϥ@!iS҉V$jP# X6Mi),b*rdžf́LjM܊Iý1qܼp1 "nK+=IḢ 'MS7-2NP&;nJ訅:o(W4%޽ȝ ٔܤoRnͤg1TDžbG/ݣ9&`z<{Œ)+t2 vpYfƫ}vZ fyN,luT4=ą "!MF7:Qd2Uɾޔi)4:a +:͹+j!Ux|)vmaSs~ >[F3Tn6x̦. 3WR?Թb)Lb\R]--گK+}RMGCRO9bʘjUl]V1uQE-a<cH3U~?.(ݣ<:{u.dıt[`T^ovK_9@e1xzF](TB[ = LO#+/ŶL]uנmw\^7ZvDr}¦1C##E *=.tT=aVwˌ'Y̾޸7JC^ 2*E`Ƶ _^Ҍ Ɖ95x>^ 's;5J {CyVN37OT$J!/jբmro{rsH;G~0C4pic endstream endobj 496 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./UCML.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 522 0 R /BBox [0 0 444 152] /Group 519 0 R /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >>/Font << /f-0-0 523 0 R/f-1-0 524 0 R/f-2-0 525 0 R>> >> /Length 843 /Filter /FlateDecode >> stream x͖o0WcJjyM@LD t@@gC!N<8ϗ}γ~o|%4qJK"hL8%ÒS2V㴥*[嬗‰JẺ*q2%'iKU8)Y/ՅS+g4srk܄%''*-U*gT'N.*N\V899TgT'V=sּYfݙcnxGPZ!6:33a&u&:P9gJ2ڦ8mSM4R׆d#0F4Rd*SQF)KWoH&oTC):G N=ΊtF0 7".:!='脡d gp5dp?mxvcj:ΧpAמYN3w9aM-v:Pli:6 [dq,aM|M7E_ endstream endobj 527 0 obj << /Length 533 0 R /Filter /FlateDecode >> stream x]n E|,E$*YHU`\ }yDܡy0:}V@i#=vaYR7 (b(52eI5ON@y^_ױ͹\c Qq/ܽfq~!49˗:.s3#髊A#hZW:vVU۲MT\RzΉےL.oަӚ}tw$}κ} endstream endobj 529 0 obj << /Length 535 0 R /Filter /FlateDecode >> stream x]j0EYGHJlijY_LH eF}iBg f2߼B2(@jEq0w۲Z3Gu g\VY>E{~};s?8]!4woyp?>*69Hjָ^:Ii"]e0P$)&pƜkG\tE\q\\%' q/|"XI=boDi"\K$%뒿>/)[*> u>ϟ&?Z|7;r jd endstream endobj 531 0 obj << /Length 537 0 R /Filter /FlateDecode >> stream x]n >a#tcl/>°%H=eMz|_ٕaV=X,-(`#\˄dڪu1ߖΙ9ke ;v:u;ƴi,HI?(Bp޲Ƙ68F}!yYe Og䂸B.S|E\ ׉%G~L\y V#?"+c5q r 1N1#2WXSXSL_2+K?W_&F%ޏ 2QF7-sﵺۜX/v:A?{J/ʩn endstream endobj 532 0 obj << /Length 538 0 R /Filter /FlateDecode /Length1 11276 >> stream x9kxE{$3dd2@,p#3H$"A0D^tJNdE]EVY'{g&${_SuSU9u*f~.й o_#?8*4/^w o/_wKMo>K}޹!m$8 ^b͝Cvsƶ|F8W4lXgߋ,W75o# `(Sր/j+NJ.bU_,D^-&}Y:j)!.}Ũ~ߑ|z&c姍LSҚ>j͘nfSӺ֭}EC6jI* $)$EKNXDy6Y1mbjEDԺsxnBG5J+$M4ŖD@$a9Q +Ql6,je$sݮ#߾`"'89 ~BhЕе>*EsIؐzCPVVZF+-qYNII$3=H(wFZU хnj),p@Zpߟ~7[0n߶UM3۾_A=]v0*GJ3(L.+IvY/gBW} 6j}/ V4֕q+cfI0t2KgY3KbK¬Na׌YW3&n➖μ*S_Nt-O&U!ݍX_A^oKJsl:/%6*Fh0r[3ftd0nz=@V0848QHq\c0+7?9]tZ͜c|磝SVLBw_>j;Вލy3.?E^R LJQcܕdgβ؊Ia鬧ǣyx٘rz "\6-ɚ4I4It(cѽnIaf0;--YD-M339LoaY,<̗,<=sz=DA"9l_t8y(n}늁)||y8ex4,к Y6- R\-,BzTYV(!p hAAfgaAԯBGa*.xJuEA};6?O ϐ̝NiyPUԂ{o[QQ{1iqpkc5&2%{.6J+jꔢ vbg10q^*AE+hef%fV1}sE+T_` eJ|ފ #n))Rnazt|juY~L vN%8R .8޹ &-pMG/^nND.F=ъ֞ddN@ ~1ȶ|Bn#ă(q1z*2XH9‰YD̦&B5565H|bH$6hf`X#⨌sS*=1S)b'4ه"3 1;>Bn-`x Un2Oęyx}|`H0|Y ӌ4K;f0`z3I]abKgg'3gKxdP]a4T<9x441,Mg8Esu0X+Fc495S%U;]UyyYR5˳°´HZ\Z乃&Pcɺk24[n//:K 82RADjS3218r:/>苒!u٭$e .|Nd0Kfh$ITHI] &S3xc!I?FXK?X(8q{F^G=ï _ _#T=c]aUż:40۴ē01 c6='|tOm}=j`{Ǧ4 q{߇WO>Ilo^~@ɱӰ )I424;zBߗHy+{( H_9'ȣ1|W}?|x$z)S ;4tӐ?A꾥Eg5 Gp#K98/tA' nG ތ0 _BҴNȇ?iQ;yO17qocM+a;A[ <? p4VvkOϡ{. B|OkC{F`p6AɟjD[}ԁptQT%B=,}p&0Oq'Q5KSxO<$\Ս}ehP[8K7tj(0(s`j43w ?I+} 6 tOZ:q3w,E{?@B3ܓw- =Ggb/I C>t>}~%؈_}3,|Ed,In"K=d3&gEZNk[l!b_]K}J+Q˺ 1+?Cw=N /I'r|D>%_(.c* Yjz },~ù,.čJ00!Ο5saaYË˂U7joKߞNCHE|P7 #MhtK&22 }̖?uG+\Bmԫ|M'L*-'rΥrdkp=ʽ}ƛy?ϯ??13nO,1q8SwGsΓp^IZȧ7a7b҃d tlÝx:L|m OTRMf2:*6?U)zmow V^N/s#:˝o&nKf``?(<ϭ"aZ`θ xyB ) _spuB11^\[dv@!>_nMRkt)ߊ{k'Pu%$pxsKfj>M/f%abH-= x?0ÜvWQTx0rnbc1؛)(,6$:7 jbM #0lN8H6ݍWL\9 $mmEk1p Z?l(Ӷiv/,q)\7Mm$<Ԟ| K0E4!J,m ԷbʯP&X;\)J.*,52yÆsY~ٗ9ěqRSɞdZ&(xȫ Lj`S`@#TI˨r.&TPTbJ$R('Wdte@3^jO]:nCrgIJt֪JbT4GAق1hn# DGj\ RUjZir9U3*3t C'"{ΕV"Ganm}RP. v 4tn0a'~AcN \9 n]ҫe fc9^ovSgcbbbb&yڙSaV]\.TKB_;!x=@9!NQ8gGv` Quէus((7S^'7ơI?!釰0cYK<Ne#@ ?a)Y$%(}Kv.bwQۋK t$G|9qĝG(}QA4F1. &@!՞3 ^w!߁593aBB3;]T2,%Bx @0ҳ8MiN[pOW ^N_װ}=G#·e>Bt;zf/9qcp sçz x2Y#İ/R%g/6Yܱ1V؆+wmD#Ɗe"8w>bNA (}졾N@+݁Vt7<\>%4<9J"IduAۃy$:{7J=IHyw)ǃQQY=wJ݈}:;wWg47`Kfx><++If}F 2G%O#։1b'E8DSNdL2Zf(y#51%(!,u\#UIڽف(1HTg5TLTdž6K-U⌛FJ౮.J4Fڔ.]@c V۴=2OsdR r(XDՆX#G3)Jb<3qdG`"֬mY _ >HZ> stream xݼy|[?R7rJʳVi '-]]~M6Y"r}U()N vD΍,^|_[ז\0n#DJKEp~57,s*^JI" zV#Ov9s9v4jM+tS;۪Y*J:KU[fWE}1*FՖ^Шj% a+Ց0&kqPC0>*<>4>|6JP E#bOϪ+>,tM; VTBU-&Q]7d/J:*sJm:%p0"P#UuVh*£He UM+O|@5hW)">?"]w]ꥶ*.( 'TWۂ逖'yμ<^"(WWM0&Dد;TYfa{UMӧ;.7L9>oUDuu~XSw䯍/*_Hh=(J\ |Iyj8uJW} ϪwJhnkU{Dm^;7/߭Bn= C1SI! +.kLr.յۥH66TnL6Id'^"/ŕ+nD+IOީ[ez;UTiefkswpB'*&֞/ˁ\TըTjEʣJtM0MMzj*0T, To;V^I+ST+41 Tx_-p.;TQEdRQJE*VʕyXUj6h0J(ɫ2X]~̛ːw=qPjYPR\̔ soYiҕ&SҤm-qFՉuqZkKpfn v\q$,wanZsQhJ(JBy0; &URUQ+[mqZVh~b_?a#8GzW5" EqUZ=֐8rdNVGGyn]+j5p]ꄖۉ 9"!Y ].rnpP10ĔJDDJ'8DgufefY@U,;B@1xl+˴b@oyz|8"߰>0'y͏kI p#1iDǟh#Q[4MM$NtH֖-eGyQ,є8as^iwePů+ɗEPt4~L>U:kEw^G_Pqe.zrnIek,Gup7H@vŨ,Ŭd6.9WvZfKs iIt2lٮL_Jt=_Fr\"erD.WbJRT+q+JceH<KT&ՉxƜ0&L9챜#sv;MYlX-QK25\Z*s+nBgNB#i0@U_TCTjJ~o*QUT+L sH=ișk2`֍Xm&f&<8:yI [#%/KHMNڢUWbBojoaDJJ$1kd%z׫QEi,'L Pt zNVIpjhv>:Hw}050KLL 0=L|D&y' qEq$r0qxJob~HXYg2cB.׸Z-3V5KW`n@akz*cxHmm/ HUpCijMXUpb%*G ٍ&> O=BäDNj GvَD zaBZǍKN#,\^O7녺rڊu "0 tlPQ ,լfݸliNycZkH ޴._m2V>ĸl} K}Sr7! ec̨MFL{b=fW]}SpsŲ7y$gW=Xj ۾ 65l 2ux êS|Luי1A:I aՃuab9Y'',J, ف <<ZرoI'#ɻi0qcnhs_. T煳!Qsr XL(mRY(ζ`> v-b`G@C|cbشtFx}=C60z3~.9+(,b YX^Cιqy@.ўz7QFn\q`WrָBxNlܢޜ?8ھ9y,dNP0=Gu!CГǸ| ZaBw}: gɤ{ڜb?&cfǧ?e?uɈUQQq< T(j?{HCNo pHvB|u:r$NG:l m9R`A4'ThQ`E*#K$W :c7Ž^?#D?{.OȥXAAH?!L%tCfu` ;8i?VĶ^q! ΥII/y|Ȭ;aN/YA;b@a€ |,P9P:= c2 L=ցt875-/@9,yϱ ֟JA1|= T䜾cҟt٘z]^UNHT)k,L!Ք깍}~03Fp-%-sJ=}yv廼ozaO)N-7+Vlo\10UͰm <ڑsfײs@$^&5(l>GsҌOgZ,1vړ޷˱:ٮe_eLHIƆI!TvS |ѲoLee&}&rMaa3yN^,?\T}7#CΔSp:795v0=|?l g"Gga4DK- ׄyp* ۚ0fuhiD+PuAĪ5'Q-F&txMyf9Ijc">ImjOliGi9 @'[+:>.l;mfItva@{pXZ؟ )̗/j6MX:弁 NVWj8YA'+doG]Es}WUZ9j0&r,YeyITLȿqI3,sUHޔFCRJof'5 ; 50?]:̵:!+͉U +i,:^R eb?#~T I3D:2u c᪠21,H$k//*#Amy=|V #1 vk1zFk"n E=Ch\(;ESj.Ba.gu*+NA>|}3~OKGuyrX;ъ:G,4267n~/rcŝSg>&oԈ*ț_=' 1gC;?Ss ]W?׼zcGO-\+ >b|8ُZ˅%Ŧ ,+시:G4Yll y^8 a<7 Ѱ)^g@0|djV~(:mhAO.&XXqL#[oIޔp oվGvp3k>M>fᬁKy3?{gI'y. }j;_-WǪj.`}Fƴ/{vq`_mV@r=qp"rJ^g;4خ;嬪a)QMى0P+Cl@A2T1KkV D6_ ~0C*sp346B cC.݋Hz'WuZewrGU̕++a]WmP MQ2Y<1Y[j\{xs|ά]lթ5G6~-RzUwܕJ:)\O/`2~V2@8 cacYV|T >K!=>BOt7?fhؔc kR9,vYtZQe,O2 #G sr5qf{#17q~*2 +^DzWr&ӧ _f9E}FJ2%5p ~%VC6~ÜE[yan5ˏ?'dJk}%co<6&v_3/=˗u_//)P{3;V>lLD!-㣢Or|4Ơ0ضԾ8wIWf]ڧ*["ǝm&Z];iΖR> ɕa˧@8L;Ts tӹ H>|hsaJr8kfUga1o"vu!& K2΄!#ClV2K/66Czjp}d/>*.&ys]3S<8#vvwرC7>M>s4zCd??\#57~>lצyL{UST veĿfCf:Y-Mv6ߐcp}ͦ-ݪK'@(=5nfGS_0qm{=w?j"XqF8ɕɭuɅx>C.YB FU)hgt~?1:)QeXPM]>hh Vj)ET]U첤$\ET9W)UBհpj*T->USAuQ=gX$@lCm7Y(dgq@zԢK>0Dkb7uǷXk֋U~gv{U$\)˶NlK% N8bPp2t䎎m*6kB<ĶN:c}swƒ >tXRN{əTI \?y .Sw$=_U-N߽Eʼnu$lKp2GslmGI! 5C!AׄS6,>ngOsh{l9B ៹rP+ ԂOַwB'_3%Ic-iS-2(S2_X`b.2톧{e+P$EEM\u̐oߪ-Bw |gJ߿_?\t[_"/?p]W9c%*lM![j_p%YN/*]1*zY%ŗO~֛>,jjvNqh(GzTN>uZ[-k-:KZyB#VI\ǠkV{az`[EHlJt26-iB-,;<JTt갧UF2Vˈ*f|gD1'ͳo"f͉znf}n޷ݗVwV墼e}mk&grǓЈDY^tBWxǫ~{3,6d´*޻a ͽ{f YKRt]@/ۄW?a9&O S)j:!L~N-Gz-߫F__kyH"'O=:=9;BؿlJ?zEĀdc$b=|Px>朤F2ky~((+g EgO{:]橷ǀ$7;0VHHM H p6/W+OL"yݍ++!4!Mi>v!˜Rj*In$SO0QɅj}CjR{!GNnK=z,@V ?4פ6,ri y4ZL:΃x3}L.hsgİJRJS< iAfwXbW+qc@O#!d }cFo3|^$_85gi@ <%ZjƄұޔ>*HJڛ4W&Щ&H0f Hn_ǐ!-FFг:w1ӟ$): Cwcߥ_W+=>WX"\%<*(,Yb>OlcL׉~/S\chšIŚ4k~٫Jۮ=K{ΦE1c9vjhG1`͊B#v~N^tR~3~בУB c:FDa1$[zr | Le$~_F}Ў.̴wo» d)=7VR(%Ar  ãU5T{-ׯk&Iva3-tVR.zyJLrn6|gq1l#+;VFLɹD.J y"8ml&~Bae.4N&i}pݮ{P -n'6M@G~zkꜱs`Ӯ"5%sQ{ٳf1}9ve|5zXy[pJ %5gDY< NIKHrzNjɧTQrJꉒTHC\n ]AyΛэ9yaMG PCns-kOnKNYl}[_+ۚej ,6EVSY%[idB^[Vѫ'ږt[Ybmd׌@'Z- 'I9i"IZzF^^l\˰D-8;).a"L"I },gxN38sz_4#& VəӶ>IKtYi3um2c;mit~퉼L(- /\H' H9 O%yѰQ)THS _VNf89Y-d}uϼ^D5aayכNHJCdv(iА2'"'-}! t葻2XapC A^gFsCɼJ ׾ì)[96R(iaghmc=q!H }PrpdC/A< N͌_dgҞҚHW;A bJS'E˃A! 5 zS>fU}!eC0Urr>A_Dd)Ay Se)~ƕt8cC~r-=eH [[UzӬy%BfwokZ2Q*T"2ic0$x*!PϹ|64}vUt"o?#oe nޘe =;Cge mІ ehaC75`&?~1>5e` 0M 0 ?bGyar8-e` -2&Usa AP>ԺC 2 P]rEλP}[ر41 Оŗ08~Awh_ A C>m6om6joۼ1Q7$.ja֦Jͷ@ZB-\/1H;HT3rH3J4㕛Vl#olR: qFrN2V ՀOC+1fbĊy"ĊpjVA$C9n.P TTU(9d/^ה%}O򇦴gM61OXy G!~Z !_;m1 rdh1TfCc<1/B碇i z܀п(Y! 0Ku"̀ՀUJ@`zxF_ d@͠6 M_x#2丝z5+Ů]]{tewe?Oȵ(6k{mfw\|mvӵufO6[AX (c 878>e}a(ѡ@#PP|džq aO ԟ f, Ԁ, T4Z@_5TX}ß `iC<+˿:/I #tʜcq0ݮV7JO)o*o 77zn `2 : ._~$Ft5<, Avp 94aڬf:-s!v<6+8LM3%fO#f7G.vMKgMKΚ1{XhLN$3ytgkO2̃Ô \ gƒg(ߓ6OLF%]to{=%abI7R3֞\p%muSZe)u2xw]OmzԳiI6&LD:M5mVw2ŋe0ks u0-BG rPA7r$ʑ YbF ymmn ˴2rz-̖L1]&pJZe9(S_)2س?fd&:i I -%7YJ/$:d p ӑ`uo'װ֭dMkŭC3ՙm=:&Vqv[Kչ[WNk%㵒T;9LHsO˹iM2A=Ni`2WI׵;dEz`s2M&gYvMr];)>ɒl 67Ks7%x%孧q\KO4&g.8Bv.%]Ed5m "Ax-_r)J\J[4eF? endstream endobj 536 0 obj << /Length 540 0 R /Filter /FlateDecode /Length1 17600 >> stream x{y|SU9nYo]rI۴)P-]+RVR@ Q\J,CmfpG8cGQU|Ϲ >9sXfg:# gD-3a12V(ZabM7èp֑g40#dBY8KV4%.݉ӕ+K1}mFjW a v $xb7}jH 5QL*AXX ,C^awp:7KolUFaݻWww|_u K}/[e_@(exȊ8 h:e0ӗTČ1aǵ@h7(FNlC4,#cӳn?' )N=HUZoپM6g@IyYR $'cnsPAAPa;KŦ9 tQ<GD,ȁp{w#d\RfX;s1>J'ƵgokYxEG۲kz:~>xme]Frۓ 6NՏǽsC%fWaX5Aq_{T;Z4!)WjV '{,ofs j‡ "Ciy^`#9cytAh:PK7(nHSj Dv~6tI۝ ;Ukn~<'L #US5BI yvxV>|;(n}4| xSSHkH'Zu\7p$[&ѹDbTWฃ?XwƲ2aCǛgIyØY͖4JI `jځڀFTj'D,Wa5 aI~9vT0FR"Vs26_^7Iy%KJ'ßжqv2rגּMw wnz^xЇta<e8 dG=w,•ItbN(alSQkG*oY3&ƚ;sgP}UJ[̥^Ƚ˜c0Qڄ4~KXE]zݓYْٖٙeJ xi^SDcJKEz_U.].zqڧ7^z|ʚk&usޏo[l ueE- <vedpve2&Y,rջ ,p- u{?5z7l*r?Ͽ돆?HfvHs![ g+\x2KfL*A^QL63t᥁^{AfgA[@9 uSТJbe h\Cģߥ'%:*F{Xƪac\8dlRpbc`fYM,p C6N@TL:I/gg&͡hRO]н Jjwxa4 ; 0cI;.۬,nM>vIωfOݯ\޸a:fԗMוJ:bog4lȑ3ԍm)q+, gz~r SrwrX4ic,ME6 Mzl'J?YOR\\p%bMdE:. mYgo9na- @X>N eɋ .N7&%z@q+J*5DeSf5hKF7r/}x3q5նDSj˾QTƵk ($3zoׇ& kIYLQ4%3oW^ayy}4x`5BѼO<ŝ|Z ^VpgU_Ta @Po2Ō1xɝ̀^(;A z$VQyiPʘKEcO) vD r?<'I icP1ۛ):ՠ6pTO 6aY.נv*ăO|-f6,Q\V NhDdVըEl`g̘>#d#*'l'Y> {I|Ns@'#py1ˌ!'c!%͊bNFSu0-a6f ŨA]' 2I%sLaa2-N6q)+U[Y˽3 cA*510:e.}Y\l6J/|"/+-15`F2ܛ._So`|Kԍ|&KTlrcMop$Co`-a[6c` MBS^TNWT|2+ UԓF4RGySp[u 28,33CۿWN1! d>2y&0;[ ޗ/ z+2_~?c8 3 t;-{}zگd6X6Xݖ-zeɦzxe2_,[൜Y: A >`~Fʼ?;7t⭎-̏]v%'vl/xsřqp6 pq.*Yb K؋R7y+Jz|<>=(P*4R72e<fГ\lF7vק UGCsܞޏ|(ۗ>zMM󃽞dVJ:$3Qz{}>e(gRq: pWr+!Q#f[p'>%ȵ`Vmfpl'!fO.@R:ԡԷp(9y~MjY ɍ 7I-lpY2dF247xCu*S._`[4WU!BMQO4d`AS%mV}_ݖ%n(ϱ&Ɵj퇟}nn{즥rFiqQh܌"f57@67cg2\poGstYo73%r_-`4Hs؜V5wڰ"{~}D;8//,.]X*^ů 'L ?7%?k|χl_7h V5M.^>_q]Z'ѯ51өR'^$΃t^heUj&pRfZ6pxk?X]!ίPaG GxRT"Rڜk·SJaZSRFG\5); 8^"r"sRʈ*>Gz84FwވYhbTdKV-, *N iIkM ډ_I5GRnR>tEbF2,wmغhٰ'1F!~72`4ؒ@G_glxtˈ3o|>W)ZpÑk?c !ޢc8%Վe! o. k Ѹo> OJ]JC>|v. '2]l)"-92D@p8BE 2.FA166I4Ϥ$aJSQSZKuӛanevO;W>sqY Za^U`sy.G5ŚO4lf,_W[O ?Aw˺b]lu?gu+ 鷞nUw2CcᇩE}fx{Ɔ"=bgwWGr@.x}Sᘭ7Ӡ|`# ~? U_z?A M4pH?=Z?};eǦy!A@5#_ّ~ 3 *El%N ZG1D"3 'A¹XF8#D؍a/abh:ځ-(bN Pbe t =xߚx 귢W_X~jE_0HA ccTlGs{p ߔ8Zѭ_%FՉgQ>nG!'%P %K|(~9;yuvt?v1B>c=ifj0D4-APz [p#>w*I4 sZexP?zj? W{UG}%kc@bh$p g. .M@`Wp&q8qd-mv]( ;rBG7F302<o=O11w>  ~D0Y/;#xDW{Vs`Th ^t}N7/Y_d;n,sy-cdzױorwp9B=go%^L5'p8z Hnt>Fų50rߋůJ~|d,Qe[=^|;c|(y2}qoHv2;MΔprӸ}ܯS|%?o?nk~??8/G 5G `~ x} ^yWz܀'+ոߊ7!8~Vk =D42dAyO`τDfsְYˬngb10'ϙ!5vkؽ-r<Y0`n>/xa(li8f._-"O+AA&fAoG!؇ip*8싑lŦQJ^a%+!T_Ax€^gQ Dٗ%`\^f [EO6FCx<:@*L0>jt//GO!<l[9^%vf^*x">`v>W}?؛@?ϠO%ƀ6Zf jf8g<@\C0fǮA/ QA/fe?M' )C-B‰ ij8Z%%p,4 Zo{"x8q[R;p7>Dg+osxIGK9=~ŽɏnGDY +B_iֻaaMzaFmpfsAOd9r+pa8Gl=q5z̓5Oy6;xaF<ihGo: x&=͇FF;Z%4@'>F)& ~Eb4Yn^0: OFe0w0F, ̪wI])Բ3+U.;btyY` 'ʞ̌tI4Y2 zVD0:} Dـ„Bρ9De(MTnQTRITηĒ\* :}/YS }g?"G$5MM \\T+Gq\_ik5ԣARփ㰚 1=i 0_[uk LNݜ)Mu^o kF|Ru(_at5hS0еOBs[Bsn2s"t sƭ:֜p-5M.Mg꜋e G4]XHZSUCo&6La4r{)o!eZuZ9*u][7zcnҟD:kzJGfXQ{]캸G2'c4zÅujJmNS Ss'@Dy2̤kM_Q׼ |ؑQKC)}ˑrw$?%sR%|I*'E ϥP4?P{ s VQ6IC91E~n>ͅLsJS2/1"QBkfКs5[ ${Zݢ1Qlo[ Sf5u]-)6L(}.41$"Z By4Ӥ9ǫB=?ʀPXJ-/iD}SJE?f8?Ew10_6@^TW /wtKt˒%{Zmh_h,bJ?8Gj 8)wMHO65Bi5`Ѩ:ZV-P0R40GeRr:>6YkB&Y֙ljT@L>TiLoP3) u>xPWMi\b?iIᇳ,"@2^0.~?FBG{x(^CCBNv9tӺ9Sh;OUBj&Jewfl"6h-ʊ_3Lz!pÂOƊvo5"-2Bj:!d@wYLB{j#jKdFOD冇 ӽ$"`qTtf?2cPIbcJ{K:3OS Of{M⢑*iՂS"Ld0' <@#S KW} wZvS%,ꗽK*%P-t8` !agIZ<Ad^IZbCEIh@ہl;"м!V8ReaCX"A000d7Whͽivm1YE8LJΒFjVf a[= <^T UA*%򠺚aj7xYG̘#_+ajch!V1ocLangdV1aZu%{ECɶj=399b%11{3Y*<ay78ܣRM;%Ek\X2P-26p:hEL.* uZ }`׺```R] }5M16]beCDvnI?bCW4ҙ9c4Wo,:,9_}*̊^d!&_]JA3@\@hn a21LVV{ Oك0-9ND!MoT~3ĉrG;@|:Ak| CS'/ RޘN!()z."ay鳱J=C&ɊXR%&-480c崓mòl#g*{=#Z"wE.G2PM1H2ǚ.apT 1]~(y"WGA{#*5UE0nl|$||4[qH.ŬdTn7)88Lw IVrBZ_A/L@v;uCW HsP,X / XpZ/ sOg虘}1OPs,8Uj<,%`OyfB)1OP,aMUvr$3/橠5(H7P@1 7XyX@rLE9\(4Ī=؇RgO&Cyg>  ޤ aJSYQx³sgg9c=4Q7_4Ba91ϥ9}=7zOS!E@% 9}Tga/ W ㅱ_ YB`X4ƨkװ"D++Y> stream xڕWK6W{И!)R@.Rhqi̵HrwwCْlRp8oF<<]Z< gLNuCD~2LDX*qTL &E6R]deX&ӑ(a^|ʷСg*^P)7]T B# 2ΔA*% V50/-Nɰˣ4pawvc+Źz:ϛ m4l6+쾳m`p˶!~|GPEBa[/xl{&MeP (giI/l#eǛH: A "h6o,/mil/Hp I %hv4+6),ت*JR&"h%ro_oМUFf]tCF+k $Si?OqMCgʀ}&T+v 9&XΞe ~J{ɨ4#:% j`;5' Kf!`HNH6:P-F)Hau.aDm~뼪Fpy7D1a ѭ WӰqzb+"T*P)!Y *g d~ jZ 5rvARHxΠjLrxBE?3{04!yDR))O_H)}&˗s- 8AuuD% ?yiؾ"yVstr&Ƈj-ܯkb~GdGd_ u)ϛ31E?q(alլ/%WJpɠo1HЬBфuDeLxE$@ mωrh` endstream endobj 541 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./eRm-plotGOF-lrres-rasch-plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 552 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 553 0 R/F3 554 0 R>> /ExtGState << >>/ColorSpace << /sRGB 555 0 R >>>> /Length 6801 /Filter /FlateDecode >> stream x\Mfqϯx,@1lFaDsNսaĈܾ}ԩ~>~'7?Jϔ|=O8R~x>oǧ|GI<^^(qYEݯgOK~|Ǐj=߿O_<|Ï__;tty=(}_巰ZO|r~ۿǫ?}}9/cJVl/a zq7<\  FŒ_ 5Wgu /uMhkֳG]Ewor% ,rw~v߭>[: Wԏw|]nYm`5;< hWgYe Wg jpWK3g{5vi\e|˵ȿly 4u[I?~ iT J-?SMH3jR֣%:c?tmYD7!A>j}.|d|W3w6Us$z<+X$^>\63~dQ؟5x?i6p|-El l[/ѾMhODȇos+'`3񙿁͍Jw 2Mg|LoFr բ}޿7+oď121{榥)a>_Kd_=_aҮc:DO췹!_#{1L{2Z粷h4QN{Þq{Oheß L2y#hj0`=h̓R9_?I[8ϛ@k ʞ0eCndr)| =9q=5ؾk+;r#x+q,E *xK^Al C?}^5g`G_ڟ{l1k{s׋Yx|9_oN3Kk؈H{+F{3Czrvڣ=*JO,:hQ7.a+/՞B_>0s=Гǣ"{vgg^Q<6޻?f9*°~s~))F١ז۩7;xQXzG[|}Lv gyk6b/ՋCg= ń,~v_/#&}U_ IGQX6^*A|,} ҧj_oB,{_^}?_?VŠe?Y/Ź'Ol*v9:b|]ޙE[%OCD%65=`'_[È?ώ/\? thח}4z oL}}s=@>hU|V Z~V/ЪZ׽ߤuhUzhu}=!-X7`_O#hWߗvOʞA_{`-qG4Dj?+_#mb}X) |7y*w6 &K`ɧ5$>FX_8aOxC#Jo^OGk+VZoO.0LSz zkp$iO/0-%AGzӔސ4қO= ^Ŵg1mןԻQz(?imL[8똶yLߎ80 g߯qO/7y(%׾uNT*R ;o`ӷ¶-q1^70_{76^sw>2``P 6G Io& _ >pg'?#x~2RT1h+~hLns^r%^Gap :()7Qz",=Fu>w'InXHTQ?1^=^I-gB+ş+  V߫H4ɷ\_ZE*LYσoQLohQ[Ĝo6OSyOR1ChMN*z#}& <[z*Γ߈b 8Oŧk(x=?⹞7X7"?W~7y\ϧ+ʓ#`2TSg7a+[U_}GP^Ϫ~ylwR<~z=8ca'd_3B.?kZx_njNo1,tO3 4bdRrIESFvzᬎǍ/?sA"t~7w[& }ڪO>#΃8,l'ua?u~{1S_c(S=?V;zk}?cQ/~k}_Wc?ˈ~# ,lt؋{R9x~Xkq{~|~?X_{O,h߇Z~?gw'@>$~v^ >~ *nYCK7X[/WlivpO[Yh3^H$}7#%?ߌxgw?Ɵxxs=^f׫Os|- /53g<7{/勮pz!;(HoH_IH6z(ͻȇ]O̠ {}Kz .?nP_[]î͟!X_COכ%-ף~^5q}*=Ke{+U +;4D>)J,>A{ﻁ_'&A8 { ZT>@{{h///?-y~pc|ư9)a頻~&b! K-PoP_([kD zI7`H_og!x\s Sg$oG"5?E㯡+~Ϫ,꿆>P/[zZKU~CygAY'ʴ|a˲8^E~a[j_i ڡ8ɟl/ ~5`N`fYIuT̆4 15qN⇙8OyA= fǪ0)WPO$b=̬GNG)of03ƋA0+OA$jF{,4^祑Ko>Αu #`*{}|Or>_z)4L| <#b/s`l}D|`< wpMv|qǣ|W(+_T}(y<*#c}}Vx,P~y-3+;Å^OBϠrvs%[ߴ+K in_ZW?Ss{b׃;ᒿ''BoKOK]-=۫ny5d<|}㨟ǭǕIϏz_4pR ybqe,BEz#e3Yʅŗ' %޶zYgWuE5,kdfK4yU7lGoym]ovߴjތӣ2P7Z8Puv.~_30lZxi(d`F`/Vt5CB^m_㴡¢fDx۸ŒuEqcc7~ u0V#r!Q7`EKsh>8ߴNYXFc54ǯc@;YٱJԐ ؠZ+,K!-ߠF,5mT;՘Xѱu]D )]D \X]%fk><8RjUϓ99o紐9/}?Npp`4~?gEK\J2!uz?o1 [+n3cWwl`?z?mexL{~$Q9 4{6e>Xx'+Ng7)BQey% 1)\RxA 4M*#aD.X? =tl?渇v>H#{ qC']st/]PiJa1}S˾e{C&vt[YU \#ْ NT'Sۑw4V1ٱiMъ|GN'/q 'Y9B>B tu__ص8KNqƹcE(,]3ϊ2ɒe!⭸6 P7D8^ |Sb yx|=LJNl/=u~ {璊4ӯy yVqʠ&1t| Y1|PYW; +Q+Gg\1(Tt_Q RʰkJ Jm,tv k%]ybQð[0E_ȹ&ҽK2KQQ˼,_է =Ko\"ۙW \,H]Lb3^b4]Nb5b68٭pb9ӹRHly?>X\b>G5J3/ϕKK nȠ79N6k8ZS y}ۨpn-X nJߗxmx=._J8K?yX7h]HŸiطZgn᥽[<ƥw_ͫ/=oWQ6GiH\?z֓? K?9wo^O[{WߎԺI{[sa_7 1ş/ٺPި 9YwԷZH'|} czŸ}.s)i/3ũ![]FS!~o1oHRVkǻJ5o!ַyTϥpqːJ (ڈx^x7[ǿZ.WDۿ}\9n7mƼ}V@Njy ??j endstream endobj 453 0 obj << /Type /ObjStm /N 100 /First 901 /Length 2845 /Filter /FlateDecode >> stream xZkS9_IQȺzJM& df31г`SvsmlcqVK#݇νݖPRLB$F]sIR@ab8A:5^%9W0yPm輰V WHh-AhtƢDjL |z~Ў π3Ǻa6hZTqnph 1VJX}Xa& y d<~Q -]qT$-F?*sF#0:!"(yy WZ=Ax{6?* YTI @&> =ř{/W0(T"`ڔDT! ZAAŢbA@˰[PwX:b] F8h_r~IsIsډ#@P7e(ozWE&cTkayl9m<3~YT<_O$9+mjgEߜƜ7 ]z8CǞ@44y!rۙp̭+?h0uQ9?w4kcrJ2878ǵ!}DphfL`*o7Xס\JhpRCϳj4}S=J*q.Y%ON+/=(:<D*'Sgh`~=h $8iXNrp7hK$"qĔIPz 8(0׿ӫq)uc0sgi ʥMh8A&6\Sr~$G OdQCtd͘$Ù干՗ V4jr#XF=T:vsGLWyhW,NcHA^ W&{I- ^r W^GWc/eQư#Aߛ?V[OY5:N反ZX% hW%߀92KtqU=L~yVѽ w`\]b+WC?Vᤚ6pRq~&U|4ֳ{">cXaE%0/{޻7lnn+sp3:?YqɎǧqMۛr2ߺloD҃$ë7_5z(^F_SucohBV[*3yKns~(Z^\g,\_[N^ ؎ 33\r]nv]qQ.qTW\Tijw^NNvb{+6 +0j( b2`/W6/-S ˋ`Mm?2/,j_[`Al7мfXCjZX*F޽T#K]np7zuwm%C%i6u@Qzؤ֞OSq1\21|sѲ[~yE^uv:}3g~Lp7 m-&W|ϰ毽_K0_/8"6~G \Q޵2gn1ǜ#Bݢ.ų-gU vtr㪆Q<;[(_՗W<%=cwH{jzOײ؜/?0Y:et~ endstream endobj 558 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 564 0 obj << /Length 2036 /Filter /FlateDecode >> stream xڵX[o6~ϯ𣄍UIͶ d3 50:Jr%i9<,)r}X)H6{Nj>8KRaƝL43mJ=[fEcã,QSo\hfEk]]^&s™_lu>>y 7nH{Z.bRycKEX5~Ѿ,vŽu]vn`U+щkZy= X7S3Q\z0D$N*Ҕq\9#AlaPae `Jb@Dd6lr׬auHd:hqׂ,O,4.m*QNLq 4b!J@V:l{i 2B" D]bï!~*[.jEg{)(eIDϪY;x1SA&R)CC< 9b%>h26FE0<\`<Ť?%V cjɐ"EE"8goYq$M2*uQBg)IقN'i?ha ZXmVhLaC .i{Z1 ‚G?O17QG̝yHmk;Ia 3; Mp-;;-S;U6kF\*NpH+^ʻ:/ODa(VoHo*%t?셑'K)fϊVA?&DېLD>B մEb%Wٚ m*9$_~ɖG0+aݞCFuXCׂGE4̇p7E¹}; a0S& :n^/. ~H endstream endobj 573 0 obj << /Length 1018 /Filter /FlateDecode >> stream xڝVKo6WH÷E[`n)Z MӦEfl!֣EҖ ><8d排<%4e ..NjQ-pN\Q̨Z YUREQYJ2b!x0ڐNH:Wq.2.Vʛݳ4DDqi(,)r,Ey'Ν=%e*(ف$с2$% [ VDRdۄSJQWiƺkݡF}9jϥxL5OFIz4?!&Jފ[ Ph88liYCclw>1„=t]R A-B^O_ȭҰL]U(hS7{!Ѿ+os:42I\>~$&]hp`=LfqzԔO׬V1qPHb)8yx@k(n|/.*8ߕ#t=gp@#CY`9 S(2:X@8K/Ɏuㇻ#sJ:WLzǕ.{"ށ4]WWv-Ox endstream endobj 568 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./eRm-plotICC-res-rsm-plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 576 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 577 0 R/F3 578 0 R>> /ExtGState << >>/ColorSpace << /sRGB 579 0 R >>>> /Length 14104 /Filter /FlateDecode >> stream x}K-q$Ga;,#Ph!T;E2723Qs/ 0F Wz//z}[ÿBRn~xӿO7^?]w^Sz|ן.xO5ީQO\c>L&LnD8`>*`0}BX'eBU+߀ǕN/q_kl awn0M1G%2~_~LI8&|;Ꙇx k# ֏/o~d^iqM01㵍?F\i؛Yp5ao>i#;]-a1pH7a4lаye6àð6;W6񹍆V]K i-F㯃McҰ#u0ϝ "L4 2]sg daeЉwŊ5 `Ʒ- nƨ0axa}mpV3 AueG]K)lp&X+ ú ZKW޲kTNW ]0,O +pgG _|V^Z,t0z01ܴQS H))?0lX)0vk'a{mHװ7/~^ enqasR{cwmab~^[8_aZ8u! {פs{yxR.i{U]Zw^;<__޷<`[`[@=}{}L3]Sw=%Z)ڮSIa\rػ `ػm.ao,o[^_kװoLL4aeFB~d {*{)^LǷIlPZf#~Mחn>[6vt0dY:ea;iKzt1c{~&a~q m@" {mc ?׶穆#kW w^[pŒ W;teVc}^Ìׇ͛?ko]x/rg=Ux;//.$ nXpyy@XXy9N>-|c^ΐkPX'c^K qZ8H`}y5z[= ?WazxIĿ_? |챰zxʼ[߳EW'=(# ܏{K`oqi~?_s=z?3>/<.܉ih|zBLotڻA{7cYgL;keߙho^i=(qaB{gݏyY7eYid-?FNۗ?w0…zCKKK޾UK2?{Z+?ͯeo_?_E~(|q/Vhqk}^%ExfkWn=,ȵ~iyd_@x\Pqyʯ~}+N^_>6{ q{~ ֺ_޾5_>#t1|E<Ǹm$zȏɩ}yFxD-~o~?+䷿{7=H`o~/0Klw_}}}g}/Wbk,_r L֤W@xd^@IzF-I]t֙T Ie+`O0$@p`Az/^6`dA$"H/^t"rHze3$"w !^.AGC`8^;oq`a؛I 0IⵌqCze $#$)1lx3S^Hz蔤`bl`$y^|+gk4lg^K e`B)CzF7O$"=<28+r`c 0?IҞ7IzEo54]$W$]A Ize"'I1H I I#^"I/h,mH&`KU?^GQ30$6 R9^y_^"ϳsrylJ7UqVA00Pbfy1pɉvOW'1 H4UYh8{%kh8G'z@G_t?Ȕ$ {$"Ҏ_Wưwˌ,+I/*yS_^Ϗiok]ZD5 5vEtJUU"y"["_Dݿf?tgL~_,(N.Ҹ.7VƸI)lԸX-7B冹q)ҸNmEWҸ܄qEI!](T-?|qi\4XTy㊺Oq#*ҸBg%CI IX:^qkuƵkƵ϶ExUbkմLVUb*kr- $)s_RF,J4Y+_N)X` :oV*5~nRzj]XbkUtYXI+#hl?1}%b%%z%%_?o,ZZ~JZ=V?e|]y/ؗcƺk}!2%VCf KLhk~J_+6Vmv=Mo,ƾG#cf?8(T_F}*i(-=4(rbZv:]L;ReWh3ê$lro4kR?g泫.cvșWKi^1ͦZv16\w5r90ͮg5]{\ѾVgo=i+.jL 7Ӱ48}Vta٭pi4i6e~ncvUv5mio.n7f*n7Z-|?i4i6Ult4՝ݕY*.n4.n.n.nÿ=Y(.nOCmh3 ObLܚ)Z-VB1=#-Sh5jɴhbiRzLVK~E1LsV~DkZ-Kui5VCHV۴h!ZȴTVִUj%G#ԓV2>i"1ia yj ϓVsqشZQˊi5~V+aZV4qj2Rqq[׫RM֧R6׃CebH!ZMgjaj&UloϢbJy iWTb}L᰷YհH]4 AZZ 땴YD(K8ַ׈V q1PYjfH u!Z /ipkXV~ ڎej1z#h%jZ SMoMaK/_Ma|uM=M u!Z s߻ڴFڎeKejaoj/Pjy)-<%9xďy)]·Ė!5oxl盀9?BۍNohm7oxm7s~Mɜ 71s~D;ޏ>oޏv5G|+շy[q[+%7E˛-xpV87E܇nl32.}D7Gm맻r<[ݎSֶZ?ʿk$ݚπ LJx'g- Dg2:gD4c6{N#D4s21 ligBv61IL{D4(3I"B$ sIb4Lfa9R&09I":Ce a'Ĵ2Ia+I"r˪lVv)sO,e:쀳X»YLԔ9 &|[4j=22A \l?1d/Ah͍&5h6yՄ4^=?|T\m{|pxV ';_ }ͽLڞ1y3QP'eئʖ. _YMȚGrY Lr UR[¿yK 1,jw3fx,L,We~$vYV=)^Peت­,ͣɲhy6Kx:,6wGjlR{e 5)wcb7(&}+$4olRSA2)Y$4TBIjj$TI K9YLmtϸYo⌖uZQ" $WM @Q$Tp|Dz:R9r2om6"7#"2ç>0PݕȬ/r;q3&[i$5^HYIH$"{ŝ&O4/:D%"IMM"dIMCs:TC!(1#9tyȡ`E]Ň^n%".' "f2=&Q !8HPr+r(\$gJZ&M18"RدXiϳ%;D1/8O3K"A"iN(8!G<1^H% :蠉]/rEFLI9HF'"sWͮ<>A@:+(#`fhA#ky-#o#SH~^" _RJSsG akͭ 9)%<'g*$t3FJ'XR ,D) w7RB38&r[RJR0`|QJ}O ۑRfI)E>gR +RJp᫺RO+\_gk'GJy&lgRJ-?| mRiRj陼Ev+)WM_OJ1he q.FM1?A1ߨ^{J}fdQ֞iE 盟doq~@=W[d1-|S2ίһ078ۤ|xݐ3η8J8|0bNgn6=a2=va.=?TaZp~fŕM{ITE|2a,k(ުD98j%󫦵3·s D')0ίhFedFc7vȸy&\nq仞in>̐cocMgMg2 ß|VCG0﷏r4#8q|w0~M('gWu#2G/&+~>d*{|wO?T>lIÅwYO ܧ3nKOsڝ+h팏A!;~C*d)d|nB˚W]ctΐ3Ƒf )' ٓfn9dOǑJIŧcȾ}Ԁ#E#%0 ٱtDMٵMXFkmux#,q|psʛ }t8T8L;z=*¸*RT|n4Gczkۘ0n#նruNݓ|%wzN9OUk 恹0m붥#um\qے[ >w'{DqpdW1G|m% 1y7tvaD}X%VC'jd?qG]E,6$W|V燶G~Iq5?u.m!< bsMJ=8$'|Cq>:'pSiR1$l:9Wɦw꼋gK9yO&B.nbyλK~T$꼋ER^B51JCλX;;`N, :9WRʖ=1JQwl,5%4q7TzM$Ѧ2iWTjy;`]JMUATKX8Twv7o^u: S9/޼ uagxo+śFFVދ75YwpZtKVeDw=]w+r '̎y滃^yDo^h*Uݘ~W!CoL[O#uE!a>`CvVϠhI$2ߙ7\/4хkܳnwiVbow\J흌{[|V}uͭ\]j@GC0YpD~6:]d hA5ӱ.} i(4 6cBjzH%)@Mv$t某."tIGk>X?a]?!+8&?ESv{-kx,ucSE9)S|PIXmڐmMm淤qA=n6ᔨLDŽh?&" aݦn5B,0iLE"xPYITN'E^s^\7O/M[UiY9p J_p  oYeM> p{Ej%jOohkVSVkcOjz*I3EZ 9_Vc94W들ո= k"\U7Jj#i5V\IgꗏPjcdj%Ҫ N,3pVrjә6*Ҫ5^AZy؂'Gkl6i4~ZtMӴcl ՑE&'/-MPE$o᧠Z)h񧎒s~d-a>ӕ&<#GU$)Cn@HT.TpX̜bZ_;MPbP1JLG*M0Y4TJL*MXi9S &X&X 4V'/{ۚwc{Bw@Î]2M><1?zy aצeZ_i>24jƏ@g u\i}dZ>"Ȃ֧Kؤuiy (cU/QCXOI{zp^z $Ls( EJ V:(M#cIMgPs^ ](̇kewHdL@ a4JYy|')7hX$c0Ġe TW WÀKB*i>R}Coa@(R:e6v&3a=R)LI&}ӻ~6t^&}; u**=y * +|Gwk,untҌ;f?bR?̦ǘ:Df?}F"rF4knj/ߝ/+T_>A壥_#~FEȈ#ErƮ?UXE{"G]AϵqWC1Y}z>: >]d8(YCqٰTh34C4YP4qgs= -"]ގzjWCeU -A!>o; >oX}jQ.>>c ꌎiJ-b@ ޟ@W:6rJ>u_&Sw~ Ys, $AeSUuƕr~z0f%C֒ӅAdJ !^Y2g~%Co>?m endstream endobj 581 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 585 0 obj << /Length 880 /Filter /FlateDecode >> stream xڕVMs6W`4=⋄'L*SODmLDQ!i I::`{=avuy F`0d{G T*F(ݑ?c QQkp6bх~.ίk1:MQ{#ӡۏ'Ȩ4\8j `pE1Ddr E;L~+ JwB)o2wRD(M")1QJaC}/]ٶE{գjol-N-m`Otdӳ~@g5UZx-c/-Ǔbsa7s ?L}}wɯn Oz:`5 Jr-&7lj0Kt,E D߈ zжX x N a-&& endstream endobj 570 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./eRm-plotPImap-res-pcm-plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 588 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 589 0 R/F3 590 0 R>> /ExtGState << >>/ColorSpace << /sRGB 591 0 R >>>> /Length 1609 /Filter /FlateDecode >> stream xXMs7 19 iKf80haHhvϯdIސ]<YeYyjycny|s~њ3y ov̳]8 ] 0$y 2рK4/9xq{7T5~m 7[96/O>?5ޙ7^2Owߝ`x7!ʀo x{W4Ƹ*-u 0epm4j}P< ѢBT5hk'j:Q5HuosB=] @2j&%@P DܦC%9[L|7?;x|6uM=xBp6&Eu3[M3ϐm̊ym}jQ|ٛWח7WnD*3NضYTg{4U&:>7a >۪0n{W22ۢbi6dodb6%x+!|8}Ϙ`ڦ~q#&˸ftds[WMc({BmS3!J 찉y/vF2vc S0t܈9Z|u@՜\[6'nΞ/ͳϧϻ܇ P|/~͗x% t|3C> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 596 0 obj << /Length 1874 /Filter /FlateDecode >> stream xY[o6~ϯ ,"u@64E(-AGe$~7R$M"s?9Ld1G9%84drv1Qdi&&g2-S28 6D2Q(QNV)GSI*S"b^q TG8 (cY̘@JJӗLPu}W]_o3ARkMa+r/<;ax=8cŕ:Xh!Of#dΨVʓ3"LyuYdrㅋΚrfmifjSt׭j*Ud/S$WHj(Ģ"Tj9 \ 1{kڛڧ-hAH !=o.Җ=4[\`uN>c=r1_sxn:/.d?.G jwFo1C5"\bjtk[vAu]xJ<5ؔeēP?wV,톢{$+aܡ,>q\NUvHp<~$G&W{F 1ś.caT҉:!_ͤ\!2 aKo 6cK~gAKӗV5}І[Ek3YB#{@a A@pF{R7#$N5 /i6C,ܴ6h%@=MJ#pF%"Tp-+)R%C m>z~I u *&:~')QvLhڷ>2׀D,~ӻ=e0F[[zLa= z?Ukqpɔlc`QA9>԰iɇ>&Pr.;a/gPf7~J: ־<\1|[`ڵB 4X>Kv)?8 D?8Vvp+[sq^UƴY4v:+5;;μSOf@8WuX8yz_̣*v.wrUXօ{1g\Oᝬ=zrQ`;.E c`xҬlR'E (<3~6ChÐZV]Dt7i( {˶:7sPOhZ_E`f('!?S~U NO>>B@Dp=Pnf¾NA-"Qhj$2}z8 tg=h/G|WoֳsjGʠo b{3ފw {`tWC[CLe0{fn~>sUQeL[;|ׂZA_>RcL[왹up$|?T?#1Sxxz?nO endstream endobj 607 0 obj << /Length 2459 /Filter /FlateDecode >> stream xڽZo8_a \~nš6L;[Ir!%EmpȃDo݊޿Տ+FnWhUNPkͲbg}[YoRoEծ^ff,/aת[3ߊlW2%$#0DZY8^xI7RF(b8)zcU ===`p06 '퉱+x %FƗ`d|NEU_B|4{if3Icq*@R8MU5{ U郿pMӇxn/>s1/lIՏۆRl%FwXTͬػjcq]_Caum\ܧ]k5P(o՘q O^6*ںnw(qd[|X"ih$҇ 590b>!j>y&I27h]j,tÈV3F#9J;)ɹOcj5&Ȱ$ mE8 Z8sʤ@QhZI_9]D e@{:7mx{~{\ *̄f$ #V)k%IėӍq0xu{,v( G웮߭Mu۹Okf.Niq}tqz6bLJ倔mRvr@-L٬HWRnN߃}.kFIr-*5`_C~pA1[X y| ӷ3 yNrf&,͢NDA ~>V^IUza`>XORPscc >9]"V(ι] )͠cZEQJ9>]9|n[6*Lϙ2q%9FM7u'.:C&JպJő?S.  &Џ]"j|oip󁆔s#y)S|-í+:<ˡHI?9!x/=e ,;:eQrVPŃ))Y1<f/y Q @~~tL\{X *J+OœAa.zv6n6kk8Xx@".yE=܈fM& VwuuM))2}R _@P(CFX(P:8| 6$$"h>B xh0>Ag.Qy" N)mWM l 1Etj!6?fp_|fU~lէ5J; &,)K^Is>,B M}SD:J0ȠtO% 7x}F)b|zd !=:ޡb6|BwXy"`ot?$Ppb%xnGX ֚5ؑ$9Tew6K(12$8~1$qPvSϽ.zxe麮 @%6]kS[Vc,APS 4sp!!q< Pj(I&:ۣbf=xj!4NU*5.⡈C99Ku3&!wa4u7v0Pmk1, ^kxaK1'p@͠aTtLϓ=j?滁 eƙt$9>hK4dɾѓD؛T'Rǜ |,*AWH't$Ӗ#b^J+&X1!oH;%T5?*Xt> 7Yƅd>ԸhhZkk}xQo :0T40WD(.1-V}0U0%8M_T;l]W>ǜ!R Y?KZIpPfUkQ'2&9ɡ`.2v jVW?N?  RݝqJlaUPE8^ Zun-l%Т>Q /wEb%1 biT;TCHp*(:xÞeB*i:3mZ-b|*(~v;!F9pqԜYLIeߴs!rwhȅP:rG^Ed7_pzrJ(րG> stream xڵ<ْƑ|cpǬ ْnRaIh  rfUeU R3ڇ@yTމ&Y|sЅ\.7 Ɩ?' *F(5u\a$hɨ\ʖ8以E~[=-,pQFX:ARgܨ;Haw\9J~s}بݟISl.U]m(wv}lmUH wfhm5Pu矈$G>*"_\8갔E!nImQmѨuy ϟ8(,!1daæ{7]/'O0$AJ8<--~y)PU K5p= bű Ժ͇@(%'IE@"e#Ȓ) mzn_6@HUnψm]vf \a#8(POOUM)t/Lob-A@7/=iIzAd4 -m 80#eK3 P޺40qJu@r%IL"H% kd4YyІ7?7~`ѝYg1ₗ ~AwDn򁈚" k7{d(-#l.,,P B뽗Jw_j0fP1ósR*ϼ(q+dhʋ@uċ{vK[z'G" &6\P#~ .e)gy=N&੖S:~Lti4nr|JWQx-)}aT f ?[o3vz2ĞL*) QՃcEoĘ EЖ;?"U'oڠ q0|ɿ/WF>#P p4xC?L3yOz?l 'Iۭc}?p֯xt@ŀbe4TNboD.VPg^ J57>AV@IǺWҚU𜽈pS'X/! i}RǏaH.>_U's^9/JH~j9l/'t\OYR èLZQYt/)r" p,1OMGeWų?n 6p|BpxA_xt:8Zp&w/G\Jx^.uO1q_nG8^ B\* 'V'|7{wM׻H5S6N>.5-f^F0e]ljNy#_#-f]9/qd`\]yX0l _1x 9|]աه7M>AL %݇Mw~[~Hx#t&[ D+ٴ+@ f ГR|^uݒ"1 )¬wѹ8[ .SFKjuFuɠkiETKVa|w0^ɦ͡}b;OkJA20[qgu)gsN#b?ܺԔ}4[on`yEk?\Ur ?S&X: "/%dإMaÖMmFp,!2"QLHc_8FHBJCbgKۤ~naII} w踚=cTEͱu6,t7cfw:'Hx_As.%&Quɸs|̭ФJ)TC%!f6J\Y0ReJ"Mn i`n}hHcu11,?³4a#0ޤE[\O{;Y<:܆Oï*\ +`.iSV!p)%SJqV(oOѮK)LMpX]M}Jgte>q`_2R|S p<<+P?0ӹై ̏) C8Z%}m%OOKp{Ȼ=q^B`Fn|$zfBx.uQe\wuӫGeKVXT}d6iL :ȫ <2'Ӭd㮺} #1(;|*|nAP_mZYGĐ'B_޴S'ܝ$ #Us3,E>xpZA %dt 0>N[䂨 =ڳba 1D! '+D(àyě@ 5۩ 7B$zv:<~p}qPs]s S8~e/N]?L2ʦQ)ӅClG(I{-ʪ0MlY_IQN+Wm8.@%UsAh{WPE#}%>3Xr "rS6-h|bOBMrp_(-hc 0?A@FKËbbSd7 VLwzRO5H2|/8\?/AE!˯p,tA$7@8St묧JX{+\)CeAfbFS""mbQ¸07cދ7%+dQ@3Nb|mDe66GnkhUpKqp9.t$g@ gW[16KZ č)9CC0 *P%OIITHIjTXX0q*m݉`=E+8zp?zkBkoH~ Q5ɂ{nlJ\\͕Mo Yp36fZ]md3C,[>;^'>_g/+_lI" Z8ͬup CROQ?l  }j0„@$mHʕf+ ;𫫰S-mԠE(s25q$~| %&9c\p]c 'z:d"ߵL?l< Qg6/^Ƙ@?| #b4CMɮe3 +xkjSffNKI FFR³ ͫ>YǤR,?C4L&&#?;a}\/J`1<h$azk.q@NUW2fR [c*s{q| HQ33l@E"ćq֐:BлF1vgƙlVeMLb%]?/if܇"եVk߬p87}=Z \uL@4 y65>smzT,.GUp㬓t[#h~c ~[)|7 6_WSL _:8a="gm 'p! rjZ۾3ٵ<I>,RDo'9QWU5OmA zcĎsa~X) ņUhTr+N<{xORER?P/4SG_r46\5ږY><YbȖ|_0Rؐ\Z鋎K>i6C1̐CE6,ɑ)sL>`R3`o.bCw feL6Sf˶ZG% 'u% ,,rۿgM)@-M뒋V1 8fEs^R9wwAtN=n`—k\;ܭ;O)+4`8bLv}c#B/zL9 k!~h"H5f|)={0Ȑ"iDsXZ|>0ÞP8d-% s Х9q-`{$A| LtyqX 쫑Z ׯKq" endstream endobj 644 0 obj << /Length 3802 /Filter /FlateDecode >> stream xZKs6WHZ4 9U{pc*SuV%9l1#Z PDIM$$|s׬PER"I6dBN_E4θDzj26z5e,Z̷vid?ͼᇸ%E@?HWT݈Q }Au#4t@" "x&Eǒ Ic)72Kvb [dF^y"`,$oiK@wH_l;5 Y0> XhQrBlO ú:XuS7|癘 Vnv1Py:a_!ο#T{?~5cUxLB LBX0UWc'I/%(S9y+׀ FVrOqX"20?҈,N3) Ҥ&K&44N YQfgweY<"߳Py&ʕ l_V-eRlAtۦ֭^ЗWW}$Fo'Pbw| ÛMdM -yL@N+8j<b4SD6r@;[Yf* Y}bJqm쥀(ElZr2'TwE}U]R^&Ի֌u=l#d[T)ˤfEO.ߥ/%<4~XmM>]+稌2"<4ܸ>37 غVahVXO[Ez$ij=-Կ/]ؤg`j3R qJġz,W$}yLjp㠠mO֝-L1pܩc]SSA)A55)jE\XEKekm:isJĘJ%c|S ,X *D9xo7]NqޘZ!+z6.v^7>ܪ5wdŦ@=wfy?Z2DnukOm{5gҹ5;@g!m /jwtؼĠP4j﷏ @j\ 6&X,e¨xn>5y\)BOqu psL;c(Z6ZNovhj߃;sӗF_S50lNw[ł<)R}X͝>7ƷuaPU8k/R) B%RO;4 <{A ӽ`~r5c UQIny DZ4JDSL{D{W7>tD֞qk5 erdI鯗W^9U3o 2y:ōƻ'Udmgn)7@ Zy;Pf;GSQ4ї@v ֆFD,ğ4|B2ۏЁGꢴ}DaP%si&Cn .4іa}E.7sGJ54~?pC@E?C OrffE4(Pdd+RʹnBwTnBX/9 %ips]~_!P>9DaAkʜ@9¬3C}4OM'uIP Ě-2uV:_+B`)C>fvP(NHEH\y* <~7v)wRu<0L <¤Yv0Tq",zvhc 9x6fj54-> stream xڭZ[w6~ϯے07vI={hHz`@eo⓻ ɹDp/'&ɘWfr3HvsݼvNLh&]7>&uN噓YcjEOT$N*Ђi{qSG; hح[?YdoYѬ*='g5>.|&+Xz2*M6ˢ)}(-8Q:C}8lݖ<͒4go5CEȑ`Ng;f$">7 #Ivl)Y?Lh>?z@+u.yK=~(IMB'<&As]Mذf3m7MAETl}*Ȳ"OSMhԁF=)̙=Dsɇ瑙MNߣ Ի$/Qz85]e)社*(fk֟sxMYMUXӌ*RD 7M*tR,=xS Z*5^>nmb4YrlAW3a"s`*l"cm -RoaZg`l?H/eI)x2άBŏ!&a[.Q5:]]ƶ>=K}\QkGyt%#߁C#ZJcmňF WCeL,u$oJ@ΎHnȵkf`:; SƌX58p3#&K"@ԟݩȼWOJnOݥq2]m C,yGH]XDG50DZ l w( bg)+0HhxOf8pi4xL\5rkIjBp^tG=Lbl:Z3tW9"Xu@wf;`'݈u7@y57C3 ̦~)Q"cƋDIIeAU0&M8% EQPF (%b?pK3#|Sqst-a4KSgߧ D@1;LiryW? Гqˠ/ɮVu^<+E>s$yUyBCy4:3cyD_Sk/:S筼 *DT]=s,[KyO5E }АuA Gq_P 5T屩RUhźDXklxQm(`5"ٲc!p.9%#*^]gSPc(tI#aQuL"*D\ƫGXd۞_/6LۣPfV (8-r٬Z}{, Tn"_W7Xi4¾;۲DÔT] y7wS ɂ,?J" K(E9u(vh0F[ﻷJf|^Q%m] #iK+ƅT'0ay 0 6ퟠ-Z,6/-\-Uld\x-Qk:d;ˇ VmYC@S8~=ѥFWi>>gv!ngLNyXLT -2s$,me-R pj!cc9:u1VwI1 zDpEHK+8'(pճ?VYH6 KYDڃ5.ť#?/@BϢo18ܼ2=NjU<쪮!Vh2^NC]N'VDp3BwYoTԐH 2z?m':(IcBh'}c]܄ ^"9Dy!537l 60=DR[F^GxQ?"x%<խsĹp[A  S݁za|v]G> A[F/=)dymY">z`MK&^`3ʭYHmŋ)Wf@˱b):p's.Wc$NA9nxx Х]{ҝʞ b&é 5o6!wVTHt@,]/6x8",je 95Cv&>GWS#7sZ4Ջ>xs^9xٝCv=]v\n/#14oߤ[.\gWv;9yLǤR$%ᮢ8;Pua+ib10sw[?t3/{=\pySas!x!15Hibū< endstream endobj 557 0 obj << /Type /ObjStm /N 100 /First 894 /Length 2812 /Filter /FlateDecode >> stream xZ]o}ׯc~\^F@7 NmKcgve)+t}l_Qih 3Cqy=2*V%U |5yK(Iq(Yʬdz`T5!XTtdT+륋6$(2hE%(8٠-ߙPIig5DuI*PC%NV.䎍m˨QfiLʷbP-*2քG^ڤ<1QWQdLPLҘ 22 08*T2WNJP ^A7 Ll,*VQf̮jG( X^ѻ@#C$t,0'lŤ#w1GܑaNl"xl~ye0 ~ 1,Hc2Lph&d #w5(ÏbQy+{')gLPrNx8,2Sȣ=c`#S) (8G6QqËK4,8;$=+sƔd4]2x:Z$v2r85?.e {8 ףw3k-V$V 5j/>}RΫ̔ =Rş&騞 iRśzx2/''լ z(gd1WӦW' ѴWy]ʏUQMU pqv2>M=UY9M'BISjb^ =6ꤘŰqy~brZgrC9 nm'۠8Z7Wv:Ua/om{1(^UFiDC:ŜG GTqSU'bVi9heH:mQKZ  Ht K]=!}!-%\ʰn*}4|_G(^`I,M\2PL:$-jMkT-,vܣŰSҽk*6'@rg-Vkjja98cBF}.Lǣ]K,NEe9E}'] mz ,+"x0àxɳ7,lTc!`oZ<|SNNX1Wt0헣{o+`X}+9P=xA^4kwgC6y}Eh -[4Eb-4f[6/\MjZߩ|ߩ|nnnnu~y*NZ%M^<hmn?,+LSGX(g/ ВK("]qDBJGI e7y5=,rQאx[ )\i{-ir@G}N ZLCDצ(XeR\^zmn/-Cs t8&οo}57WBG+%Eg`r<&`Fx^A݄žp,"C9,rX;GA{i>b4tvZXP* >!wg$g)naSK? Pl @Prl(p~I2o)UDMyFɳf$eU퍡K;=ɦ헀BFRwknٟ `Mg5=(WG2f:r_?.N N Nvk;X÷r BQ+ڑ ΁ ,@"k$9Az9Xg/XewEcbq.[1:`XQ9J ߮wcڷ~ ;=@x9.Gq}W|zҴ?:SԆLXBaz'''>Y;H5BZe!9L-. '6Ox\N1c{ endstream endobj 681 0 obj << /Length 2891 /Filter /FlateDecode >> stream xZYs~[* ;o>eZ^ؕR9B^ۿ>s :8y8GO_7Hf32;~/ϩU3J*K,}Q+ILK]Y.ggهMhQجIYͺx~uM{-KJEhy'|oڋO U8o,iĹ報ׅI=?g"+љ3XE`sT痰*G" “B\#c6 \0}mk."l[׺O}UmVh|vo?#g5-n [Z7AL%Y@T]Up˪TUɏ$1% ))onB?דǮTEKs1<#+EM"Ԥ 4  -(¥V} w_FeeEk~NJsrK$וb*M&[Kw0RFVrE&$"M=]]-KS|CK-jݴj`"ll_y6rM| xi)heElrp4X{Z߮ʵ i"_јo;=oIv%)8@J[& #wM`CM؊R66&೔GS?>7\?SULp:· .) /t)aB׻ !h2t|*mсzޕ6]cV1aoCmCxCO]t-&M#[Z[i-A_Jm1N iB|\z =: Tk6kT'vv2턢|]4*̊Mz\B0c@=4fuYP3 >)ɄYh4u hOݺRN0>&P AvN/' Kz[Ц2c  F@ ߙWB'6[vW7;U`{ 2L+nUFXȂzo -?87@k5%G%E LeVHCq,4Ixdw8vmna2_1x@3<Xg]DZ}_ {8IY°ΖuI0Lr Gnpn m b"1@LD;A% %F@qnTaO8=ND8bqFPxb%679qBc އ> qB{4(in,л_j|TLdJ҃ Yaoª ~S ~~um7oKFoeY1`fc ,K'(@כ&PSnlBǀ?=D}!cA3BF8Ah$pBz3ExNxU%RVL#ubtqI|Od?Ɠ|D-Rm{aqCFf ZO`p|^'rO`"0IE4916A-޺7a(tD{,Gr* ubLI {IlNrd JŁL&Fz k:;}?sgqSsRAnvtWMgaR4XL6foYv) Eitu88T}a: rwATx'%7/_"}X"wgߛuw\2DONE:r^]xHԍEH N9_eF[M뷾t}`gUҟ>r-Eݧjow},] E,+@WZU|uzihg \ jƞ!W \ÌAyeBg%< 1rXtLfH~D;JKa'-Crl%-d>6԰릆߸0)\ٺ9n8ut?PB]y&D6~GVmVZ}4쎀ZPj*gK#~eOvh؍E3,~ 6d vXRU `bI?n]E&n9(PqkX,Yڀx(Qqc]խ[L ^vCFcd1E KUwɭ/yء@Jw4/]a4KzH $=HH=3$d#!7$̤xw%PͧeVFE =/(%V6%0Fc ?+%twe6!|=gK,0|:83qjhKUw?c0Oas #ϭ_)Oo"|57ɧq8?n+a,@ʙ˳X endstream endobj 698 0 obj << /Length 3421 /Filter /FlateDecode >> stream xڵZ[s۶~ϯ!gbKߒƹ5N3Ιӡ%f,J 7Y ~ b% ѣ#z''/5GG;:(CPGˣ?.B7ݘ0 ^7y׍qF8]C9b|H5Kmv2A9cɈ {(@Pqi8]ۉԏ)O:O2EjYg*)pedgVf~a1Pagxɻ$psZ~)T'U6]UuJY[4mV-|IfI1j]wF*M4Տ5lg_*2KMU@߸X J-Q"zj8aCp!U2XQf%{?\=sVw.W w*ƿN)J>>]\U\-~K^G8yP=zeաgt'0`Y5^P7C$yB#p,pu5׀l"ob>)bIY-)NeXR{T:ı(Ze$T|ِ{;Lʕ%N1(@ | M<_x__UAӽC x'|٬Qcc#lHTxdl1 "مk/,'=s70γB;q ̟ Љ)()@~4\WպYc= ma ,{HCj3hxQ@DnumBC@Xdv73L1wM^8xg`BxqӼqnT%qqq`q .6Y0Hq8 m)B}Ӑ3aQ<*F"ČH(2I]o*:%hX-&y^:=uU}uxD)rg6Fw()XIvVK*T WRֵpi-sɩsV,.ispW[}?<ϋ;OBP7*%}n G+5Uneœ'">>Wۿ٠`H#:Т(obF@Ztր ⛸56C6JґVC,6$[r ҄2Fn m>0T#X_ u L|^OM@<@S 4WjYk=H]Wý>R t7%2 wCŒŸ4$M皏 :S)5;r}*x1 &„:3:8) q?a~8;d׬!{{ dϲ{BT&iAqg%%F.:T U4/Ōw2{/SȎM gf.*pAYj)X쪱E+Q2Ncc]Ƥϵ"m$D1Mjg-쬾;7v\rLAk@°f(MS|>,0ޤ`䌃ĢsKi୐nMW.Tã>Ŭ1`;S52`iRʨ` \;„b Sާ a~}Q!?*&vYxCC8.WU,ҏ_b(,^^"gix7*n3`05ݐEoA/\+jM7Yݮ;= @*5fEw`}~K@Tr8{ l,D0Obx_cNqdLe3B̿Xr"v5ށ60_}:14n0m~c8'ģF 戱1ی޳[JݓsM;!dÏz!Bqh0Z{籚Pjq*!upl|.F\x/3g2e)G9HHp|=5;୏~0$4gNU=1WDs5 g :#h=OGKcE7)3!ys~?q#K'}%-J=mz ,?IA G U=-;Sڄ_%z?98e!޻>{  I[z E%qYR+,?<jw~3s:g5_(23gEʿ܅3YvC8\w(i&t:ήc^4eؑ|Aiﵞ1-ʺ<'֐u.ruXڝ6M(g`oAC_շ0wS<8.116%ygᙲrP*l.r)œ\ endstream endobj 712 0 obj << /Length 3360 /Filter /FlateDecode >> stream xڵZMs8WHU4A2ĉlq9v'SS[%RKRq_ 4@d9]@@ ~ nGdtճԨ%!nF4$zN bhun|ȤLKK[j>4b{QގLly^O*||v_WoaF0|oFg0f´k6M HFtёf,%ʌ2k7$I>A)LHBPR *մPT%nYkX+C(|a[[7X] |h&3Pfeo~a^vڤn^ai/ z{oJAЦ!nB0)l9bu=/0&;a\Lf` 3gWÂjRM,9"+!_S7߃}XvcTմMs,3!ŷmo\:T,>t8KnREڷ2lm]q#7C1k>0K0zbBDzr~C E~0ۜ͋ׄ1#ǝ0ߕd=p9$O'`!*/⨋3\ e^TZ &q l-V-Y#c[TA`fGz&`0IF KN9ڮZ/H*FL^M](_M"@'2x@N-g9Z{$z$s$3ý2WP-\UENS[ZoslV VGlV]DN%s[M2ѩ}MŒt~JPiGP&Sٹ}a"F#LoMZqp L@ܮِJ>"Řdvd6T`&l:`y#,iq3uFo DjYQnh\/=ӊo^#7"R.⬙k,peͫ/v_a>kc7']j{uz-@&Pe`Rkߕm-9^0 faw:BgJ7.;s-&l [Pdw(Yw 9,l x몺z1+US-g44&"LC'C!d;{V,qyx**G+{CPÀ80KvzK#=] U?(dETltCʈ 2|#1u5Y9b7ئ}rWvQ  ko߃TԖa`,F7үY'PbhƇClCT0*h̆ ,Q?u*/_$Q,ĭ4l(v;ݔDltdpZ{D s TY;ѥ>Ly8N! 8jHUv¹JL [,63j#BFӺ/kGE(Iwljg^(k{|"cF⌐'KZA~$76hZ']Vl j!CޝuqH㐯ūꇝNىcĽ;YTn!8 djx.p#6V ^OP ߪ[X^g)g\'%@«ʀe b\H>G-Mf?2yEDX DN0LsnHV*\a*L?[~b˻ܝn O og?,s,K/<PB0kǫkVQ5=qa!?hM"o>s-j|ߖ.ܡ cu8tt~hbTapPl'w\yKbR#F"7pD= 0[}!tL,De 9!y9x 2ɧA7rW!ޫ+B-Lx`IlwESچ˝u Ͻ2i='/Lo`Sv&c*v@ {m'cd䉷w[Ad'3Uew_tEjS w@3[+[?9t<3S3ݻa4 ־s霿p%0H$`71;pKfA;d >a?Q5>j/W&Ùo00"LݗN<@30?ONc eO,@채C> stream x͚ێ)xi_ EO€dC$H" G#"UO"m= _d"+EH[\TZsڊŠ.R.u+2%Mҋ+&]m&'q/ZKv1UsNBH. I)-8IhbRyT]Rzb\t}E)U]T);ELqk+b u-mTW(E*3F#'" #@j0 =wJRh T&LEj̳fyPu 69ܗFf5B ̶4~ <:<|K&G[`6zrݔmP䒭=Fg ( E MhQ`YSo l$0#b*h uDib kp2fOh+vtS7flh &] ୀoQlƸcF]F1*֘L֘=Ts@Y\{ g16fͼ3lOX *ve,Cޜm~{{{f|y~0<88}st3=:wO07XaI z- K/>VE{_ӽyދxˣo0M/wIH[YulP ons/REj̽*A0-~\m fGn` ޼y{b9}aGdqFӠv߰!ـlo-cZcȦ=pL۱@5$cG!٤r҈,cc%Jxػ37=y~x-Xq}wW'gq!G-WgJLvxƀ݋縷M?ػ~=L߃bs̯[\ڽ|q~5֟_zv͑$L#&D. >+7 `m K+K<'lZ?\-K{P-]8TbB˜F]WPB=wn69u*b=FNFD3LSOdlY {m[*g1m%@M~IDW? kVUԸAE!l Y7䭲r=>r*YڊEW8ϰ? =Ee_Ɠ""6h|mh%5okbzM' EYw+J&qbF ΄*ِJ9 C# XA t'T TK,e eŘ(9Fd3݆6oهcZqL5FO1<$JjMt}L5l\CRۘjXXmL5:s|d&e%m!lGpۅvС]Hs_BBB$ͼ^U 1|{hr gdbԙ S\pJ_ʤk#mɨ``PHV' ~6 F:1bh{ۭ,~w9?{|1-+n\m̓ A5h,}Vu.j2 Gfsast'FC(0 Z :]INdĪ^KZ5Z&kKP)B !jiN-A֭zWa}]LVmWԈ5!gV䙽 rkܠOžDߏ}?FFwchvv3$+yi#j26ejHtKV:&-JӍl[-MJ+dhW |,Y$R~|ώ}˒8󍒡JXY2RA6.Z,m]ڶD5۽LZýljg agX"O6MJsSAv- z_5}ڥS,Z nouf E qvv<G5>YۇJfC,KΏ;F>a}ĂؗE?dBpV֜\SnWL-"ylf1[ bKќ 3HQ|3-Mt2ҭwF};4g?=&k_Ğdd}ZeLGďV cʐljF~D< endstream endobj 721 0 obj << /Length 1022 /Filter /FlateDecode >> stream xڕn8лddS b[lݼ}ɑSi$Ùǟ,Y%,=]pfΨg'jK|MKϿ7C7\Ak Nwl4NeN&[\.`b@qW6zߟ*+e'-zN=)wD(N *?G|A7^×t" ߄T[R#/M-u&?,HYXwra(w]&M9a 9i"첬H8aeMbZ`1㰬i;qrn\h: e. 2N䐡vˬ] J,,®ArC?8wvY +Rd)ƓC3tbS^;MW[kUC根mk3RVcC8ۀp"nIҌM9,O0 V{᭛eM JHN+NSaWކػv+L'Y 2O$l;߳|yպiY"߄"_e7uoԒxh*ys77۾ 8j֡^b~4/;LRiTzRLFIt\mh|2(Wać{Y>ocK6`A# S4P{,#U\b./>ۄ:ۡ+z!a'LXvӪ\b{*)jt1maҊcN!N~Z 󁼎4(Lϖ:gĩNLZE8M\hY})Q$D!Ci_ y*!i|@-h8Ӛ2rƭ`Kn2 &>Bv%]bθWݻMjl2ʙ@>xt7̀x'ڨp{X|?y嬇*jpS)Ugt "YqvXs+oWF endstream endobj 726 0 obj << /Length 207 /Filter /FlateDecode >> stream xMOMo0 WH7ubCB(7ġ* **NzBB???'@ &_K =ArF3Zl7 ;J5r]5b\n)"y" x~DK_*>N5"amq/z .Z71Y^Jb'H`Gz endstream endobj 723 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./eRm_object_tree.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 728 0 R /Matrix [0 -1 1 0 0 595] /BBox [0 0 595 842] /Resources << /Font << /R8 731 0 R /R10 733 0 R /R12 736 0 R >> /ProcSet [ /PDF /Text ] /ExtGState << /R7 737 0 R >>>> /Length 10699 /Filter [/FlateDecode] >> stream x][,q~_G~y $ CGvk)O}E3g䙆%ebXZ9)+?>?Wb'>9)Nx!%GS8AiXOE}m\thkƢQJ}i>=%8z>tg_=>i c4!:RE_Jb}%Zriwj[MA}:({o Ƹ=`0j?;刺P:%O>})@X9CUEp?yY}Eӌ!>ӯ ?>O&BMEkm1)k: [u6mɤb@(nAD=^D8Ps 71UDe!=76 ^n 0)^"Fkץ}zĞzܾ Ou(/_>| FEMsTۓ7&O*&+Q2 Hbivm)&JcQEw>LC},!&˺Q%81тi!J.ï~vCi٬)&ZO?R.m|qAJ-u! #,RezDZ=NJDtB#ڵޣ\XvuX7io@-_49t !h(>Gh+yă\!MyD!a Ʋ`7(Ezk8&"h῾|^矾|o (>B0w(;P<0-t>nK%P(Gk٣\X6`10w Ͱ jh2~&W29T4b&bX7Vi#d[=vs15P:BEz8`i!zFhJ/kQq,Gs2nOR^{ tXFʦPh -l#WeA͆G)XC$6>F+/k[v|(`]-R6;(j AYA۶qS k2X7JXR8I3ghwȧyl@'ц1+nc+`.u~h ;}1)~-ޔZHyJ%Z M'UX v4o=`-bBaF@RGuNJ6_ϿnVKl_KS_f9 SG9'!tRDޣla~ bX 1ZnFi qe!|õeo7 K4X0Eb4VR)t2#D .d7uP\u>+$"Nv(;=QJxmTaPБ ;/ 6ZM(`jbX *.ɌXJGN]9ݖX\ժ8ϪP`rMmrX=Tz[@ [P܂%5 tL`i&1 ao4lT'Yӡ)c(4U9_a#+v^0CJwֽ!UX" 㟌{B7}^,,BC0f`. [~_c D~5o,F@˙%d+ZՃ|ؽu0:a(L(/!gx!E,[`3K{h,sl&\&5ga u/wtٿ; G-|͙$]>Ց|zuq ؄"Tlm6Jͭ:&$[+QJmTxދxuu>g$P8ޙ<Sz{NVs*άZ p iƯc=Hq[w]9A9ec@m#W :&PNOJ(o|:-f乳JmT \uaYػ&iA4\|QR P ¢OBB+۠乱A*6z׃o7]%MLBT||cì4Ui_W|~oOߩvS`K3 C>sSO"9j3n+9>>/UsNNe;rvr~dNm)bh`?{EH1@3q)9d#y!"3.rÆ^ٜ޵+Vmƍy\9u5,0xS1l/ޛXo:T%Ňfչ,G&w6.)GS??j?+\=}vV!Ra*\Pv 0&;-˽`qJh–p`v~o;a\vK`>vuQkAW: hBǘl)[TT~r@W(m|~C8GE/{3\ S=<K_ `//߿@ 6DC֤`.@€"LEA_@SkRӭF(m - {õ1@@1Є6})%I@yPM0ʑLacz?8UEvGk |õw1e6a7u+Б3y0,ݱ pDcsBq*&!\&dCe$`wz08+! T))chK䢁e="@EsFR'Ap8- &lX2=B9_ A# /x춥XrꄸNyS8$Shye2kMj6- ߲-5~r82r­x(_?|Jmhz6>%Tzd)%V7=Zφޱ͏keމ۔ViuViuViuViuViuViuViuViuq[$H.3 nMs~v 6Pp (_(u.!_Fq;/_l;a R{h7]jo擉ۯc j/na{n{l;a,ޡ`0\CfCjo46Jj9 4r(7!:.8Ik{7mFu#7M\pH1qRHBI9Vg5eK{u ІU(}v'=X=:@Qn*u<0k+Vs-YC.CW6ő=p٧[ \6bEQ .Fv `K b ne<DzE?-xvTxp uh4L'@ܑێץxP]NJSX*3{t!:J> [akp-Ocqiי <'[hE0p?qk>xvx,f9tT*.GjwHz3)ޮ"l;@Oگb5fkgl|;xeJ6bXn؆H"hbɻGeù+SE:<P[GqlxRxdTաf)f Wwv(#0 sZ ?2oX`C5A?*A~]@Um5MD QV@Rv$q,@ys]` 5ڈi r>Gq pW"h-|¢, ڷ.ϗsxM;b~=_QVw(]awCQp=`&D+5Ja,תQjGF ;R&3-8KG [X I %!QIY[bqz}2q4" ڵi8fqs[< t8)%, %q=iJ1KB)CfO#PY^, -}PMP2Lgr5"xpS1"]  $)] ~rDt9c;RuGए wv]Ӹt}{Xh2&^lx1AgGAc e{1*b\ϴҞ%K#\-˥h^ᬄAZyn, m ^HG]?B~ݒǓ3sX7}V.Mo֎ &Ь[8npRcY6E$3oP)FsVqlpB5s!@ڸdzC`rtNcbZ U/q<Ӳ tR4!S+P6J8(jC( 6M=dߺSmH3!! dC_[S~^ג0҇#BG[-6Ą)^8Mpr]¢T1 – N 0JP8p@;H i {5~$OKF D85bEUQV¢>Is44)_i.5sc!iT m\]Ty -miG;qLouYڜgJ-g5 mVZM"#Os(h}0Cyzqe5طFHC1_>x:Q Ͼ$^A @z&,!^WEm_@[htPbkFPUDֹfP);=+s cu`O>ƕ҇Fdmk@{udc-$N8#Miy)Ǎvs2:&jJ[sTEaja$Ȅ H&\cdSMC^E0rݢR~W/`ЬxݎB NPvyLWDc }\҇Fy"kyuc1W 2O,.Nr Vʄakw:M)q1WҰcgŦ\WVaЩ%(AGۦBPrJ SX4f,IH J-UPp(i66i;tg ӝa3Lw0;tg ӝa3Lw0Nӝa3Lw0;AOw0;tgxtw2|JzzXc y&XԠm H )sg!iD@ڸ-A;bF`C xO;)˞s1XxXT[7%Y] 36G}FpVMn}CIÔrMm0'+Ef ZxiaG.!5s!i \cl&ۀ$ƙss.!Z3gDp mA;H+iM=l{xl3q ԸMT\ %59Y\Qs\6OOd .pnr/HjRjXPN\B0)BTK GN VBk*5ƣQj+Z ~T{ucٖpOEt3h$@+B:@Io$W_ιc8RgsFm2u]xgzDPKH yEZ!5H+WvI9DIVbQBqŅ͜l/1E#2!2' yF^B/ǽVߚX\<8ҵR!g;k}˵QB Pxo]/R%o-eڇp@}K^; *ed}Y;֔k}˵Qns4,mw7xMu1P(P.;*cΖ8\8@ q>Na w(W fk}E8M@{?~.bŧ bZii`(kqT~ ّv:rh>~BIx]XSQep#m,mQ ~Fuv`0X)o햲X\;@ШuK퇱\{~p*^FFb#A fږnQQWQ n4); ȿg]$?┏?^<M ^^rfpd7:HBBVCN EE~k~{HvpEgȆ+l`ָ~AvRqGE_X |Pv~/:%!C($١\8dQ nE wɼ(;ogX y+v{tl԰;8 Sa= ǡQXP;+y˵(@6u5|=n]窏mAWbjG3MBlH|;;6x\=Q;UnE:,2%;֗'ޝ&AnXZb>@/ OȫzBHcQBPϮ] @B^7[;3to9vWQ 07~n] $4kvIц˸TҢn N4{O4{_afifififififififߞ|9p endstream endobj 768 0 obj << /Length1 1734 /Length2 13156 /Length3 0 /Length 14258 /Filter /FlateDecode >> stream xڍpkר;LtLl۶fb۶&ؙ1m۶ml|UTWu?SMFL+hbcvec*12T,-Ԁ6\2:~D ?dmRNFf##; m"&Y:5L#<(4ƆYCGsGFcCKBP;:rӻZ9؛Q\,J@3G9C+_T-+ۘ:K cÇ ,)Ze, 01' `ja ȋ9: M04t7t64401AEG`loa@`aGeQka++\_fmb7ZXQ-PRo?23#]f S/[@/ S3h `ba0YXC 4?oo f=F<~?^UUNCNqxв0hX ǃQ06puڏk;=/c|L-@ϐ02|1?.Gې9YZSQZYXm1N kTM,Vc,sb@ Gc/[fia Tqh}WH~l61cŘXnpM V.]b= ncpmunƏG2?:ido2s>?t-s~lyu&UAEh"N`ʶ(qc tHSb~n3Fx^|X>mvKQ,Jx..tcW `2U?P #F-֫]*<䒸otOn OnzXdipF[Ƒo^RF7,UOF H[N$Ek2hs _3cxtnyJxu:4AIECU`'^ؾgM(ZআcXT%fO0`Vig~."4 1>3K6Pt,CHUۄ ԧ :Şja1)bnvX*8?9Y܄!$y3b1KPRϊw?EdxI: F"OwCDžAC_4Alkc xlHm <,׼ KR쥝SUA -R1j$˪'ܰ޼ t}uXY%r+WG0\J=fi28{c%@,{rd#P>\_fbDư˓A1tONzmwe+(S O1+jp`}%wp<%IӂT<1L@ϝ=*;`Fo>Ҟ6sZvd|KZ 3 as3@. HR?Ojj[7G@X?wI!Ԅbԅըb!V-ir~+`4`6E*d@L>@bki~쿾Q̮@TQxu~۾-'<5$8a\FP[zbL1٘q$ 'ݱUG+FJ GTRs{)2cq/䴌N#!gnXдpptenm&vfZz:3ʛ"WtE$G>-q?.B%RN]64'+r*Zpï]w"dz -ۏ]gkfpUX;[F;Fn.Tk~FbךAٱ:@ΜF#)O#e->tx %I7'+~]0m/ێr2IkzAfhޙ}1QB.؀=u+q p|튶q8%>TuWQz\;RU_\K~R2q5/+ځE'~ShD䉵õ^qsfL$MDL3 +Sw)0v{FKd[R^Nג4wlXA_T kIeZ,NQ^=7TDIO@f@%af4wMgaKV4< -H*C1H>#h+˘k{+ۿd4ŋf' 8!t!&15A0"X}W')q3E$"o;ۣ$u-MUTK._&O _JRNnK(K'CğAA8P2tժ{ Z.2\/ e6MדҎ ŋ>S:LBjz7hF̓}'h;x&>ےjpA]!#].L!lǚ|:\y)PjXZK"c|hiZ#KyeRd`~Z%3~AeFnKBЉGb.hŏs1[=xcogi۶OeNn+WIߝLY;ݼ^Wug3p:NTi@,$z)~bjmovP|N=\=AiZ:d1  zXBQndr*[ u̼X-VhŔ+~n_)|P(FDG-^0r4oZU;ꋧA?.2>rۈٺ` b,󲅢3-64' +p.h7(.}Z #iow.T]SoNU=!WLԒ R* A31mq, Vaq`8Ow},Nx=*E;.f u[`vynI-_Ye~Kvzytƹlwź4kFQjq3_Z,;pA p)-$@3YARjC1psKؗxWš_rFA-mk6İQ?Ua['͎F wcjIJ'SxQ5VK' ݽk0vŲHMJ뜰TP=F/`;˿NkU&N|!C*[SR&4(}|}uPCg&QD7eev%M ˈSR%{0(K(Ir9l8*HeY~󧁌Sܝw?aPc8o7tC ށG~*}|"(u)r@`e.}Q77ؑm {|nHz&75i|)l>٧2 8po #/>Q2xEnd,N%IIg^o&;H (4:"Cyە!PyeG8hzt|{5.lWF>Z]_ˌGpV6d 1nd9_E:UrW37*\ br Un7õa򕤠b=ڮ Q N\=fSq"liu#3[^kZ[DR׀> +]gkx4 ΗQ?iZU]rbq'S#L  의;ꃴb(qBa[Y( Ld<{[{zۇ#'>y$K&. OG60 ^lʺ׼ ۧ~a*E[9%6lt&}e8Dz8+d+#sA{ Ꝉ 9cocB$F p)rSb-7;&6" n̊[p#;4#H䈰uY Yoo^VqRFjX|Ɛ[\HMn)H <+D?0snUpg><-R00倡rGMx)$5={Iy |'GŤU'm`_Ư~}ŬŹBu)$n6ΕN wW_Nk)a<@A8Yb#VHpʖغG'N$>g?o {nhC!RӒTw;#F5Lh|rb'[j9]!$Cäza覓uSxKB+Wmz~H|}*74"zv'P3WCU&?X!AПG@#e.sy[g9bWTKOQ\$,d􇮫zp]?qo ( X+9 P,wƻcfIk5K9 Ժ4V\SXL썿A;vCÈvJ5GK W.]м35@Qp+^">(-uvyA=mvAvRWATC ˀS{(1/^!FHM!7 Q0a|儡l?j$2PC%[ ɦex+my|i_Y*< dlVXh)r-z[Vr?#t|SK_PKJʥtjSTdnibnA`g\Lpp BVVuDti?Gf M([oYB-N5NƟV==+'RR9e2̝ %xؘvC|dDѐ;cln;cpi[:A2$:+J|fe0twI:_u^L%*9#̐\`@ߙ *SQ<ˏ5:+y/o`eqL~|l) ؍HbNfQ;%Aml:[6Ip(9"g-ۦ\'*$>$(%Z1_?q̲>] vT ow)L f%B@U0q` R؄ .i+*%L,ԍbXdi{8EX0=C8[wp9Fe3oj+Wt%qѽGTZf #ƏYIA>dbġ~Jd.8WN k6j 3ҘC.0V!Qpv׈ rP^.x1ه(a~yWl?)dK=okL!7P%s8\g8U7~NGQHf>jB@Cgt^SsAmhh4P`mEh{ 3cԷ\;7Fӭ5m]"ĥhL.,|W @ $\n&Iy`Oho"#82krJ?^~܈Fxq܅ըhlafנCzp|Lz&%lީ={iQ([6*pq;dvCFأf\,}0C\au ׸Ṽ9 2Ddx8ыti# >Tu!ɰ ""Ȩ~Njoߺ4HūN;c1tj5=.tf}U'B!{2PdB5Il74ej?kIK$1HB)>%?? zR4WOMԂƛE'iտ!VKÁGRgmIحe,aA͇vZ-IވC$!|tweX[(lPՠ%A+8;lj An'^T8\,Hy#kB=)ίZV {JVtnH!vz+\;]CV =erKsZӸl<}͗e%⟻$4s>.f1wI;`.đc$';w{uj/$ ! p- t9g< )0qKF9-Oa|z)r Sѓ>I VܶSQx>`n &iJ)z5 ZΖHГ<2f-]|_7ȍ'M̨1\/9Jlsm^EAaͺ7'UbpFNDR=Сbuѵ2OP5ZدȦ{|K m[̦&bԸ1}zRE*z$y1'ەE]JQ*J{`RCCǥ/I%g?B=^ 3纛>oQ34Ɨ3c yByꂈhp7iԇ 1VN&)D~=I5nV:тŤ}W] bU|\(f4Nק!5 @G1zzm{8Xmjg%K*ճ# 6Rri1 \0]0/5FW?utg'?av5*; 繱^ITQ_Bـ}% f0v~.<)\wiS\V3H`OX}1/.if{^O"$ӯDXӼ33IJ/:1J+\ǠA$s{ٯFN@Gjn_ܴ,lMcޥ:nGGӐvРs8٤))p޺{ccsbσ$O,r:rU!x'( ræ5FwRYscPwGV]g\GMW^Kr4ksa衉ȯPs]<ΜKdfp fE\Րǯ.y]ݗDB %4c0_@V0[IJÚ+pojIhaw7j8q{nX\Qe*( x';~ tbxiR,--ljh3/hPtŃؚ+,V1:37t/6xS%;r?wPhE@`!ɝ8mU9*ܦY<ަ]M 1մ!  IW {|˖2uvdO}sv[TV.wtkZO GuI`AF)aϺmnnw ~H.}2ԭ"Õp[۪-XEWTjXvHBa0 64+@iDM;0^|gc-'b[W24/8,|w7*gw}Qw@-X^>;eѭmE%=-ElΎUtN xgU1aq2:ILݷ1z#78a*u3a(tOi1V)rLH"y)CSaSu!@/}k[W( n=σTaTKқqf6qo5|Y0Yl.ږ)L8ʩMYJbԏHȷۓ=3S꡿;^= Cg~iK\,Ƨ8w$u@*VaaQ.9R35DF5$yn) eRFD3'a;PC2Jr.fe:~Y~Sg!;Rf%q0W#K,:*mUd ȡI?Ii +:xԯM8u4ah c)åˑByn =ԕe*D} :Q 0.bZq3ӨCpV=}"ڙ 17Tw 7x%#?/3LX,~ hE͍2p#&V?lͭ1'] HJa(TE1Îs-VC,wg<\ Okͳa5"йp@+cF#(¿:N q2X>8 6f ij'N0reD \)M9fT.YwD}|&FH߃i=⦴?~>tk}-ʥRn39oi~]rT6`iS\c[]p8kiXg4U'Tui[#N(^4zFjUWf5:L@Y+beScpoB:dWH'Op]|Svyf= o{) endstream endobj 769 0 obj << /Length1 1702 /Length2 10106 /Length3 0 /Length 11192 /Filter /FlateDecode >> stream xڍTk6Nw4Cw "  ]C Hww7)-! H>//|?nmZEx51s7\l8yA (ma\$Ȧ6F̃}{Lt~[7{ 9:DM E!- w>&qۭh& HQk<87v*: b_{AʗF>mT+ߗOGiGe S@g..rƟX|xsGzTjqtБS_L2xK%+.-ZsI%j]KBU43Џ 3sGD+G:YVXh6saS?BjLzϬ&R]Evg7UAٺyzd~0Bv'|*p73D54NSm.I)h<*Yk;2$Nx$"sU¦U%$kt7{hǍppLIl].̬"D6`}:&d^%UDlE ?J'+l;1<LjLtm]]eR>Ul!bR(_×˩t`*n|v"&^'VGp1d7{on)5_<{~4nW ۏY#~%$ ZF "\2#_S`| |Dlnu=Np-!=k Cj q`5IHǷԊE̍x3!/#?lD[C*M#ǮUkRکZ̴0S*eYqOBVQ#cX?W1St`}Ez74%$+)5:AOwx )]31~6 ybQ1v!vtXaY# IhGAF)8܃c PoGvW켣lçP[Q.MzQN1A،y}1k4~gy͂k<'#mL:HiiLZNJbC?ӧ9E,gQ$_VŸiV %wyhcHP/cՑ&pRո H=J:8%*2} Jr# j";q&U& ~_2zL)K *^^?F&Co1qys4e\C}9]!w^ bԴ1@iNXPq~cADg2svzDk4Vj`Q 7!Jʂlч7I?m|'\ip_ & 3:,hsGSWRXŜ3'Y1(S }X4"d .i~!k Rǀt'kupILÔItRL{#Q>#]Tnu)Uw/Rqwd:*Q9LgaԸr5 Pa'>&_yH=݈ai Z Ǒs]DKIRgnGG'+E_hY*Zv<-QE8gG &Elte'Vc6U!i Y<;/mPҳ PWh@vXZiv?Uz=r̰uζkUȘar䥠whmL Go>V K2F쫉;Z8&ExҞQ.mo-pӶ^VIoa.3;~mOsx*~ Tntt$6WLK:t60W25آAlc0ݶk7yf ag̈"okmMHa0rbvn kv3I z~D#=|IYUH#d̛8>m6^aaM7T./;r'4}GS8gjŀ`'eNq]Pf2G"&2K IW"of[J<:Wv|Y(0ViW )Sr/*iTRYvy(1a6GKUXUcZwX>MڒܴD-ҡ+4>^n}4R8P,mQ(11\[G;!ˆ%'w MV8,L<OKffaE)Kh{?]'2>~!KlMVoNkY8VȊr)`'q#_(@T@o @f~yr9wQb 8fzMN`8;}bs:mVaŸO7+d-Tʁ(rc-;0Wu/V*BG<ڥ G;啟Gꖹ@}IBI?ĿeR-n37GP L=7}b°T 4DϨgLE;is|0 j#?~5A)AAlr_uAwi>s#!": C +]B \84RJg fwPz@JtC,}06%`3: D^m~-aV2]FI`4%0gtW ~7Z(uYr#)o%^hDV)諷*&2zzBMEdz!@3  l <p!2:f QJPfyk^G,2"%NuQ[2Ƥ{ TD.dNވWNFYDؙ+*,(t!>(J122 Aɞ OmǺmk>Jv7|QT ˺WL߯ fOv [Ismg?fLv̞";Gqj~9% hH`d(X IÏ7K1=}^^~7F^lِ!/ QOw Mhy!z-?ܤo?b"9' LwarVo+̥P/tBFvCr; TI~9-|2^Ѳv)iFUa'vZ=Ӏ~qLx]y$~$'jOf1*>@D6"VVo=ã-O> c]M4 (bS93ߥ%/fp'͖Uiib* ήhح.;kS2عi5f|{Lza%~ |vy%~6~{f,̾jAxep.U?W?/m+EǑNjxzrU4uʲd#iOu"ۻn@*̫%_GGpγ;a)֣.v('4.QK1=+;ҕ7>lrG::=odj]ՖB^'-w7|`}2Yl+.LXt1aOBQg9֒0r띞׹*xq&LCTܲ7 iie:&7Zaݯ%TipqWϫ7ID>IsgE[~/eܻb8#AsLzT|5梇\:u۸s| ,#,98$K*ɀrmB8BPeP[|ZVr@ûeXO췭*iH*<410|Όh99֛Lm_ߩ6&SR1=2}ʮLSpij&yVNѫ^܌->Gv͠lWy*/jўUZM3K=MT,= 9L@tGXplë3Y=gxlbB$AoQ|{Z~9#vjFH/{_X5)=S2'ZfQv4k5 !>~6)$Ukufœ{CKLy@6Ӻ[:p/͌+#R ;opDr%s_!7ssduf3}iU `3"C_SR#Crc[&`[UjCǷ4_Dgaν^&KiʕÒG_y?C#<rrR@jL^Jc11WAC1e@'J`tpvnjHj0V&7GW%7ɇx_4,.,wU#&4f:mNf[U )KD W9FdEhc' .Y"佥3z,}Mr%.5S?I{b<ɬ m(zβ QiA0Ӣ\|S},[V[՛Pa]Q)r&;xa yl\I@lбr4xϯeE,X~Fe=,K$9)dU~.ܧl 5]Rv,&Vʼny;,ۧs򺓈V b>6鲺3oR P2fLa' 3%L.OZQ#|8Џ[e4%z'1\^`rƋE89`l<wr8| #4y8j.V!RWܲDP)g7$$Rh*!X:x!,n-~.5n ΫYpah_wQtnjD|I%K8+q7xqɔ- z.}gߎ6[% Ǡz9p8 a~ApSG=067_ hKI}q~hO"6'Ě&=Yd1!2[Q4O]ipECλaQl>###bWt|sQG_~Go]MHn7Wh} `uq==sXb 7ew>:zWR%@SǬzIĜ/b<ɴ|ZԨVd/i]$Gf_v,mPN"Tx 8Qmd#t '60aY$ 1R2q+>z\\Ug2-<2{DŽ ¨&3S)F@!rQ\5?]gAղ-#=,Z79Z< P| ۀ^&CS56r7 v ~T?vP[ivY#Vԇd'p(C(f椔+;y Q\ M0!Gs)Ҟ'YVغsT@T{iǧsfr onʝUEdnE3y\us9m+%ZӞ͐* L^8It%&>k]*9`TZ<*^o{fɸL7td9v̒0}/\=4M 6ƻbQ p:W|\H?LA],&D̛2-BuTS,aˢaN΅.,Pb8QIO *?萱qDzܥb{9-ţL xR+0GWJv6\B"vkͪ)R TRWw.x|lN.=TXJWD!m)ʺa}OWpIxgnn~޷=/MK6=}9N$/xCNj,A@;yR.kY=P|U $c.=xhϑᩏB~$OM+U[&IqcgKU?OSj7`H`l1bt3+y~|Knc l6^o͒~ D-9kYL^g **l:ٌd}tތ؟{]ﱛꅵ`!恣bA} npGş&gWW97-j^a Z Wh4V1wՕsJ SL)__,fj̭7e@m{JÚlC%baG ̭16T0FJՁ9)ƫANצʲ { &Aҁ endstream endobj 770 0 obj << /Length1 1901 /Length2 13856 /Length3 0 /Length 15030 /Filter /FlateDecode >> stream xڍPKӮ. [p [wssu==$Jf ޅ * `bbe`bbPre:9[yuČ]AW[3+ ? '@ :S<,,]wO)5a;=@h-@djtT|..< v ' j:%@ tr(`l0x _fUn2;/p7:J@h I?Yd`lieo0%\<\f:[) ! 0~M\l4,no& ڻ8O h~ꞌ^=os+{3?J0su`TrtJnft311qr%<:0v9KZ{;.N@_;fV.=?@杬<L `?_e'eUDD@ozVn= ;YVZi{s/?}߹@ PzLL?m# W[?T?^c;+[Ͽ ߡUhfj.3 loaCr)YZ*0[+{@|Sejh8. ?`d ~f~C3ǟ `d/ 09qF?L'Qb0JCF(g!J Qzϩ!w2w0qnfwd/!;U[ E wv HHп]=IceD.}@:2e8 W pvy'W㙺:+qax?x h 2 iwߟ䟣BM B][8ee}OVh$'g6iB8z5G@V.\GW.d<{~I}jYYhyo&Y 8.4h<>C˙z#I=a-f}XڨPcq%!E9L^.)\\h+$AK[Ga8dɨRou_d?#ЉT0 ݥHxi.[:`{ IT>Ӎ-@b,ዴ,Γ934)ظ{mLŚmogu}YRᾡ'ShAU,l0ȂKsO|, & ? T+[m;vG:*I/{q\}uV0t ?"] iÜ`&i}rF$v[_b z',z|$i8)|Zj{<AdLTO@'s{uߗ2X 隬vֶ1x~{L֌ttߜD'k*Tih|Vͮ1O@&3wL\]7DG"HƓhs{ +!VN?(qkq&u^ݳ_QryDڰEQH,_P/c _#j46֋"jOVA9ɨ`wQ%?G6F C(:4Ө}=uA>_\KjCz-F4ޅ6hximɁmj@=ں"UB9ƯƟ%nj`:p~#!vl`Tu-PHPM ) FbsiԷh@O` d_MFiSsM䄱f? +rg.z B񮲹@y8Utmʉ vǻ"Fő;UBδ>x٨vf_[xc@sM.N4m3 &JpaS3W 9tsC٦Xpۘ^OUnCb;vWOdƳz!WQG(to-/Uswp;=T8p"SMԢ8晃-G`/sCObǥ(^S:Ը`{((9II\mg3|/rva\a?|[(e`/@%\ݹ)fiP9x0ѻNYzlނǖ9p3xĄnof z+=dS#"߶w˰dZE&i;AeZWfqqw{0KpvqC$ :9k㷐7|nSDbT3fStDQ .-ƼQE@DrΘ@[If|u d6> ML` 'Ho ȋyHWN]0#` r+<5}/״}-n)8F̗xMM7ǂWȜ'FkhzJAtۚ{#[0r.m <>6)ju>D& [ޛI/hZqB]|l8O./9uL3 +n rtYhdéS&w XE esOK?w?B>@m]+ @6 >)1Inc};gct0-mVb]^e *HǛbSa^:ߛe qS,ge7鑪S80D> eA u ZcbPT긹 Oi5v1 Yb$j6a5lvkӍDOmdoTby!"<ݞc2ZXŻbv6D9GKCfω vK9\rmՓ3@%`zac0LzG&AZ÷ˬX/< V\xdnw<m>A o/|D E%yDMqOEUvŒL=X*ڙGR!0y+VD#i}҂i!E,a)y=,@X+k #0~Vj>)Wzvq2 aJyyD󸮁7nv8'Ψ g0u@1YyB8;Zp{P] M - C% ay$/_ wOJeG#/}Psc`)a%·CJ`aBoZY$޿WxMJ=\$ aH.#$Q5xhu(PQlS"Ɔ[^D#@uFNQo4buaOdAq+eqDDH maJԍL-8Ѧ: Z @~eO B"yR׶l.J{;NmŘj=0,lMTX C[#Om٩Y:_6M& DHbtErϙITe '́HIRVjђu"#sa η{ ]s!7&nm.3}'>?#+ĺץD_512`1c%ڏ-񠈏"c97ytl.qҮ3luk؇b-{ܞI{j-ӡۢ%c‰@(--8WXf老K&=I墣Kk,{ݯzdBh0Sv>_Uh%Rѻi~v%}:G 1E&.&ŴehJ%94aAE; @܈;%m& ޔo`dYPl&pFw>~VȐ Vi,*0q!lue!>+[BܧsO]j;Uܐ-W(>z@)Q\h|L Rd }~1+ K(=uK5)84))nDz;dTɝj[63>(a@K'dlVwĊu_7Naoe%W4*ft)Cv q~3g>?<3 ߄)bҙ쭁bY?!G/'3k2R>;.@aq& rߪGk[>aB0P]ڰP!8J3RFB^[*h(eW8r,j*=ɣ>~y>b6oy"F-3* \_Ι1[ rհ">"zci6SSf6tl3P?'yr[t5A>i:ׂ>Ʈ8' B'LyDVwS-H@f*Ned{:msy&oDVcrK?uQw=ݑ/%\z&f pDbL 冮wd낄ZpiV)Xg=kgfΈ6ᄧQ5E 1dY! ?Ɵ%"Kk 8\f:[c0Oe5EUYlW;9 fb߄۟8KE_64\ ^}p(ՐlzH~G"Bm[I>l7zM (@KGjsMRR`\qoMg r_֗Kʄv򏦑O5L"݁VYk~N3i$B:JX$HtZɥBuJ׍?6VNc4a" 67(#pzo*N[G˹Rh9z:@CYOGrr?EGqS_EVNb#Bn:qƮT{Dry =*s^ z*~W]d8V#3zi)RtXA`k4F!2ia2(A#TsR2x'+mI6$ѩȓUé G۹ 54gQ(F,Q!%P~QP'IlCKl;#-LX0-[P 懬is]m[ Bzg蔈ˉbz[ y'83rT똻r* ^ʘ3* #WH.IF8ه-fր*Ydv?06k ^Wp{]im8pkѧCi:Ur6DTܓ*eס4ojݲ8qT:~s9h&9<,'0S)]_hۻ>p { r"Β 9iz{efKhhyzUO_"8|I]sR)c aw= 7V[*=T%gi=I"U沟~{g5W fh k!wqFC{k6GNfsz{dg7W/HMJz7i.MyUcl~z ,v$MJDSff‚ь+Es#á/ Pr*9,7:VN:eb; dh忝s1`2f%WFLG(k- :9K[P*8FB*3W0g_7NU,!B wܠ }+qSf6Xޒok?tg?逾:6\ !U/jij;pdlr8k@Q`eǎ4o[ wIO/__EMZVo~LXM/Iw]*1m)϶+J҅ja^e/+%*n+tHD5ס;gFRa{>.1 R _It݆Ro±k%.Wݧ0oJ ͪuGex+0Kwʴ -ސ*g}{3gdm9݋$6$[& +b&0|(>8 H&ԸS/$^m7ތKء X=]|Ou,d*S*aW]=sT͛_(kj\cp@%EHW9q[˻5h.]/U`"_f)Nl0 Ʒ?Ŷ#,+uUvQLur3QUp4\\%UJWdI#S-muxFė#9Ip*ÔHyy^B7S:* 6I !N;eDߖo\7̓w)dbD9-umןiM:$m,3(-dE=|7A\xuhP֎۽qƵM?'oj<熯s ['dk .2Js1I%Yɮ ~QBW{$HmLp[e0pAG7?lmH 6W1 7 *[ڥieK(ʼLkr1 APqd}l2 مp3E̽vE 6ƛU!pL |aeV_OD1` ֝#@?B_Q7T{ΖAEg"bMtpޅ> xOP\\q pzV\ՐyFvFwJX"!\ 3]Bʋ.8aIt@c4Mܳ %n* WT+V /,0 ܠ*#\m:WnGX9'uugY+ḏRW0㔁?>`x\-vJVIdVl-+vFoUlcs1 Y[[xfO՝ q?" KoyTKm/MU h-ΐ&yq$k;:~tn8@Pa*~?pȑTnVI\[+MKSX1>%pؗļՙ;YA+~ ^SGC_;e(Hӷ$=W^#.ؚ/_}K zߗ & V֠LTFv{V MP{p@)X3ja{MO`Y α,]Ekz(|.nQM@ * S$g,jƓ lA~D̺<>vDl7 9oBzx==c̋ȟUٱ+|ֈ; HcN̠A?R*JabP¡ډV?6.;o C尮 z#^0 cOCGL,dP^"]b ކ\£93 jx9jP[>[LʛV %EYQ1W \B^P?QͲ_pn]oC_;J.kz nhkT=yqHS.PQp/ u ͨ\/lOd ZwGԝl;@aM4+K]D(MQQ$wqb:?B@Hp*e'FT\!N|tLsr υ ɷRF;=g9x6T<):?h6)ˑ(yߤHYUZwʖꊶ@qZIĩ<n UiNl _;\*Q#*p?*^vZj&Kl]%vWT "y 2Y@xP`;tդ7]T7-n7:+d[ p!1 jN(ِ(L;T_@ T;``.i9(g򅃎}@ O1l\ :$21Hߐ"a̶pJ~|2<V*ڥkE"K0cӈg* .|9 R`hj*v%o\ ~:8\d)ǻ1j[J>Kכ xG%Nxff> DWl{^ LW5~gҰqCb}(L% $4@J?@CD0;ow)nxb ƛ|yiI|_g^05R4(vaw/W-+妛|.]?+[-^?olŘ#8e".wܦ #.5( ɉScn"}^G]!@n'G q ]o uRʉ0U82QʈPtfs#>R\tt,C3l=;g$[M'tA) %)kH^:]x!y$~u`JI̘gUY(d]:pاr+gos}9M} ʌ%+DR$j۩7_$<ȱ4m ny,ev!2K^JaOҠ$H{4NCX@ZwY_R~$}Xp&v̥ jˬkldLUrbݜޔ嘀,`'tdcbPI 77z6EIQ_ӦZX r/^k, 2RV7mDް毇ܧF<dR( ).;elsnt̙GYu&:-|!ƑbruZ4Ę<Y' U2EHutu){]+’ؚ'k8.U|ۆk@2ׇK-J>MRSx-ȴ'iГo"`.FIA;Z`dK:|Lìgu7ٛjwWtOgMJV+@ckP"VU dWgaS܉ zxR?G& `q*ȰT̍F) ,J~DI9]J7 :ܰ栩aY7M-:^N FS fCn2*Դdv+dOa'(f;3!>qj9mLR0cƏ4Z9d K ݋"/0Ӡ}MӎRwLȲ;֑K^`,Ƴ:jW#*nHB,`1\Ɉcs, eFrPgۊ 06sd) 8k?`s|`N7  Ȕl31~DE/*̜d<Oʄ@۫GԳa!SCgd;.Xk)ᯎQ-:UEٶɉz=6L; rdz~+ThN0`|߲{GގAeG҈>[*= w#Xs3rbhc詓GLڍ">S*~/"Ȇ~Hw/i}d%l*o}NY7:i+u]`}8eBX^J[V4 ASP<,{oI)^+bhWD]Lkan/-mHHN1']_I!{a j#\]WmB@oN$*_F/ 4 NPDÃrd/{_pJ=UA51Y$&ME7\+=d{TL jF" .F;Z ?tLұ_o:EuX| DcJ3ʒO~gt 7o}65O[Нp⵰_uԭHgf*3>{gVױ[&Ȍ WL,J9h:uw FE: +g;X O>r (#[ΠT2F]>L `:N^a!k]'GDYmF-d^.bL;ͬM2woAWQRWaN+Mf4;M[lm1ТMhA wp 9CL4OJc_!5:U(V;MYvO`H9d:(8hA~xV0iQ7w\-=V`Xn#TO+T f=#۪7kQ$$='WQ HaV.$vﯸz g_DZ.KEZɴ1~pWTY)0;bQ+VHCM\a}Ebh8523h+l+p~*(hLbY/[^ܱhis1pA5P ɣEY#m:l#mϹ9F^#oI&V?(v@_wxmPS4} miA@N< b8_GkDF @ͥ1(}İYO]|Sd6_+j;?v $S^Lm$9ȍ 3=W '5GzxrPaɍ8|bM<&2D JpccG.{ut=I7ŧ@<;sn(l)lQuT!/8Y9DwW%YR4LBӌ+Udv jK ԑT78 [d |wx)p=л6A20 pȾ[E؈df羜53sj@}؉ZZ'`y(. [0!4 ~&[^T B endstream endobj 771 0 obj << /Length1 950 /Length2 6873 /Length3 0 /Length 7533 /Filter /FlateDecode >> stream xڍvUXʲup .!8fp .B {p _tUZFM]duع9<00h `Ё:A *1a/0Pbx@@N.B@)[W  bkmo7Pjqĭ\ +P(^:urHq p^ęl`0g!NN_!W+(R ,\\@% h8r`?mes'Аcn _?7㗦NP;BJjR$%<@v?  }7*dyP🅃ݜ]?dtK fk 2d?@sG[CՅ5r ?'d l]em=!`5[ O6 qqBԜ\m×Ŵll-WחGMTjZAo..^%yھ0y!/ڜP'K |-_95r~N@NKe 1Ɨm[پ4xB, Nv7cS ۺi .mnwX(UY\%p7eף5'hwMB?#-qgZ2z4tT zsM; S쐳C/ :A}[$%ߒ"NoEn©ݨmipsb0-IWJ)T1zx7bۃĿ( ڌWqVu$LζԫQiqkRX~L }4NOC{B^~qdޗaNć1+;,husV{-DX7e)Rq-y Ҳ#ʏAdam_]oGm6F?C1# \D+מ5nͻD )Ʃr4Ls,|x4kLg}ZGkr~W;V2 yO|WZ Wts;@!d*,v&š?fbҒC?܃kV=<)5@~a;(IӊߺfAد${)QsL(`έތ]dIˊb<}ՎOCݧN\cɅ^,LoӽJt9.Ngk`2~,mߒĥ++iv~ka/u&;7sd0і?H'@>Z2>RT^pϒe5TZλ4*UVGê챵@Rw5=L} rHQA?|Xh-*A>Wuf[vP'I enanf0Mr&^8irt0tJ޳h76g@i;Mq*GrWj]O61~_pT98f; ]j;{G_I\!ؽi88RPB6F1wm/M#!N nrNmk$&1@K\Q@S&ɽ } у)>%o33f*ֺjA.۩hԚ^vk0C[q",if4A bָ<)[9Htx3|@ϓuAv\~JzAyaB(2+<tNN_ nX [QX$Xbzib6dEȌŪHZaŞag1a6_)ڛv_]fw.ɦZoCh0~ӏvdϠ<V NIw=ThY RֱD[r nfçdN(:w.CM:}(z6<9۬&0|*GOPch~;/>>}fwR^zSJ 2}8ՃoRX?Ĝ9qܾYiѦ$YYKZM0UW)5lggκOQl7b-R11Ǐ^cTЯb1&ӡ EV1 Z FE_fǞ6 u#?.{~; 4\+\؉K갯 "pGs/U> (wckqHU))s0: DHXME)DTС3-gas>E,A  ~!5'ߛH8ڥHD-"eE:M/<-v2(r;j YLG7aJj! ǂ~gƧ#cXvX}vw?X_XX۝Ƚ0Qt1 <*zw#ui [YV^Rr'H+HkWqh,^!kNSaV:n*'Yd.iJWGIQTRvuwW62<ӟax_Abn".GƂrlG\y>&pUA3ogaDkerjf##1v5v ew%{ Wٴ&y R2qIRq;"BĀ?%B!;e _tNyQIiX*Zɬ9sóvխ3 [ǘid,RyWc}st JJnfO7\ 7ּ'CŚ]J3VJ^b.)+92y R;"MkI #XZ?qxR *3gV٪Z7#tR8mWG=`~m`T3bm) 4[-ѱk&W%<6j>0J;QК`1nUF UxU+FV¯)r062{M U"\(7R_[JIܞ쵻{.an%nCПhx2 ЋdCH~rFEtț7v{Kr>\&g,5Z"6Zn ]HYZEGL@r:9LۺW YT/*c[upkiSf^4%FNo@s3b%Y컛/6 hӸzrx =qs锳. D t\n[f%%VcA8i,Wg oᨧXH]~&ӴA%DG.o;|N2mL/7TKVJTn 렫v%hU?% wLiL|a>LeTi[Zx^.Ct}ؐ=%ӝ)ȉ$'AEGi`n$O3#!RTpOBgzmw̓"G>C TYLN݆-bZ8l UYɆ­T\ ^ȍgZ^ڇypĉ ve2;<KȾauGӬ 0Hj؄FB" B<l|ƣ978z1$ZS*uqwᲱ4 fsLE-bz 3~F3o@`F<%?Ϋ`Ekp%6D+ƆUC1EN41\Q8ݨMvV9Wh h{4iE잸ݙlS~w"F: GP"w+5H^}nN|m٫bY"AG;YV=-n#&xwY1 o 4&AO賓3\? JaEa\>OF'[-@M s7˶B^jDnUGaːF?X]4^EDΌ@gQhl xB gTK. ~Űm.°7g娥 'wb4 W,s7㆕,|Zoי-.W i7D%e^sgڳ`XȽRιēkA6/WH@'DDބ}y&)ASH/Od<\^X[ɡ4x"ۅN!ɚwyjNäwe#L~8B[1KlB As?ŶնBjʥ5J>txtΓ9tXcSʼs]aǎ0srh3z"Sp)Is`Օla>Ih noY16gsPA#m*:0r*KThd=b#Hu^˂~ִjQ|C(>FoxoX-đ͸q}:giR$j5x#Fh fzc A?U%1wkn?PS?4.QS_TA9܎W^;7TM6=duʔ bK7DD4zp<hvxO5$+>.c G.)M- g:۹V:svYhܙaZŸM@VkD b{PR'S":>ّcSx5b桰'Yu]* Kh5uqoHweCtMA<30p*XNOݘ4՝/8;~h1- n8U@$@R[}bGTF$x͈3Yˣw^7$o)m\s4}W;pZ<}p6I5$߃{)|ߢu뢦)FitͻT@WpҵoW:OCڝ5:~>cDڡó&F.ဘq8k_#Z,-ٸS›c[HG@"Rguf*JyG!{ @Umٶv-MV }K _1qKtB;gbo=T+)$cb'UH0bE P=[+68kzљӅ7yjn.!<5]ڎGM[Η!﵆:CXә}QµьM7IJ2eW$eim2WnK(eް+ 4PH )i Y!dwѭ[ >Qn g6 O\[MT#'f^yPDY:Gݫ{xyF1N Ks((+x[1%[ ՝>Dp*|ͿFgN^\CȾ U6NI]2{A*_>7?~=y7Oz+Rz10<]ǹ=D2HB4ah\E'a!֭)_>' asM1Y&`J vxrћyEy-Vz=st+KSHWLXؙQna,C)B8 KHǃrE5DChM2k$D!u;!؏~^J=Z:GS fHxT Z"=3Cnv5pf<αyN7|7oR{ow Vڶ@ "Y+#ӭVɗVOFB0rF퇣[-䀤QfLXrox ' > :bPB{A`{CYp| V;\_5qnA^[d igtTF4'30Cp?cKLUѱPZrNoˊ}zefS . BSϴ,fvNMW.jK}R~ i>pTeT]r  endstream endobj 773 0 obj << /Length1 1135 /Length2 4001 /Length3 0 /Length 4732 /Filter /FlateDecode >> stream xmSy<{YJadXdϒd143Xٙdl!%;e͒D4Kx{{?<9|od"E4Tpbbb(G ; @  ah,[r Pb" #B0)" u<ړŹ@Xvv!(eth0("sFϾʹhp%C7CnC_7cy5zu` )E r09_IhھW͌~kreM h ^cK*.? Gb΋H3!L~Ėj IBΘp1TLS^ҥFH7 m`GaIP!ˡ}ÂG+֗|J 䵼k2{kjydiU0O <\[7#Cޯ`T=n#)~s?@azz1c]+00ȓ٩BXn3ݕ^KLd;fgzn!=Ǐ]Vv9ؚY% 647?>gC_pFኢөyptj}]M }T ҩÕ&;G]=; i9=,|YWS󷫏A㥅ωbn l'pL\[SOyAS8T]=x$ӯqLHtcV!l.]/00H_}꩐4+: ~O1%fjY6㽆 =D-{^1ڿ)VwYɍW1GJC\oX53; }o g`a\|^"z|w i3f֏NA5ޠ[ˑ2aVpuFoVڗA:h6ng!7ǧ☉:S%PsyWKC>Yi21MVAo2fH~:QZ ]TSwμ{[&8` (=9NΣ3N!SO۬}K~f9q-Ak^?j1ܮc!ӕخҼ%Ǫ)2T~Q3-8*޲mN>ak|=Gf4YcqsfvLƣYRU7OW?ꈬ&#_2E:`}{+]R7_GϠڎ-\\$5 JV4}*!9mK߯K妎r#6 e3`^q^\QħZ!=(M?$/g;>.9+ Y9춻* 'M]ndfID:+e0?i*AL~ۂKă3tE_`V7݅GSR yG‡F\Ud?"εcyh^صpq:qn.-ɘ&W}pOMXn0YS>rֹ\=H#1>7 d%|OS_Ҧ=Ù>1p 1ơdnmKUÛVˮ\9Z<%;cC.c}#D1ѭy;鷽>AhKwҿ ɲ'+wK ͪ@u4Ӄ%z}O:VLΝzj`~<\LM"Rq_vVp;V1T8l3=2fk]w<**!=S_fkҔs_3``CgW\7 '!fס)J8/>^;J?O9=[ VQ~f[!k5Mf5kXfN*7XT\m/IB -0E6a*݊]L2RܴfW3X&2J1 F%msܡYC. 'Fo4PP2^нpS̥hv*fO7Ms4}r,y{F]MQ%4SߐT_u>Fɋ7ɮ 4[`ܿQ}±V9œk/ 'Ndc`kIJ*a3>A#5FXzvۆaJ xg<`Q dclpyݫb =ڑ,j;ڢ]P<0;PUG32JƁ9c7DT.Ep`jv2 }*Q&8DˠOT;,zSs5x{b Q lV%s/"a쩲O[n5Ҳ_]Ye+jaBy7=X Q^ȗ }{ թKh.ܤʄm=OJLF+)_/ -tUat^CRͺlev!r!A9ʎOv-~kMVY#.632\&i]m&.cTUt6{4^q{>ndO ]JR98=DJS[œ*z<^>hWX jUUwm,,\RH"ݻ]ѣçxRE-/)7`42Yٵ-s;tWTVwQOYre:6b V@F(. qm4t${#_YL w^'9reb,o5z5բ$(}-ˢ xHULT,|K$&y=XfXҝL W|ΡLӹ$0Au9i2R۹/fM:UhMnq5E4>8hlrD\gXt55MF&#u"$Cqӈ$\dz,$G2%;C%/ZXΎ_W|aҪ)WkYhd]SM+uzԘC%S^[ܓsa[\TO>H&qR~}&AĽFɚq;S7ݍc2wrm9]>m7\Ԓ!bUBHFc;|&RޓM/ae<(yqx6k X6[VGAnͿZjhRMp!,l!X5S1S?.oȻSj_eFa_[qbq 'WCoqW4sC`[gw&@PYFNu D P]cFqB-i Gdy(jT&.Z'%V^DQ]>Ikګ(,=ec,z\Qp~r]f>NATS#-[)^$|:{'>^t==WA{oJ|9@?[8A)Y (@QB;Iھ]رɩC/mNKWelFR|owmS'T6kT߷9R{7P/XwZ2u?) NilW> stream xmSu\ܶiieFn$Kf`a$KBn%T@};ki UF"B I3?sP @ "vv}8w/!G"$ ZlV;TZ@$X DI`(  + =Pp;ZOn1PEGE@Qw/H$.KC%m\\lP ]>%DE]@@ DQ{8CB@Vh4%uuA"=e ji+#1@/0,!D>ұS H?C\G?sΥDm@l][>׿?(+'ǿ`kn@?\ mC94260 vr#:H_ç8 ..@TB !p," B<@w;& -(@BήheQ/+ߘm\Q5yܥ-6(!ZCHU1o?a2JZD^'qWfN咆{ȗ(q.\{hkIm{1J0``\m?3!ko@3v:{kWqR|3>LmCt+E5O52(Ğg5KNJg&<}:9̙eQ%{䝗:8|sLEޔpBqK[:WIQMj<[Kڤ^0ě՗i#')'66:׏`qLD^.qiWmĴQDeVdHշF{]`5)_l% ".vQ`}I0 T\R Əp"}U܋d q)"U$]tb!Ӄ~u-Pd"igUSKk%~..^/ri+ZpkG%F~y?}WzpúF5dse+^+*\$HV{JwՄ;t'x\ Vnk,"29mT}A}hVGNyRe8Kxb>=C0/0HiE,;Tm~%ňKO$vjDYQOmxjG2K.@ 6+P{%c\5::cr ?ɉƻ-B?$k# [اWGQ|8W/XHdN^ʩ?IL%5N ;D<U^SHuߎ|nIZɽrnk?Z/jBp2)6^ܐ(Q$M4~jқzDUlDߟL)| řr6o3,e}dQ n1? \`m 5Q9m ]e>\HXwj=Z-ؕ}kZr,wq,Ցɓ?6 xr`R^4ѭF")kybBRg wdLs}edpfq ;^{;aC*a&<%6lxnA;F+$m7;n۞͐uEPbmU. >%W{ =7rVnsYVqKl 6p صmzp&@Lj?Ƀ{H8GWl-=iK`IRWrES 1.= ʩq1e ƍ# Z|!q¯sH̬-34g%T-e&ŒSfkD;r;8C~MďSi\/hCKmyL^!ҡB~BT2E`bFp\DârPYئX<nK`g^歜0 's<_d[umʧA3ePWKJӾ,q,~ΟN8WǺ4HG_q( sl~KukPfX߅P"-}s4ow_ _8Ys;aݸg{ol1>5F8-+/o>,lk̥*^߁njs#/($$2׮=:^Ͷ\QG9 Lg {ܯr!a#?,ݖ)nVo3(^,XGk^ȳQ452ɣ{V=~yoEv-3D/ўN8)KqkHAŒM2A0`!BwޮW ޵{PU VKWh/Xȧx,,mH1Gf4G؜5_~QdiK{uE<>#4DgCbX`7rJ'>CI0AE"wY1 X0\H2X.rOU[(Rz?7H=~S%qҨ|9l۾ac6ެW|=ϙ6Dg~tlWI^`yJ[+_y9U<AThG%25=~ډӌKU;d[%S)v5vMk1!8f3\ q>Xlѷ>Ua_Bޠ$3c-%qDȴl:(nȭQsܛ,I ~ ) vԖmH9"Kx{K"4}HXcXs<?{GfVb0^RRO".pp {WZ*jɀs?al*Oś`-}'8Ҝ,^mh(m($/T[/%W??i.Fwt5"ޔq+;]KޭF—,' k7uDd[xlod>)ϰH]F\4 }?u̐a406(p}TmS[}[ITeg+RoϵΎɲF\>VU94 mƺa"K~ M6@^_wZi>T8GȀOߤY\Z^}zbII ceZ -ʒ |5 Kd*J|"07MMfFSn8V&54bg\hxQMf_.&x@* Pwv^F&,únyW p.,ǀ~ae\Rq!_۟)WTuvh{\.^!"YB63NȿcJg'cL n5`Edftw)٠F~ enx@l:]a`MKt4="Rz=`܇;g`jD2%n?1"ψEh H{lLaT<c!”zL)rZn #4,b%XHT& J<$ ,a[<m*Rӗh;XŗΧI҆x#nD]d}g7^Kg.F endstream endobj 777 0 obj << /Length1 1787 /Length2 10154 /Length3 0 /Length 11181 /Filter /FlateDecode >> stream xmeX[Ӷ-SZP,@@ݵ(wwVx~ȟkf5s;+ -3 Pl.PgQmvvTZZM *6 $ ;Aפ@{/) dgo""@TZIda$6*J !PI36e _ZzK''{A66sh9Љ$h0:L ;T4߬d١#A;hf`;ƶ@;%7jL};.!vxpX8x\N~?TAw9 ͜CR;L?LgNwO-I}Zy'c; 9ʀ\f 'SK#Zvf@  vX8'i 2::B_!l)mg 6Y8yx*;\9yxTtjv읝/kyyloZ7ؤ~Mo&No&n `SM|6Oog& o&(&& :!1u5uh)z$gC[3^C'c;ڼos !@S,@ zw!t B{X m@-z[V恖A?c; 7l *qCB@?:P=g0R4$??e2?@!Ǎ` z]A; tπMV!qa=D~%MqWORKܛ5C΢k|vkUϔpA&̞c"Μ; mmzF\vf].'~nO VqSnyn$2!??:\@˛ 7S4#d2w)=?8y6zJaA)$ { FcIڭNi‡z&Cb,kTo#ʷvSu ^܈*rؼgkxTҌ8Bf*GlqqŽWzuU\<_wZr#nMWдYNډsbHi{yܹ;ROP۹IbfzL u CRYË>;nd'tv3 xsWVW`\rm..muS|a敱k KOQE3RAƤ;3t Ptge=XmH]:ɯ_ю8͏e"< I NkHIt&%{>U .e8M%JMʻ |0*v`4tn,UZ!2^.ܳ&Gϙ򎿪nBr֦2DZ٬|_ŭE!0T3!yu2=A|o%g1&f/7R,5~)v9ã"Lam܍E\ x"++d&ScWo5Vd5)p{XC*ߪTT]cl;h N[($#%Eǜ'3P7,j0&̰2"_B rYd )W^w+>2+rnc9!`ϭۦü4Kİai}GgI [U^ITf|bHOrH7!OAyid#T TI׾f5~RC$oVy0-':}/DH0\ b+}YżqԜz.'@G//Ȭ'[ة*E񎬦]PQL l%%zsaI} :4vd(4%6ׯFͳ ӢOoJI޽@s}"a369A{>UV;S ڈ;)&8㘟 gWn&: H?hq'յ)8Hv 5:?8s~`6YYqL<Aj~o[ ޟiJol0+FqXyz0B QhcrA mUt^]ꡝȽ`5D\& ֤ . J]H%~,>w?'leRH[<(O'⽉I|/aI9v6X-񿤳㪑U +Qk#NբgjM/>i"3xWǑ$  ;ߏi0U?/1'se 85E/z}Ɩ'u\16ws"b@};G0rM $R WaM[:t}>{ \{(6DIZ1[DDQ/^5IWJU$It2,ݍ xOMd(~2{?7 ΅!P? $H:#Y$.`@J|Ei^ڸZ|[|jW*kP9ĵ%|MCV:Xf%-dlQ!i,Y$T~펶exBo"s*3$>$!)!5qR4'EyM:kQ!+y`ïb{$z!wͳ%LXU-~C¡gmPNBsZYy:G0M}miWBU3CO G ]㴉l[vc2O4ktIȲkY/N㕺ߏ~FÃNM'g=6{u/s;`4P(.5]W^eұCIlE@`W!ѯ|ŗE nC,x#bcV$7,#凢[cuK"47ܝ%&iȭ7Jau.@/qo޲(Z,<˟=ySYb~f׹l #9nEى6^ƍ]*|Mby|}M Qcӝq:BU&UD ak^QE'< U a5h|('(?x&Q:&/"pΤCer<8Teo[DԊ8`2$fwkX '>N D4+㝳JڲA1[_/$d .u|URZ-cx0"[_b˼)x3{QlMQqj{QᾀR|Bq N90kC~J,:۷bR*@0|B Uf45l0tIXt ,Jף1'K'M}ҿ&H BnmUT5 KfRïZG"bgZ%U\K6-?-ʵ}a.Ò֌l+WS}b0yf00r.|x՗ AT>b K,ZC.oIWm%#GI>54u)|&A,T3NpP@ŷ3S59B'Wh3Q\\9fN gߤ*ԾDx6P54kl/h(]3Ģ,^֌i~f稍Y_kp-͚WWAaYux J  9 "A5/81xE._;G}ŐGرF`rz@8Yx.R^BF!2=dbLv܃媒K(mFBBMը$Qn-D#_-K~S|F31MRAl@'ظk2ك򀶀5a,f"'~g΋`N"i˝-q8W%:<޴zŏW^݀ʛ_ "ƨ<E؞)ՑorNQ0Nc~"]boUQpdny :H'l JIC9k<՘ٻ<ւ+3ɶ)o;^Ov$.1,K&a^C 2`=*݇\bk?sG #(_vr}Onwl<΄1/BM/j࣡]˓6" EmiwD9VmJ5¶SnTW@&hX/T9OFX)_i$ᰤ]?!>ͳ/'_H >_R:#Y-j;쟕4Qn7Ʌ| V6#oyx7_)FK(IװiVxےҌ#<'f:uS}\EyBS"*vS#fZ2*cjJWv ,|gË6)JG#Aq(N%tm`S4NcfjQUl`}{~*#tUiuՏrYoMf΂JΔFcW7 + 0Y K7b7)rچmvx'B%wJDMQeVdSbW£>G{-ߒ,;1dq#jov|l C-Y`@J59>>GfdU RYIX^c8Ԝ" ^Y* y+B^2ŀjSbеR&l;=}ĥS2(Fj"~DexM&^t.*{ a-8`W' B wO?t{\YftcΏs\]\TSZj|n?6=t]Nr510E n˸8T!5d}#_OV1Mht $xoT1阂L;3MCz:w# "цs@"n ]a%,秀4 j@Ƽ<{}b1 I eqBB΅T<cgY[x(/XXk kT;{:hi(AhgVR!/Dj&x4ɢ*)ȂGxzk>$\7;곝B?v/x.>ߖGXYXDHsJ~|>q5q7wL0&CfǵU .s"`̟Cň $zV}kn-;[g:j:_@~l$LdfS` w^v&W'w,ßAY2V{&H;fD&NitVRSvLHImIsBW$bO(JwduQd'?eSH}-G?΅S>j/^:`5^Le%U|W36txRg0KJ-]d>c; Cdl:+Ɉ"L Bje720[΁F=m8Yw7%% "bH8V& vkշ+&DW-Grd 0C([>)!P7km$1 w0e 8\N+p3i'pwϰ uG۵8r~~_{|7!{byF/,莳ooƖP9#"eRgskwXY1Uj}\0"i|3'\Ag~^]Df]xqgj56BHB2JzNɻ|)uQ´.tduRYNExMAيb3*vrict |MF~GE%[c6˿`J`ȕ5?&4KjQ>mE pvdDj7Bs`zoWq$Lrp{hdRrȞ4237 W^%{?OJ5&cj¦x:?!̸,>KiקPh^2%Kw`.oumҴŐ wbsVuW?+nickE"MW1.')giKOSz9Z`Zp*b%lF\ ΕufVbw{uxt1RNF"C) #/mLkjPmO$um?@-147v9h׺o 2 jxo(_!iuܽZ?ܓmv%ce.=; 5ŝ#\OW t5 ^Uv=:!.ƑMĹZS`)dc&cuQx12h C85|(>1} jkW+ ]ȘO{R/=@VRV8H1B )y%!`d&(8ܦDf %H-TӷJ]nXEzh%9=Δ`9$[nڋ0N\;i_mV7\dvmW-\78KB[+F϶ԗЏ_ܞ:ľIxQx naZwb2ZX{I$7̴6g&\΃{H/ǥaܧ2~qyr~O}9\{sT;!M o[T,Jl'%\a2r7%C0z_Xe-}c>3DˑCA=/USʹ\a%ޫ,j5mCE\~neCfz]|{dJu<0]$S DMeE)?8%s[;.^z'_a^5/>tmsBϯYvJWcR ôٖk{δ*JÜ(@YXseM:P}<2d_[3~keLK *X]Hts[ \#c "t|CE]>rQtELܢ IӪY,j~C]<Ͳ&v*;MT,CG._K3?߼nV  5(z5>AC^~ڷ6:E,'a~{CR%-޷7P\OYMORj/4d+2Ù#6[]#h*Waլ@dv:z&%3:|LLXv]J_-9cr;#5~3X4ojla a؝V^@MG֤8aVjNU5O'vy'i|3Wjcrs7_ sH .;ۻ";~ /ܫ8Xm}$AEIz ךO܃|-^{LogN0cw\F_N^eNYRF%En _B9wMka"\Y2i1O\ k/y{-,m\үF |UPhos"GruIǘn%xJqR]?H0&nPeQ25Ļ|^񱌞F랍;D @J']3j#ATnt> 1g 'n]8q \fںZ'i-*/; $'/H73W3$]4hZoq*Fq+:*%|<ϲ h*[)IFqBh o"0N#~^<I6jXG2\Yfq@) %\B\%AM?Q܏<~w@Viv~4*%LGlV+Bbp:QI6Vnie!fpj'?-: )_E;JiI]hRj" o:ĝm}z]f&gƄLg$D-Ի;>8传M'.)#5)mODv;H|Zѷ>0̜ bxm@ #+!+|)8tyR,agNͥHCn|/T`:)h9`GlŨjY%-[0_LjnVpdrSŚ̚簶>H lMmmP4ԌaFʟE.`+!?Ƞ82XufApJC Qïu6gXWg?Up: endstream endobj 779 0 obj << /Length1 885 /Length2 2135 /Length3 0 /Length 2767 /Filter /FlateDecode >> stream xmSy<WKH12h38J J1_c3cf#-с$Ő3C*D#9UQѵm_9?0cp,FMhT, < , ك &Fd,y(Bj4HcFn 2E XWm'  d$X/ӄ Z(4ZPqc+r]ԘjTKeL%<=A* A!"م@ AKAA/a[( LORownīJ5~ d?vxR V !ڶV7n,3y$ܸƾtZvǩqk\ /U%VfV ˆgԩDo zPSEnsʕj7v% Jkko^eb{ ]ʛL/_l}kPuy,+J|̘j@-tfcd*f1}j 'SgtS|V.Z_GsG2^$XEg8?)j,on4W]Q-M;H` Cm%ө^K5*B#D.=V>"ewƫ1֫ט'"Q#Ye|H,a&v4bO P;Y.fD8i`BHo$UQO桬Qm}oPΉJCw+9oex hUѾjJDE1庫KeUt=\ӷD5@Oi#`~ІKhhiRtdo$-!-/(v(H*HmOܕ}(Гe j=~/BDuy6`9gCmO[~ 6֪ ɴK$.+ u-"Bzmѕlُ`YN_Q03^H}errK=Y&co**]BqҠai/%rPF5nɟ5Q}~%;hy>I ^476u{ɝ_˾wu {@Q%&J뾤pͫ~w,kBJ' h93妗.xZ18ķ?uOἊg&: b[wKVdJHz&C(jiZ@W/?%hݾ.Bo C1hJ%;sr',<:1w(/c|\.j: q1YJ &=Mݕv"}s؁1z$8I S6ϑd}SjxZ3xI;eb޹gC1зW`%х% B/e?tXs.t$сm,xz}71Iau^w5KQnؽPZ7k$&ɢѣӐz Z>H Ca";*DI+3,QX踧baеn#7HC/6yp䏻gB[Q+CB~ݞnSȖJnWЫv6ݣ^/o6]^Z{l08w_a刕ǥ9+ɏ9y˩qʷR+0s.n!ȭqmw]=pqXXIb}Uv3o/3(VB+7`x3R&_$=$NzBH(`~]1Zrww>R+ejBy-Z){sIm#Wtw+Jh=Br(S,Opf#; 6+b@p55l:fKHRfZ͗%tn#+|_iۦ^o|Edyb'gi)-%&D`k]mg|օȁAg-h؛!-uIJ}Lxߡ愈ZΆWloh;ԝa jt/8m U~Vh@Ғ7U)*p{Q[`i: ~Cy$7ۺ6€S[^:Grk0 'VUM Q7h=D#w_zeLR0g̓;v@zq6|_w~̀b"If|cfcGN3wx֛j+G> stream xuRy\E E""Djh@BA HBXEА0Dl3"Q6򊠲*nѪTčdъ"P-op?{{Iva| )Нi,,d0L4$R$_"0&G(뿰,P^[И, 0hR|1DaW*Sc8^N F0HFa @ H11<ˤ3PXTORr3 +x[?&%BN #(:F X"P` Dpy_ ?p ԈABpG(;L9c0@T$)e_.U8ϹxRn" [9Jx_ ID=;{v*NF4%x9X9~y}wC=D%[cddga>s0M8WgLNp GNE3z{Me{vw ^ H9m@'p2"7oR1!.KTS$7 DUt?7Ӭ?CHz 5UdpHJXk: ꯉ~E1ݜk5m._6( @ +ý CV=d"XVhoyڵ&~qAVn- a˺{F} <["N$lя޴,(FaZf^A"j.2&E/vmc#&r A5If!:AkhzZ$yUoNuMЎ*^b wVnXi81BE n  "AFib\pz=k"K &{kU녞nmu:{^ x I3Q E$ {ŭF.wOmd8?->:> stream xuuX[׆KAaV %%Ay~{k?k= z2k" rphp(xrAVP7CA L +ZbV-@["y;C`p=AuEiJ % }еX{p<%pWQ..dqp.z `[9  apllk +ga:xLكu[tM+ PW4YY'C# ~WԶr?{Uvۺ׽_bXiB6@?D_~/KB[m_ ~گE~@!6p[?o OgPGga#]\1_r=x<#66?Cv@'sab#qQ/Ccsg$pCǖN12=b.x[HW}bDI:P}'%`Ժ- ңVݡS,dnǛ3;J⌭5GhL؈cq1hC;er;kedTa'c)T;YFy~dGpEv+'Hf9bSx||l H۴@|- J(ۙ!;?4=љڬGVM&^L[$P"GabKyڒ} 'yc6"4# ;?kM4+Tj J;9<{̿oH5nI]Ud~t:w  P/x5X4/&-Ck_mQ/lwG2ꑀU;: n-IdNpOr,(i)MAI`{E\U"ӳ3o²ሒMՕY,۲pdۭDS> /=8'oped9؏~H2L\ȖtBhXkСcE5Zǂ &w8bϵw߽ 6dѓ]0Cfx}R'D$nՉ֣ɟ*IVo :cseT+ZwmO*܎u{𫃄ЪY]C@ ĕrmTz/52;:#!Za v253faFT8nm^>&!DWi,]1 A8Ed`ĮD?a˸,^v3~)oɜUJљDO\!C r}n(|(-"Q)xp]f]i9,aFLalMpGR( J#ƛг%ˇWʖl%>/1d~ڒ~mE,A' f"F @qHfx#8/7*LE!YWm"ʴsOXVKtr.y|~L>kA-T Eyj^/I1URg-̚)UxO 4"y~( "|``L^'n÷DNi,z"We|C,E+ P3V8!@TPss gbc [N>"E\kX~> ||#00-(' Qb̄+a_[5УZUbrBsjYsv?D("x^L:q3 E}.OppG!陫C[~Q1#l^U7 aP&PFwiZ/60N񹡯ܠ4)5Q/ʮ3XlfY'$e CQO0WTQ%O>iUK9T@ysگ6 _*U{(;Y&>+2S: _YFjX2\/K(p_F{'_H#a)dˁ>gKT/,gޫGx~{*Brj9/_v_FqzxN$Í!0 - 9bdlĨ4OW8ŖsިUI-͂Ewqu[_gpWXzsD r 32y$Jueo{yB?iǸT%V=s$E?! Mc-6&laze֗J"FJƹ8$D:`/U lB'+WgEgm =ד CEҏ[ߢ0C֚U ݋c7aËIw%1/ۢ~vYRV>jIk%fBíW(PnA/.z<=Ibl$gJsg;+-TJsAq5AzwqNskc)!XX o,^HyI,zIETOԪ2513{7dQ:՚O$CK#eGEڸX+:{WSz]9# W,ŝgZ]([Yc%~G|ozQ L_ 8&1Jd¬[UK}XAS죂~NB[SmWɮ61Of7bdФ0R># ?k+62Iȼm,RuE(E'q//ЖTK9w\'u27mMO8J4Gnxov:$&q$pW &LDh+ n mF|w~ hruZ蚰ס??S!{(NS1tBQGeMR1J=49QHs=+>  Nj#OS-/9HB1Z.{ŷ߽sh|:%M!۞?X5!`eCAReZ1 K=fƱL{M/6h[L.Ҩ4{~px{A;B $SV aSHEݼA`i= d} Y&X#𣧼Ϩ^;q//XGavÚ/;^%Ψv A mOC,qާs^fE=I*˗MvSMPf&%'(Xn~ĿК>C"&RszY]yw$ħHq 6g=)i4oۜmU]\Ɍw!~ǸwC#o'C:X["ܐyB'rT6p#8uyDt.s|<5GګuCE*Jai\jC?m5f*Y>G!( [nK5 l$l>PIBӳv Knh.C)@>2D} չ짨~iIBCO.cϕH߱h6;xd:6v"=zD^jSdu%k=Ֆ>%V$:˳f5*W.Dzf?tGc"^݊hz*cy'EJn`+yx$UU$gN`Ra0+WYl nX&y4#\2 32!MO*:~o%QIҜ(U7h6\.^ϵ0&" X7DxBʪ]J4N>eEK Q#gdVkxݺyu:_*_6ff{!_Aɻ|XŴB W Fq]1]"}UDgot#7LHXYvi + +$K:6g!C~s[ 8f:ɇRl7|2&[trP---1|ۥ ΢^VnBGӢȄ_bƘsinDm]|,kW]bvW& f$.^iK/v^{I*rAK3[ԐMBȞIcF?s!d>?@4*z$ s&E_CI B!ѯpOʫz 0Ěp^{|V'*?8Szz[f)?Ud4 *[4ˁQU0 *acȞCQ|}!~e xMcyCMv M{uE䫪W?̇fO0e?Y  )JLF?7JV^i=2$ WKڌ}Pn*0њf {ǯVh;p|o&m,%[%oe 59Zr+u,#{;X(RŬaw)Ec+9P*7fLMGHE\I2(r$.jEOl[n ̴[V庡 E(ޤ> stream xusu\TڵHw H҈t7 1 %HIwJwKt{ϹozֳtTlfv& Y;#;0@ʦtimlP d |9946D9vi@@'4It;A܂.a.Aa>n7'R`Fxf7be2s rs-Oof9r0=Iڂ 0Zi)?6k sx3o0srhANR=Y\<||=jjM7(1A@ lzzy #4..`Cd`W:|=Mb2PԗS`!]R`pqx^WW])B4u@LG۸u@` KG?[G TbaV0Y+Lhj kA@6`H}6.4- tP ڙ!n>~^n>>A\b$@O 8L@\'/ 8A~ 6urpxXS7৑@ S;WVUו.l[#t[:)Ll-NXȉL+8K2  5!jMwƱ[Mhscy=dl۞~ pmt9NX.o\{gԶ+'آ" >dNS#90tŞE)˂uœ}3\ kIRohCr7IhsAHv 6[Gz @K/8Dzmr Xt =ٍMWOEkD!y:_ڿ] 睬'"- %hIBkzD O[' hCCU*)-Ό*M:gb߆@%“=զ?l2?ɲ'T6v?X ݖ/COp{Y-^resE2!g4x|)t]bRsH~Gimjџ;a%KoX4} xA%zKjgerPh.|9MuM 0pyc e"Q+*g*+򶋤p%M4P(6iۦepxv7'6>גi.C<%\-mXm\׉; Ljk|M<< kS~l7vdwK~]dnT8IKqdbnRXUZ_Kx?ع-g#Z0at<~vJo$𹩵A l`4/PfInE^!_-Br+9g/ /q9U4y>[s$Ew־wX-i MSQCp>&*8s\6|w >o gr~Jݲ:h*u7`=%vLIl?Cu@_U\FWdaeMѲ~GQ״'b5:TV0}ݘ^xKv@mͣW@s(_j Cݗ[vWa*wt R@Q[[@) Z1 t8$G+~c>/ uـm, G[x媏D0!k޾|d:ؑ^7s=Gb{.ƀ I0!mzlEisٶ;]FɘhTojĩ"*>2˫3%[._EzG732{-K}ri"ꐖByyrveUox]]TClR\w^چA NJ!]u486&x?eNƬo!T f~ YwbKft`WTTI>'. /ŸI;ut\!NxT1KVsduhtSn(i}|Y3Tӈ!1es+ gRY !1HcsX6՗tfBY,@j`Ŧ<΄d..܋R ؑ/RSq F˕ɦՇ8SDib~7n{'Kq*Wފnﵾ7CV#4F xlؐQ=c9nyZbaSh85v:#`k N 9}֏4_9"pa.>#^*_[(مOm? m}܏d,nu"i8-I& Ya}$̈́ }mn}IۢJ8RE4y*M{OvMh=(8GcF&5Y~2A( mf9-NvJː8+YMeeayčW Q[a]$պQE2L6~L3zw:SkBTʼzI7gP4=]($'Mk^?ja8-,;sU~J΍ u-!+Pl|0YUCsjr"NJ粋aWڜr ƽJ I"odj"F~_-u0%s&WE٠c9w9H,Q8]mlXN-ʴNAe!wx|R.$$e fXbz _**ij<)ڲE1ȮdQi2-^zj!a#Vݽ f0\,1>Yol\(GTki*҈l'Z̗!hevosͭ(fkݺyQx !1>CV׈$|q")/eW%bs9G"@ _.I=}%˴cɓgF|15-wrJ`g?/ke[RՀG`xsɚq=Y bxX:~>׻K5燍_厇K\9Vsp|&%:qyoXqkZ@o$ԯ@&Ʊ>rխ"e-GᢧknOjctk:ݻ|c:(eIY5D݆OȣK^v#G WJŗm6Β2.<*+!)9 ]7Unjp).ssPcݱ'謙D[^:;/H&BlŬCǹ襔j\haWʡn;gHw/J 'кF3+<]taJV'\!m]o6DBg)DEE;Rq2/+z-tuԒԭmS+0ew~Re/;!# W%ZKWZFٷŇ\#0K5Il9a^9VPZETc3ec}K+ U}|E_cX 6]/-dCLn꒬=55Ndԯo zPJ/7Ҁa2HKC[gȔX9D]uDihgX1V9fXgRĝBIJhc˳ ^Q[ݾjٰ4+1I3Azl_ЎZ ^|]5hG25eߊ*(މ_BlF֏ heh /__0C7]l*i#g.4[;%?vl&1ңȳ"dHIqI`̟><01dg:!׾s4}u/YdNJ۞0]B;N#7xUE>7[K#vB~kչ T/X2ߕeͨ#',|Kɮȗ\x6Ont0Jb<$y/FB8)pȠYgzg0,|?M M&HN_V|Zت?e-˳0l/J -)'*7Mˤ,;u,wr:bi[iӢi dbIKrM"ڐPEC]_mM0 ۢ9FAtu7 ep/U<<ЩMH-NhRA'ݧҿ S燪k-S\g߷i^a8 s-qղdf'LR\(HW w'ok# :bed'a[l,W5zathmpbؑ2b!m;N\S.1_U" í/V,!^_(&8HW Кa@t~v@_dqfdr{R5rM65}e]dpo:\;h2*afcíz9VL2dN!lT ~Tx?AA!@'7/OBg+ɚCx76KU;w0N]g,Ÿ~(\Gl4qI׀AƋu䘀("xAA\w{% {*i4E^W)\[qؒE OAYcx1XLGpc4F5}9Abp^\x 'kx.C1mO 罓z|zpR5RnQ-?4d¾ l˱8 v-VR@vըD)ݜ$*iM[NYsCn+T6FAbŋf"YŋMDWdc5cXe>x|ml*M 4v &aԃ2BSU~m\v~q}[sluѠ}#`'3+WKްo(bDD\-O!yE9$@Sݜo{[9~MR&i;e8msZyIݺGe< *z-ᙪ%9!h9P+`p8 H"1鹽}t暓">[b:MP4Z1I`L %'Rr&Trbf*;7XEb\{jsuS[t$!߁d<\$#{?2=`.G*d 锋r=\ 궠$ z_ D,gX%IM#ylNQTrތ&H^GLnnASgMmj>y`+Lgi$I=lVI8_fFZw8G:D1 :y+FePx߸6A-ˍċ͍rA ޫ4zXT\-r}NdgD%gdyFHp(_xnj. z})ģRt8 "B{&)"{Yk;:̵a0rE>w*Q"4sTK!yU d[JFo\ˁx'[xz0= IdO%2k͎XO8&ZmZEu?TnK7ٍϺQnat" endstream endobj 787 0 obj << /Length1 1288 /Length2 8216 /Length3 0 /Length 9022 /Filter /FlateDecode >> stream x}TҶ"E{VBp)P).!Hw+i/?ўg'6? >uBns^m{O~>80l6;1{d-R̝ucXhnC+6z %"#`R4G'š$l%{Jӝ׽QF(a=YE64mr\^)]wK{TLmlVȣ~Ԉ/5EL e%Ge=yeA}b:K; -.19=Ll;IhVT];87}~eeqEG6q!?6Nxˠ~'= i Pi]fˇ=Oԩ!w6=/o ^U,Qf"YY9BcC*\,be_fZlC^:%Lr}v ~a%gn}=*9=m25sAβ<qa# uKt?xכ,=sV6h+! mW+u.j,Kcmvzr¢AaݛU XL,!r搹'"}Vޘ$n.|MQGԸf'z$~U>ݴWk+C&Izߞ4.!D}Yk8≎Ni cw%`UaoJ}܎K#Y!X~کfм i8Ō=hu lq-ryiJ-N#Qm{?Cl.MYP-=|4*owr"kX$i.녡(t/p>r$,x^3ЫRZO,5V_a4EKZ]ObOtSEGлc+'}wv"5;REgp4C XoMBwxe-3Fu˒XUIFB/mQ/ڨu/dm#T6n'whEq'riBǣ|rC#4"׷>JD1LBbޥ}޻{8 3"'N;5?!z\g8Q C۠n%T̄ز+RUmT')*4E2m[; ;?qYd\_87qgi{.2_\a=i:'m~OP8{nEJaϡ|1m$i ,:=R֤hw<~q\Q(׫S%wM#g*Z::㊕|[}svܴ2ڕZJHE񮂖 g/' >) &DžTr*Ϯ 8jaKP( w.zsznz?x "񧶴~N{SZ y(&eʹ"i_7v5&E'@`V!4-ܴ%vSOVV\S&D,8̆,x#*{>J 3ZC=eK>GPe.şO1EU}1۳GKL\Dvj#o"*oZ3e(}-SCϢ} 0 8w2ɨ!(UAcӑSDQi: EdGHGp $2޶h+5ĹSq/#Y,>+M&8L: qRt`y[HeYe.эEPloxt@7e-4M5:O^åi-bj g,5}q<$*v{Wǒ]$虖Ha8naB w{K̬b=>;"Zw v¢e+)UfqNiHݵ('i?&!Ӟ#cD֞; "C Ģ:5OU1ص-JP@IRbIjB:k}Ǒ{|_J-;'˝#tY8LZx{3r=.#m;TxoNЊbQ a qe#^${ڣ"JI0.-d =/Try^G3>yÚ]b"~ʍxx< NԮ^CW#ڌd^||[1bQV"i.t9Ggor@<4gDùҕU\ҼkPqTX2ȳgMĹXch_0Ih^Mq&@rsWd խc!{˲cqv+!_bW#[dWRU á_̋$o;֘J ,ErAHQ0ˊ,cѣSX%ynƇf^QN(&oAv>u<6[H_XMTeFc~zA@pL[\K=&De>.TJ*E[_,9gˡ6՛*ppE* !#cDcecy/0oj~’èwF%/ ˂qh4 ܏[Q $>EO=v3{}KM=uD¾jfʫd8[tŸA9mx"MHz֓o+G^0ǭXeutj40LGȡ/yF, l',\?h¾:yKkD$[9ߣ۾XT?<pv9w.FCTD*]3&eKaD_/ɖ{z '8!.$8cJ|tKs=oTn%.Ib<+ʤYގ,қ~p8VtբRpqԿX@7A©QUǛTFPP+dҫ?JH,TkH)qlZC&+Y_%cO Ȝ4iNů_]|(>e3Y֧ۦT.+FD4ַn:bodb|FxD!56Y1b "&)Wkdوq¢ v0P}0n XtZ^3GH vF=\hqj~?U,"2iw(Hja3=fR7CX ζzc1-,a0X'x/#A)yxB6 E S+f݃k|4ܾ}jjrD4s&$dkOvݴy_MG4'tgbóKy5w޲>M%ްZ vnb+U7m鮆푊8:}}Oך8%`yz#s(ToG?8wX×|ꎾ^$[G{;j8mjPEN9op)\x%,&-CF-4v1.yqsA+*M86J䍷*?V9mƶ7XHRSQ ^n]@l7 3 t R.DJ}?DN^7IYmk$3) 3PU~\vMDa1A~sXZtzm'R֠vAfhE'ʀ״A=/$;u=Weoݵ4-MPA@TlHjfJyKt5Rq|<>q0iʫyhkTվEShzr%XnH>U;I= !?}4Dğ;_13vH=m ) m 1gSn'悔*y+.EMHƮg=JW\I6n)qni,2\3]td]>u~vfT;a3S@_+!t_d8Fĝ@[q*v#׎o.FW3*9_ό D Dbt-s6:FRS6I!> %+/ğ"z*Aޞ.BI?rz{ m5l 9XtMU:V+*袈QYtXnyaEXLT3ZeaZ-0.h Ekqo൴pݓf:*2|^7z56;5}i9P%բ{fm]QݥF3đkoϔq |5</a_ du[u[p~;)63 7:5󇗬e$.Ui"y'ooN5zە?pM?e@Y5KÃ{tLTzm}0! %"Rh.& g$`JE@XuƞrkVzs|K~ Z6ќ8gC;XQ=[ԺG1`:dN8u!% n*tk>g$ZVtDئ't1;4JN!.;f뗋=|ۍƼ8y(Tgv(Dc$b4/xJ#/N˹8u=ujhQttP jn̝EWDJW9m[aF7T< ,*q@bP " ;@1mKs-Cxp|~3|XpõIP=cxvL sn׷u]ç GU{[G"} (PPږ&6:+ P#Yk/ {"c@EDZNߠWɏσ}pS=H'h!2 G閦ηK|A5:+ܚ?V#4Q*4[RGN] _8Qiz+Yjc%+Yq=XGᯟW5& Bi/H-_{tOg6m^QR5m֪PMOxRc7͈aqg x ۴]qa C8rלkζnu]\6gJ(z:}2u ֩6g ͹Squbs 6cM{ɵFR%`/FhyRFf8y^/.&mL닸L_xaJ:L0=CьW}K$(])<9O$JvY%`lC׃PF|S!(H"-e'/ՠ^&pUDhdʔ `6Ed՗CݢUy Y".MT)'{x u0kLbx vK|ǎ踴{ :o OMB6Jj pufjKC c?Մmbm~ySV6fV~ E@ޠ,Vd]ڢ O:9tk6tFKgǺ~LH᜶ !Tt5<[YS. rn.r 1QAy=qQTFK:wTGY)wpv\cp~;7{3E G@cۡ@ITS+#3ޟ %ffEriOcg u xl@ D&2 H4Y_+ YGքQU= Y`[ S* ZkoJFW[;DULء>O-Zd[]#aO剣~d7-PhgGRλe mDFп՟I$:~6raVm XzkSO2٪0އ~P,^各9ÃW: nho0j_EݙxJd[|6G,)@Kl(S۝ibmcP*'̾g]k%zD(fYtzpK±I4˾igQg[,/{&t㛻?~#}j "A`FvoL KS=d5鲌BK|WOpF;5 {q ?}ΚKuBՕ\NFl#HX {$_2t_gV|'Ie:ag^FXHיkf=-')OadN! L4XmH:eG#d1PuHV6H4n&.-YQt˽M"[r endstream endobj 789 0 obj << /Length1 1117 /Length2 6348 /Length3 0 /Length 7099 /Filter /FlateDecode >> stream x}weX6!!R"(8!)90 1̐C7#HHJIw4HHtׇϳcXZfz% [C0$/7P ¥r:A.. LLzP0%`2!pؿ BquAH; '"4ݠ$BxA`7OJ8B@>>="c{Fr H;0<C"pn<\G? l0h > QQ"fAxEWƞOz.` rlANr CK0 Aa~Cl5@H7x7^ ߵ 9y hjpfp:`H?)'\|^GXCh/ N( bGNN_( g!!jg_*HFfpr EV@JP/X {00 h?=A V/08  @nn o(^ݖB97 \ܑ~+!]QQ/(q7Nڸݝ_#蟲-x bC05upV&ēke@ri0 5~AVD6["kVm%^D[K+xzɡG][rɬ^9bb62}pu!&?xUY8>Z*p~YPSuƏH.Z|v=/QT9_D,Ş+CP3R<>&fFɭS@EeEzcUOTɃmR9<ve?/K!,!n[Wh1lx9%Dׅ3%iUG q7_k>Aq '++6ׄ0{SnίNGɛq?Eb(A ՂbY˶MIR=E<h-ɕ}bd~glp*1Rd"Dz 6}JγKA;ĥΘÿco낌-+oG*[rT!f CM6:w}yL v^"q681D N~ $UǼXA!Dq,7 N݅'~5YY'^ƥSt۪MjAZ&zu\aݠ8dA m*X^G;R/~c-9(RZ|l8LJB묘5q2V I;ۑ@8CS7H#U{UY$'Q3L>s@Gc<3T)M]l_(nZ̷]6@"F*$% N0;FoB`gis.@={Ҟ[ͦmi$)ΓdgZ08NͦJh%{ɨ:AW5E-ߪZpmMzDFT[2ޚܟzr;j ^pKaF $3_h@L1233v;?Z"Կ?rǶ<  QCp'9 #[WeyLcn=&n`߰Y iS]?G5]wPYc2 bTwZ zv< p8%2 xBᗇOD˿cPjȗy]2C;Q"-fכJ8ˋkRor; ezSJsFt~qZ٩*c4pW Ћ̪ik0"QI<>FK;a B;.Tj j# Das5qV@:ۼx{iT}wj }_*fk ϩjN}^:;%溥) /XOݓ?{%?*]Qgv~h2Ikh{:2^Č (ܙ1sCu ~-|nOPOuoހ.X$[R3L) IB} }rͶɐ0P6xWܶf\G2:ҩzӛ=hj,$ܰ%$?4ϊ.19.:j)UCW=Z$YB:\zŋB][/,䏙5tzW%ϟdnɜ&{P`"]=V(3ܨRt$0=dō$ϐi= f+5e{oNKnӋm'W>([ASKPz(d*j 6Q7FO~/_%-z~\Tۑq))6yGO%_74]:t!<봯%_+TcG1,V(a0_olL9?xUH8}.dبNj@ ILUJ|?8UCRr'u֖%Hg0ɛռnz)O-rF/2=: fb>z%m;C9_ڗ % _P^RTab ؚ1m(4_y"=2AZ }4\a9"9_nD.AQEGYe awYq p G}A`xF,߸\vKT )dk+.9&oY,1ll:3';y?i «|ҳB3 2]9Dm'Qdn;4:77ꄮ}~ˁSF~dlfŮwe &7AA۵;2rBc^"AUWYhd`A]Qq$/k-tn[Ag @63V {P$MFsNjW'fC^ 7\)6mʔ'Q~ ܰ6eI)b[@>G֜QcZ#@öÉPLKq.ǜG0RM{~8>SZ6=t1JA@}?GWq;[ M]x 6a`j;\37*\]UNWzbn@THG#RCAg9 0T"!$ qs.# 5kRM%݃&[420BpG鎫'MbvgqRQKݤn;/d?]-K05xF aک$n?<ާá*M4c~&XSȓ.owy#<+CG [6L3 }>5ٍk5M>P F0\7-GxƘ?n1~r_EO yz`|\q_R5IYSW[?ї5<!J ^z=#' |̿2{(fn\lYO:?;9S=OCaFfy3D&?P]!1[ć>4gį8&A#6/l4L9#Ѡ&p I;i2]gg  LڈоH>7{k$'ܶPu}]fs1^p-XϘ\O>9[YL֗&cn)&]R j0eV-ayҰ#>3Y{qfa{\iW>lH2dl^^ә1휔AC%OXL/;Δa4R@YõCZs'gkBz+}.֣IY^aeG03KpMKϋ??}FKэ mFn?ŏZG:~tYX/FX[}q~#(AJFws|G-(akz5W83!۴j*cl=$Qxۯ.hua~E(`PwK3ɥ"2U+Z%!=c. SOލ=E.Zүc48Eof'_f11.2r-~njO=T".灑;K%ҺK7p4i܌}my ojxj\M;5TjOaT>ZpT;p#!Yn4G6nLf1YģS"&ꟀJq Wī%ЦȌ v\XdЇ3>Ƃ^Jx xR*NIb,SXV_Qs @;K ~j{ȡ)bX3XY;ݚiC8]0n*ؙRWw`ܵh< q; endstream endobj 791 0 obj << /Length1 1760 /Length2 9786 /Length3 0 /Length 10799 /Filter /FlateDecode >> stream xetu\5 J1tw7Hw03tw#-]* ݠ4HIwwgukZ*uMV +H qe`c(9*ۃ-3vvtZZ-=迣: g0"W3v&m KYdANn;  ?D @ uJA6p`,9uetZrZ,Bm@0Bv~NX [WWGA bsf\~2+)[,@6`:7#Y:=찹83IB;@Yie?)PO+7_񛍟laS-#o.U+`_/7O_0-2w{ ߫0n7``Y'Jji 6w\brC@P+ag- w2Kb;;{aL'7 u\ۃg^>Pѿ?( NP ^PauN c t`m-a=-@@}:5htZ]Nq@rtC!aAUeyaF~D@aAvA7AIa#[0nyˇ&{)?0ή`s{+y`"A`{`̎K_\]B2MIز\] j7:?0M6a=nK7ggsGd+R(Ԯ68'7sTubR7g\E%g7oV8˟1Y͌$Qߎdm;'rƹe`!8j8a$dq:ّ٘k=BogDF!D騒Txr*>~L.s90kp= Fh}f==L8M] fb-z9gar͟g*Z'ni: 1yɳqP@lYSڷC1Oj~z{A3P˾ЖD֌TP KVf3!TJ =}YV^_P۝YTW;)7U(kOݽ?MA2`'ilZP[;@ >-`4֎b.PZ1w9SBq|^\R-SXl z8 m\0;QF8~~lpgK"e_D.4X0d2>cZIn]HYXge%-AV1:AY2%E5PD473P skC]Ҋ,V\cσu+Ulai&gQN]y\/nsSJ%޹04!^{)^ild1z͹W<=rKRfPꟷТQ'f9`Ds 94yS2~]6\j&d8}/ Q.~"EK@dA㙄x&?uLdыS56]kj!1cT,7ʽTʵb#=ʘ|a52_>~qA MCKd TokRCZ=F  WӖ1`ֹ գkGJUk[rIVcP,ġ,ċ*zt{e8=EWdŋ#~^]hӝyEj1"Ӆc9)SK^V_WA^dVdPꩦB36+yѬ1VD^p*s[oϓ<76[Eu NuKFcyV$k*{Am S"=miźc4XlCcvcC ;8Ըœ'}輱;kWt6zϡLe^;ŐvdS-UCڒݡ+ۍ{`eQ<,^oGx3>RoqZmݰ2uWuv]N._ i^\ ׊hv:1t'MqE#},7P3|/59a,tYt~pv|R;fާC)vQX9} @SYŹi}RHZ=6|6W%O);_"<Vi(71YHa|Л'WJm` e6OEwo&>Uw{ F>T^Mۜ>3k5ĜْnPY!jyHj"w b#cW>6סZ`U^@3njKAjGx>61A8ȉ qRWz4ңǶ:wβC (9.Eг,jKjFҥumS, Цf\C3W{]BۻT":ɓlJVF#'7dw cͰ8DcY> >](wCR⡯mná bR2*9lT#8yaKPձ9hY`(9V|}46j6 j3B߰;b CxA~,֜Bö_d@SkWh? [!˚\n^.|w9UۏpqBOȉ93;Kԃm2eNc>j 3Hȳ |y![hcCC.J< QZ8 ůQGmLYD?{A7Ꝛ7sd7kjh! h{x>dυ$pTeQ[~"mc~27uͽ^Y-zlKЛH3e9&(~ A PMI "78nlQirA #i^0i>8؅ g)޴å6d>Pό: WW}5(,"ѷq ,? */(h#w1,5Cp ob+1#C0/ޝP|\iD$kJ,rr9b)fȖϒÒOM2նߞEhMI^Ixe| zkhLdB0J+>g5V~H1w!]jjGN+0'oO{BLͼ`/>\} |U61eE2/.َE ,E\=qg).~4z}b[oHamS ̺f0}AECaD!dɀUDZsK=2Zg9KuQvYEG߁CJƧsq8:wy޽=#K,h ۃإ|B7C$ jd9Dv ,苸TT#>tgq8lm!8KtE&X*}m Aj!i#XējXKܵKC:F {" [Y4ٌ{{=b`!ҀbkX| ;`M޴*y۱)$ax"*H_!EfE"5&o\x@ubbW+,3vN#XZb66NJCݎ&VM@r/1V(VfLt'([V{LWיjpq`7')T;]tqзx8IcwYmxm#kuݪim{x>nM1IĘ(# Pbq@RJ E}qC*L4ٮ}=tƑ+uj~#MO{,e{Ap"fzc(Tji =[;T&DF/{qmKnzёh:VĨ:a$T3%a 0$WanV쳖Mk@*8{#V/mP;^}T$wͣK"Vq2ƷA%sqIv5Uh녇26/%KмLݟ.{6z;᳭5c)o8^;q_a< xca҅mQv̞B}L/ԇ.9%"$OW?W_Q#ÎPx(b0iES$ze7(][{pwSxL3(q)rkDMQfA߃kɱ.}ɯtS_%ȽbPN!g/Й2v4[v|C}j}zmpAM5#= Ok9CAϜ`᳤lK|H_p8}BBhҗ)? S]U::)z f;qrG<[|T='cRfz}UʊoTʡ0[N:izݏJ: uig2ЗdžiY53h< OJz0&>ts=M3 ;bWNZj KUXW|`[W"EA xsM+2l 1q?ɍYHKAO?8UFvERU{r3lWe>]\^ ٻAd Z W)-N^A*5W<%3m7dr 4?.jTwOuPNBdyc׶D Rdr֥[O};cxz'!Sa2:Gص&oT؛׀&/q^duzwU+%>aE%Wܚ74{Z=?G 0霔$;ce0VהǨȼ @.y[ ;.=tZYiPM{tJ%HQR3ϖdTq%EyVaYPށY;fڼf+L:!o!Hvhh8҉R}f,;`/Kq fNpE\]a<:NeR$s<3ןR̚xeY!wo4'xYE&$iyP$} #})~ hev b)|fMVURc$Ć[!M~ܳ֟cw1ܥC>M4!U)ݣ!kR~O |jSb/MKh>V XV"$c@^ꠢqXt}SHi^ZwhQ< M҉=) ㇗,$:may [q9 Q;Bg_EpHta^)gqszx_nݩ~١/upWL6]{q!RW%Rf8^~16|\s0u>PB"u;Gai63({MVcӳ%k&_H{=P@FZ$`xqI鶦EɘiPZ(ʗ G'Vwf.>zY Q/iqycM&a l>u&褡I8gm$cET@lc $46.VN9`0ER?>ېgecmd2M%5,>QZC.5k>zCuoJVeL$Vvs^GLɮjZq^D =R|cd8{]_C 'LFp $OX4f6JxAƧz׏􅽮k o2?Ja/^,%ẓ` }7N[lF| Ҳo;v[/SmV*5pJڴ u[V+O*ޘ Jyo._f5v9/@|-VNdI1lOvȡ):|sݽv(6X _D138eKW$kG?M-ut.UQTmfpw$C3gN25m #O L* 6__,pqYzjy\'4I@--b"J7wǢr|KE aT,V3hV0A{8!+/z 2(7")3_Utvlzڃ.>3Z;.%?i_}Jb$rgGq/f8(E_fŨDh0AMp)p̅?}-La%F-}ܿ ֺ\ ʩ$-:~ϲl&^~Gb ݄kM';?TRC]ҭF-dž$Ǘb/{Wy{1ʹIwdIFwǤFNW*!c* JrggZN馱S6W+y \v rZ1xKs&j5( sۢ(ԧ&_As"̎y9W~z'l?([6R1u)DŽaZ`688,UJ3m~>1Lwwn/;N፝J f|H[J`\э~g!TAiZ*o䦤w>0h+:zU~O:@6w #,lBC" Izg\G`)zU[K+M$#GFe[1jsTcf+!ȑuvK m,BYMEϳo3[x%D=o,~hiM SƎzfn{B*txaYU sxOX|ʐ(n\: /O*B\E{+Uۀ+-5RwGZNf48?Bq}+Y.8 e;dwJDݢoCN2zVQNk(n:Н(N].(пbS7;MmìqEX tyiXDw58#n$<X0[Ǿ^{^&{zf#N"Zݛ'# =)\[j5sl}anҬXWU%PN_^Bϕ Z #"5;b>_Oq+X z; a$Z!B&wehU9d<֒r@Sw/km[En.#:E4enz ]~䪻lܦwK$X`d(0tsRZw!)Kl"LP~ݨSS1h`855a=ݢ.?Rpo\rirNE.._Ј :;/OCX0_P<0:}H } o/G 6k-MtE<w"v.~B˥UMgBKR&Fκ&6^?;Xs$18uA;2FS^&.VNb)CN&IQrnV3{4Q endstream endobj 793 0 obj << /Length1 876 /Length2 6179 /Length3 0 /Length 6813 /Filter /FlateDecode >> stream xuTeXTDCahN`:%FZSBRBwι>^k]ٞh!+"JTyy_jCm]- Pп H.rH%'o@!E$JH@@H B8A HJ/n=1@IS C/͊-(&/aB9K܇l (~z p G 5 ` p?W($ 0%^:wo.+oC7FVxxAbq?4-aD  OW qkRG`P'w?st9z/п6UP0k0\ah(DX:@׃CHGpuM^ o1];g m a%iA_2HX%3P}m~>8upvEo9 塎(˿p5]`0+yXXнm`Bh5Wd}upy%wk4ۖA '</"=pyN&[q*|/9^"N{rpnQxOpM#̶o&̎lYo\H4s({5}%CnimW]LӋ2 (–mq˄Eq&rz6M9~2g`(bsTIΘ 3/I/if "ok 6IEEܚS't!,111ybw(WZX0W|Cuu|tK%`'* aYE]K55fAc}K-ADŜ.r,đnhokvB0AK1ùpTo;'^SxE:^8e$t,?Bt㳟rm:\ps{/ 0f>Kv?+Z VI{N,@1oMU)";gp'n|ӘfDUoő*Mv"Y4lYmnLoN>9iDk-ƩM{z훫T;k459[UFr9W; #Hxi#Ff#azmpA&qtd˫Н(o*ɬI|wC9F TKԡŎlxt]5b>È+\ ai@nʝ7'8yQR1Sm# !]/\\;&2^Zx>TWWn1 ;{ nԦj1w $%%b&KY<|ϥ! &^0%tӑ>9=vFuOc2Nh>(z(JT|*.%F_Ԉ+ܚi6va.Lh;:O 'Y cȮ1SM^SSsd]}po{y`HnD3q4+er@X\SBf8'i2.i}n6ftC%~\T\1^{=XEƮ{y8g׍%\]ͦG|b^d68z}  .9+wN i rqfQ,ICvqWB&d7t8/ACA&CV61W'GsrWfKYiXNA,pcbD+_Ĉ1mŭfY`j xn<9 |Bp}^`VdwY@TZ 8cZ5v RJ}mv)Q:G*zlVC'nAVE]Zo٧MVc-ƜEiGi ZJ{lՏ~Dv'tH3@@ {nyZ6DtjsV/5>^ <#c\fv?d-Fr{A*I✧*tKnP6#:p6 2s?i٫<(4Thgݾh4eiOMz귪 _zvI`'dmx;meWTblyFu&?>D;}'(%G1#@Gc*AV' cV::9-yx×FW?;]MoI@M¯\l%ٳߞZO)aXEk"Hafӳ9VYCA ܯ齃m"Hɵ:yNm¾G+XQ_Q~ 3B ΋R{'S>'(eN -#+-D'_@ѮD"(j^rńt@-ņA:1/"?jO/725F-eJJ:`4B݁BBT >H *Oӵkܼ|O +_5|p2ݶ9&mge1 A۰);^B|rT/HHR=6  4xe(.P-75{=ߤY#Ǧi}Yq<Ĩf7gO$M͙-дhv]npiΗ~l%v+jϬ.dɚVO_:d\+Y gc2`bp&I}~Qu]I;t.`b|=QzF;{THwmdqVwHsW{6?<"xFVH;|yZV&}~&@c$Kkȕwpv[WD<טZ*'I-bu5S*тR79o$\(0"Ce83e1pT/KE r9Z^xuJa*c.Xc^2yaO"yy"u1.ks)q1'M >]2Jl=pZvXn:jw`!NSv-WY]`a[GWNbY< 1c'Lc%wԄgRy)_bsx7 wwlc٥zZw_ G ‘dMW,hY\].bOEC Rj?띴7p^31⨔i,wC=W^y |*s  5Ӿ])q_~5U8JgK)<95Y2DSMQ9d]!U%z5z_Im5? fsǺdPtѷ!ea_\3maXd< ϩQu ؛(8ms|[]PR!S|6IJZͰ{G Q1[ye:6#wSWM|yAw^BBW<._RxBGGZX]Ŀ,~sh04%M̻:zPR6B1B4A6'ۣ&O<9?Xi/η#nvef3jHQufۈ@؂YxNCu:㐦L3pR$yiɫz'~Wi Gf;5y%w^(KЀ]΅cyM/\:;&pXTf>S7UjM}0s{mߤ5 z`n:q<? kxUP^a!||rՌJRڕv[ق 4H9++B) & JPTze/omsg9qֻ./& `q $O[s@.?JIY`ou+ 5<Ϝd qPRwɩ}Lm/<ڎ{OkۅI˱/'x|ֻ-fLN5cᶠ~xZ,bD?t`?iϧv~_KƯaVÌEGp/_]0ztbIerdrnB+Xo,HBD(u,U4p8XVc- #ݣ\F?vhHrhKJïZ"Y7k1tY/a}!b5m_Գb)#uZp}Y>_S^+fyw1*\H9 /.~tdS#P5H_R`UK&bRjGNPڸ7cFԇѺ!"{Ļź:T8 }B!U~#FjI ަ}9"PP],KKk>Z3 +mȽp1D^rc]O[cvsj\ō 榃Nyvwä66تk'v5ᵱLHU )Z¸ifkU=EDխ_tނ k!KW׌i;/#Ad[5Z6yo`]_<#f^gxYXG#d%c\'~ma๹4r@pwghSu|L:iRxBSynEr5ps*ZI[+ìr. Q4>]!GnO2*/~{ZG/B̀qRTA~]]-'|?}inaRԚ@މ#PU{"V- JޑhvJ(k1ݟEh8+lV`)RYJ~!fbv((Aw^Cn-}psg=z[I0][Nƿ$tix$""SUFL@ha[947\{B*:IᬌQѸ(ǃ(f.{,HCZJ~!@1AdCɡ+} endstream endobj 795 0 obj << /Length1 1774 /Length2 15897 /Length3 0 /Length 16915 /Filter /FlateDecode >> stream xdctcۙmĶm۶m;ض35y>gwU]uUSjRB4FƢ6N4 ); '}+sC=T.RcGs[ 9;}لbUFf=' ;'=#?!3sG'[;3cR![;wsS3'N|%!;|4%S+=;Wvr3'';N::/ɿ\&6Nt_DllmaFNcSsRr30M2NnMj#[+:uY9 is_P I adc008X;k{XoFv#忇C߃\N :[YthBͭ'zUuQrc#sgwFS+c OQH `oho#LLǧdfnhicu21?EEl mmL,}}wedax2̿2ݾj:}9;y @'/ӿ@'tB@'8t"!6z_bЉ%F_bI%f_"H/-2K_"b"(/-KˏE/}iQK_ZTҗտU]?U]/}E/K׊1qkg_W!W2C[,X[-@U5 01K?m|ܿ?"l<54,,__YůE_/_6hv6k mCeig`n11|5njե?+?KW./륦s~It~uWW&cOCgk_~a5dlfllkdT'Js8ͳ@zFALQ <֏/B~ϿF 2=QM7^q,L!W(ZΝj }DEŷSjgu\ Ǻ;km?4d`kU$^]zd\qZ⤁` ,SY.pZN듦},A|==[Mc*'PļײW5^ MsOڹiVֿ81= D/sspZ9#3C@7OQ!r'Gf4!T籟#'hUN+)4x maɯ0s-6ڼÈp,0Te ~d cEc>bo#JZH].xp-$7L)NL'_(֮q/"!XE)U8^R{iǟ0P^  HKJŐq5PS#|>|P'!7/TO%i6tW;{#*޺vk>ҐF;KoGZIxNX2m_ջQmN!A6&5V$X@, J?v %9#  F,'{]pmRX?E_YMi_êFkXU<12I0"\qɪp ^xF*ruw7|}iĢ7 @ڪl4!8&u^u)6ag@)z!MsWbE40@IN]&7&.եwПBs8`:˄%('[pFA95}&r)(5Wl[]lߧ)z?K:B"rNPH.~Ы}5R-)v!*Gi'vOu>4Dű5ÉaPM@,㷡p,kߕ 7I,?Ց}|o\T0 2ZY@&/ŋO|$kIfD!|"53SШ=3d$ӎy kJo?/VFYL=$gZCO|m$WGP[`u FπL|pxz[sj~-4sR")Jbl08_k?8BW=tWѳI_0"7lSQM÷)b1eirnUfWᥬ*J&Ah07:pӝ-NtnM)3tM V5ucHWj sjXB@\xzo^+]. (2 @քNX )5ueOaև+p8ëL`rP&Z&B^g 6įI 8;~+O`#L8{S?Q.[=`K%~ϛe膈Ǟד"j`** )TDFJgN>O9q{{ ~H)M{k/1}!.*r)?ʹb .k%Ļ {wsmC)?@Kʍ[;ex\C5@9J>|#\΅]<Gn(C9kӦ$A#:hY\* &4uGl\uol{yx?Oڊ 4c 1p7.m,TR[ewU2ZJωLObܼ5f54+Ă_y0qɵ x ˚Tl"H끧ʕ>Wi1޷rhbGP"˕^e͉SD8yAwXš>֤ CIX u䴯#(k =/#o0wv0s" 99k}d?ŇOr]cwN}_X$a2#mc35f}0ōD&jgʙ[>w&%'2]jFk3!m/L.ScչP9三jbANsF%G0{"huKhb6keOn^QH`D7uipv8O^ZI~vl1YtPY諜Sdz5ncFXpljށkh%GBݏ̑C;jfMQwtQyKS^4C33vz_XB'R; Qʠ&cƅljCH&^"\1,ۙ ÂF.6kh\#\GT'Z=-C^\t%1M]x!63m&wpנV7$'!%^pld:|^nϳXT.:bcu "ȴYB!bR-/5U %x7OX8Z ~ob,X'rtl>pH dሓ3驉@>q2UˏE~O>a7g=JhqyȄnUd*֔ 2CHTubz CkoW0glҖ6Io=|mP#gl#Fɐ~6b70zv)D|1vI9UUY)4[_e LaPW7XQ&+~w| 6L7S(m2V m)O BIFR[5q߬8YqXr4ɨRsrXnٳSlZ6IK@lא~TLq,@U>{:-y$SRvĢƩIg&^&k', hq ӁuB$bIR[..39?BNL"n2cIJ uW$]kzpcֳrk55~I;ԤEXHnhG3\/˙۹[ћ^CU&`^>|_w;;6jeWo:ָg ,q?C`JMᅐk0=RLQUUH Gء!2^H6! (HR Ǜ}jMȓ8v4Ǹr$lUhV VK0}ىV-66%Hn0-4s۠*ԩpoE% "[*V8 ,ZJ z",:_vj&œ]JHa4&Q>jΨNKZ(U)s4px-%TAaDv ,iX'bE^mxitb[>EҔLl.&XF YU177.nx:]HF)^ϗ6J G2RU\6a?K TP'8Si1[΁w+q1dU$圴mCOwq߲@'a˶ux5-3!RHBp ev(AyT|z+2X%XtaxݒKh/*=#~-P%,s;_Wc5E% zO,G\ܓFrtfcXƏw@D-ZDI "qO]PA=H+8D'F8FΛ.8jcyY1D׽֖g3V JEd}U?}T6")I\ ͵D+aȆYj9=K>`O F!wfrIrDiO3owd1N|%2%L;~ڒqsNv/tI>W(gd2*⹙>N,%mDLs}PC*>)A|8ciŌ%>IE֩bkd X[t d2cT@V=AHfCS}E'YDmwӏ}ݽdQfJT*7p_ Pݱj'HуꏄL,N)z<:W:GH16o4s0~9d%>]{Z@{7٤!hLV:ztNy ؜!\]=?>%M<# k:$}2I]}Ӗ'-Ř`N}D΅Q_:{{YYvQ;os,Kd<9 Q)lN(7%9M.,n"/xpJӅ@F׹d;Qf,vPgco~9Bk )aD.zMԁW]0/?L.{hxBVRGy1J )ϬM2 s ~؉a! 2賙V|>B0ĉ? 6 :^IZ黕.kZFϽ;iB+y.^NWTH)G`{VdyeAsR?s-9,LS0wty˵~y |ϲ:P_B)$^8,o3FyE3l,2DŌo՞-cS}n]A\, _Nq# ]kVB`V@ 0Deta>Q%#i۪j)|S~itxӅ t<ɣw28Vp?7&I}m )$8-S#.!~!z üAW+19D*X϶%v7%,7?_jg-XٵFBiQ',x SFnkeu&\yUY Ϙ4f;keKK`|.8H53c_LR \IÙ͕W^]IEWpP#WE=h u:xV +}TU)i^Y*N{@]x$`+| U&ײxvNixO2r$]yk@J-oB|SҪle f61~^gR5k +̣Dڰu);fDE:/G 80L4I Nb|Eڀݦp\0%yrh\_6-agAcP=䄿E,~'=Wџ[%OhRP&(oU9E}\A-m [MđTL:0FHDc3adVyIo2d=$3mbj-0UGjX_2t64- N ~zn46 fU0.ulZ{ jk<uDXp/i[U`m)qmǮ ZԘBɵG@\iS!ڞ S7usCS-?sch0&s미,ɧ5B<`F(]n?)t $`c8=MgsE$o4X| )Ȫ{z쌶esX/+qhPMgW[$+yJ_yXҞ¦V5yOe][J>}6QM~@]zj}3{Ui'gӛCKYJ"`dGJӣG pXC̄c52/ JRX̔0Tr@ h kȬ=ߺܓ̳)X"=*8H#G?6;Nk+;KwƺUgM]Q̝͐+KkvuջIgu5OI]|C*-Kroڠ pڨ\t"+30u!\?sȯ%(|i1&+M2 Eƴ`1Z*jA~3|VsDAjBZ"~ M-v͡X Ԣ~cBRx[ѷRn-,'L0!_"b;h1Zg>uauO`߫D;X2ggX zBcQwʉQH܋z5Ge%3ީo!LbI%btDFB2u2hz ]A*IQ@ޥ_ 6I! 8uȞ^HVm |G$wm \A񕒚l.ףl Z#8XͶӢ#k^>7z;ˊڪv QWs5;aqB㌣vdQBD19d:vw)#{Zgm/^&cOܼAQ NQ?<CQӘKjE+Mʺ"ʁR%{5iuD9f3vlyoCFofTE܌Y#oyF%#+(zANw3w~xITKY/^yyJږ$O 734x5 ^/x|G'8'<9(u -֙Lpe]Hm38qbN1mKD3"ѽ=z $h&f-z 5F#uHy0XR.΃~~..4GUQTUQd*}FP"dݜEB/Sƭԭ>f3KXdZYyufI?vkw.N1 ~ Xqqᩣ>~iSJ>> p2:<ε#:qۥ&1V:;ڮEk%j`6"6wRЃo5ARBen)} َ|QH)Gۂ؏ͷ?a@UM>4.,Y=\{?Yt#r>TH {9V[QtjW~E͢j  31%&Orԍp9g9i>?GΪIlu-|W-5Pe!MWdʷJk8M*{gz+SťAߙ\ x u ?&41޽-`^0v8'5 O(zTWy vȉ=r]Fs+ʠ+:&oy/:ժiO/뜡?1oM}=8PwƇ zؽ.7AO쥺dC"ΈFOx<3M, N:,\`ƟG`umTt  ?L+vL]y}8 3t"eA `Ix{$> ˀ'E>cABsTTmnoZKT3Uԫ1ۍ$՗1CDsHLMnqfm>WQY6&z4hu+YnaJxcsX7xz_7^BTvtyϒD%+١uN]Fuu$sk E=9`H n4N?*k*K5`eS2k=FVʳX@̂> τXE1h\dANLKiO jK&)c :hj(yqiD2/#5mz\?b"ħg܏ g$;'Ÿ>%Rw Tg4e;vJ)5M#Ts XN892-!0(q#zH3n#yr<\ܞⴀ"bd'&9-cБmT(N$,Nfa%x e4,|A|v{\!|qWlʍli.J> |+(h_ӟEC} t~.}e9袝c=Wӛt'Acv-`t )R"n~𺥶?.7$"]= ^G(li[/)^0nvaW5P03zt:2؄s/\p"96@o5"uP;"IgqnR:o#tkuF`U˶!~<CMh2;/@_Z#Xg%; ޔ~yڠê2bIn_7Ia( z|W5ʞdT5 hG}Vd"Ji,,Yѭbv@AbzlbfNiue}fā'vklٜ.+@#~zZmM{-;'e<$MJ%&FF5Ǡ#u"2rJ~Ģ!΍qk`ZSꢆ4(AϮck^mX%^K~E:DVd(%W !oYV'4%S7Od 擼UX5|_B #8AK 49ZȔ5EK3?LRVg #vsH,YBuI\ ƻXS65{&}ZvPȎЅ uV &BDo!SlFd 9qG s5" .\yމ2*0|m}N㇘(퓞-pd?C7^JyNnm|*mliPٌ.yoVTn,S6{oS, zHꮏOn5TUa:K-mDAUj[ܐT2&uX}J^,{ ,`uѝq|-+>7T9 Y:Ufl KTeFBJ¤,ZاjlqPmyUl]'N Eǽ^D^RUƳp&V\ ֺF߹Dj]cWƻʲiaT ;Lбw I_8tz5I;I[J:pD}[>.:>B2q|SxG]frѻB R~"&d:*|bOiS;hp"`PxaSgg򼝬O3 5?(Q"V<5Cz/ջUpT7}N#B}vI񼜡0m,k6@J ,7V%O~ t.&1'F{24)AiاG~"rͳw '? o8nHH)ȪW08=lϾ_ ۋe*i{Ck5d$2 .R %oQv\>BuQŊCgS)bRD䕦wQÈJI l@CYt w'磖,uw-$N7;71G4zZ:̰oZ9CswG%+*Lsu)BQeanjh-UBdH!RF8kB;R oY%QH]#9xъ{_{SJ3Uۡ{ őoreCg $Nr11֩&"[<wk'+OR_H8y#j&u)PzBO +)sV6D3deހ_ N+t (7/AN%U_'&?yT6k=.tkFLgoS9: A7E( J9WxH_,>(/{n/zE""t9es#yKv\̋휍±4tJPOa 3K@0qlPfx aberw73j> ,gL;Ym+^9e]p.9D 7۱N1|w r(x{26ת+q=U=!`Y9Bt‚I~ѕ]:H'S[ qZܶyYhs}jnp]mS^cc_xH/W-N|fvv_C >,F6[ʽp ()Z2gv0{.aAUӋ 2Მ'y5(hziH-BmZ$Y# $^B@#n !o%Sx ^ g t5\.^0u#XA;uDeDZ+(Nt6jE2 H/2-@}bMNn}c"Âr=Յx_\HIS49'?1D6dcV]o ݿ]4$CPHݕ"V.,s絕Uݶ \.ށ_IeMnlFrduN`٧'>x*\u(Ȳ-1\,*0u,❄NLV%0. p]T„; }:Є49&D׋wC$Y>R"2g[7*RFpdnVLʡwyB0u!axg)<@4u|t P6wr~9fB1θdcn;9>DHn}FOH1?LG l4I$UHfmy?&Β'36P٢Qyups-v› |[_[cH*qb&P#}4֞@=7ߦ.@Dߏ`~!D݋mi`<]gIXAK\-sO.2;aÑo/**8l.sPUԍDG (9m+,0@J/P> stream xڌcnݒ5Zm۶vٶzʶm۶]6v.[=o܈Ϝ9FbdfĊ*¦f. L" z>69^A$5`$+ߔP>, 8J`6m5yvjaLwZ?G׬m=,e:=_R3UkB G=(W3HidtpJ.F\JLh'EKν "s"yVrNDgO,;d}y]~ho0Jw N7 mrG@(+| Tip56Hw46u,ڸ`zBriY1*IZɍϖ61B!ޖ!w>>}'m2 cNi+IKy%Hʄ"mEq4 zaTٖ]M'Y1_FgLbn|GT 8k†(ܚV*׽Pa/2F6\m}V1L-{au*){xQ5),脼x -LՋⲴOO7w#tuS^ɾ \i;2_9h-sovn5%7;wlJ&# Ns..b`K?9>&~J2ftmT4-g,Wb5O@Ym>2/w332gJv{cOdD]pZ?躪F&埢t+EHPsu:9n7!!MPq8=<"kb, ^MKϜ-&PC=s56W`g,+=)5ݟ;LShVFӆQ>٥}gL?P3|JR*5Ĉ[ҵY[5W}nvdDυiCF} A?G/Avnhmc]@y%uòCLeh)xdY8[r0v~Lq0zU~hx_O 1q ܔU51c=ֺ5xA)o#b,zGlzDr3%0'm/nL| NZl /! ,K~f9p!F,zcN/Y# \Qzȣ( {cdO`7y I[+s~:VupAOʋzPNҦm="@/լsaz#G{`.~{ | Vua :]lu sT^cVuo.k[F#z=yϯb+" 9iI]GFg! :|) %Ezٳ-LfZ$dgDm{ܱ kQWRn^<]RhTW+jB;-qvfuIBo1gb 9R?%;gV0ђXI@9Y؊ܮAH&>JpoTλqyq6- ׅ44 M 2eo%拿L}=GV5yvvh-զ`:Ub:t10n.:9 ww.rl]XxTm!8 OK?2q0M`2ɑc.c~3:s\O'NIuj2=P ~ѡt<=e)ĵ@(}t55a"DIę( r 0_J6܌2+`ȕBt< AEscv/bdgbC5 IJ.Cm!!|u |Y)!"4I(2AK8 J=9;>z/*«r+E=$='ǐhT+J S0ywtܙOvAʸB%(|7 {Y4㿤T6~&'#c΁!Y>K˓:/E6;b1Ɍ+O!~w&Btm0RI {sKB% :9s? ͍X0'd{"guIMZyb9[.E߅6GêmBt>|qv\ ]iA W~[Uhx<ۍ,fM슚jaa:1>a#ɘѯxE|4F岃Y90/O[dMO|/?WQ6P2UgԬD00qYhwByɝ@O_UCKjз- 6 =Ğ؟up!WSo?01lOt_GlqIJG+ `k'J4e]HZ!)9x\adӾp:7NHuk/{!SƸ)NM!v|Hes(GCp'6 *Y!4\[ Ro[-MHavZ> ^>7-v Sn"Ar w'xʾS1Wd ?5;|'|",wDސfo>xu:BUǨy"BaAx9h:QJ2S;\&T<"&4mMʺz53zY{ϧ_|‹/ugxL";Ca)6bpyv 5oپj# 85 nU>uf ON*p8YR9oUR#3\tB}t|e}Q=~K&z{a>>pۦz64MJ0l9@|*|V1lSGWoEÒVTlc+n3mrsm^EHl_>eW_ޕ qt3sIiy}pG Otte8t S_c[{Tà!@r ^Y7sHI@ҩ :[sboܱ׼= EfmVI [x?N uoo8IV&a-A:hWK>AS6ؘJ[LDopߵ3^zQlAm [, ( => 7GDkF~]ʏH5!`H@!5c>&9C?'zmsɶ{JPv|*XNLq鶆7 "S~ۑw28(5Q ۿƜw[y2d=kFF+E\ׁC t.ҝͮ׷Uu,;J3rj o9l8 ]/{($QG-\{Si`{cY 4#TC۝;u#W9r.}c9`f oHЅ^ :t1(,<1i5$NCDG@|%پ^9Ӓ+[SE7*0@',N 5ԉ9?Ģg>`ָce/pK VkD^O=nyNu(I:I۱R_Uysoҩb9\FO8KEeZ g">B#Z_`9T ^Q?WQd2$X xS`9r`n^ʞJ[r`>U51hylfīTa4 .\.IɎ&[[d2^Q95ZnHӓ&\<MQe5VAe.AV%, =4hvP8m|)eG`X)zTwVӅ~L#!FƧOuAKE53(_`O~~aCQg=Peܴ[Q o.52YOȩ;ZLvlWbMkQ-x+(M I1K։MC%"?#aV>r GϠbδyP Hn2!:bLhDך~Q[m{UbXa!X`?We}!'\͈TM+NնH# 8h|Nk%ʶqѮ vvp5񟔢j\mwS]J .B"s{KBQd=lkޜ > [s`<]9d _&fW z HѸyme%WJ]R{ 2с|r&R탭‘ cD.YwԟJLmA:8CX4@"uXZf xE[~s35x HWo!.2g!:j7 mEvEY9.,wԫa%4ql>l Sc0ozv85}u`N&UeKM51h`:eMypI_C_<;z 3Z&yaAxKl ID&W<8,2i- ௛K֎2Jl[{i drn:ukGd:!)U $X-QdbB! sIFT ZG,?:ͩ@ HTe!߉YNߋ dCy_ii Zg|-޾ e?)O{Č}*idZ@[S:g&c(6Y奲hrW5_p@+Vy@g"&$}&zkAI ޕxʥ AdK޷ؤ`=fVEr"B^{,;5(G$2+a8(~[ gK AR4bE%jӑіt `PbB|.E?FcpG/5R ?9~ŏo?c: Gȍ2UDz>>1S,ECezTNIu?lOThQ#mZ2K"BԅM%}v`[=/r3|?'iߎ0& N7 =Bys mo~~#ߞ^Lw٩̹/2/A#-Q mkDž9pycᮩNLELb̡ )YQ"q~*:>Pم p4,vkȠE%I~bJz]%@r:8S ؎DْRCTд3hstÿAvxVԄCqFm3aeO zI|}LT+f>2[6၎ju܁1҆GNzb+~3[Z,`p*ͨ?Q"i2dg446\h-,nrLEqSy? K|b=y[ۛk)!zҦϝ}6GҘR-FSKxZOMHňw Rgɻ~*~ɄӂilD )N10RJKUf tl $aSv97:Q&ٰ$JCuCw# ֧>(xX55W] rNܪ'%+Ct%]NCeQ}VvC(TQ87"EG-˨9q~ꗹD,X3c9C`KXΤ=e< ^f HQ7wڮ?=|1keAQ2PRWHǦX!a7ܠJ&ݛFyyB\T3yQfV,k9s"3,b(QD(ҟU$n~_yU@Xek">% j) @z=,}X:_a᫹J^Ѱ\q;T>RuFۯv)@ 10R\6q[K[-[+NB; z f@ٿ0M`NT~1=<A)5%6b=DsARlHKgf+~~1CWѠɑ){\R,ۀe2haXA~Y@U_"Qaeg3p|/%viq0qfb2 5Xъ U[N7*.MYކhhcc 3DDHAS烡 ޼KIB觏/܊١,(C r߲f-7DEBz ?NpmV,2ծV B\C2HFw&vu!ta @}-N6E˯Dz=p]vSİdWHxR:Eo H|?lD aR i&Gv/R9CN>X( Y@NNiiɴYT}2;ס Xyq])0 z-pRrLEu>SW%/arKsBL$J=`D-+r"uq O#+Li`5vq,tWm"S_2|ĕy23խ ʅ<<';Og?]gDQ{9Ha\}̓A!| u>La֩]L Vh+(& Ď rmOoۺP-hGЭǬ1ф-!7M7V$O݀ˤ{X jFI= C Io7fGWŠʚQIR1E),C\}󻣅zs}PtB $TSǠshHxPCi&W48*U]明l1KhpjFU1bh `ُ؉2!5&y)#&V5&W2u): B6%`GY#P I@n)@>IVp4O ^scD(t2K:zcsv%zrPm:J{"PBWѹ) f*&Zgl;΀nO)wM(/GQ2YA!$2]ʆ$R5iL'7Pqߣ:s#XYrUS] rI+RaPfV{McF]rh{ΨvSM.MsiL}!T l`⏩i?)6%ڤIiDCk2$l> NwK{&jz`ܴ5 :}BnɉVxQe׉CpYlmH5~U6Y1&!v4zKL}l{[{12 k`s@dw]sJ3o,;Bփ}g؈Y4rځ/V!VTTTtV* <:u'i5 `\S(`Eyxgre5LCfKKu"g,\Ѯ C,ߎT^-$NVXmr a}r @<QRT VM'qcW*(+j%wCrZ|}g2 fF~OLR\wsηZ$F}M" P،2Nn;O+&@_!+5ti )>۸+ M\i'H!b(lP8 ~'%KmYI]3e`4p:Uӌs(Efe&*gŞoGeO ֢5s>3suzw; Sdz1>j.WCzS] UPjpMs)ed {NJ>q/RxRD.MX4Ί>dMg<Wc-CPSN  <2߈lr`<ߴC`U^}$5\oQ\{: K:tV]N"Ecj)?P>ZPˁ)=ܔ5TIqPY~5;J-D%x{@J^?\6Bbq{p"7iyԌ,9_ y)}D&V9B=#t FAޫ$L%SVA.l!'"~¶>\DtALׁ9{xf*8n ]y+s2pF¢Da.V% ƲD3ՙ#Tp"IQ3~HiwmHgO1;4H:o㼯7؈[cJUWP$F6a:C>\ 2VyVuVu)>}%:@X8N3)0{ku DD^n }P1֏. Q z3xnqɦ,:j^hO5,vfni2Ut%H]V^ME'1e_sm3oq:9q՝ D€bOˣLnr f%T-ZueR ;iSbY"&WP,"^ȤjhW>c eW#`wiv&-J p#qF5DH(Vs]zڱ2 ]JG}oCV61㨪"u5$crg/NΩ Fʩto5*LemK]P e!<` 8WŔQ$X}ǔz cD܇["B-d+H̜xpމ aP.^ߒm6 ;O[gMF2)a\G԰Ti'&v>z_uP2":q>`B 0 =85~ps17a5 2O6 dC&oaԎ%Hgs欨#"QacDK*4X*"'qhg୔2x6B VHkOccƳo,ycS7ug+@7Y_M4U5Pkc^7̢877d8~Hqq,R;ع( IwAK` `أeHRK0X}mD 6+80DI/uW{4Nf%{F#yMZGRLf7U};jo(hຜf!fQfy6UjHV?d5ҍ7\ΰ(Py+n7!&pɨ}:{ۚyv02\`E4cKt~")(:x+s{y6gmfd̚uqL7HGFa#&Nwbo2ϒ)vχC%8Qɶ_HlFVBCPk 岝OB~$=+\3K׼NlJiD44B7ͅ.Ûl닭`\iB'[N"̃2I|FW%Z ^lx'xQCmSbPx { ݅c`"*mhkBޒ5q}9CG#Urri j bDM'jXl\p &"M MP6pg|l9cc)/]W9m,-t*̅ݭ\?۝titLmQICT@FJ]Cfy) !YPw^(S?> ɿ[ $ b1>,^l޶$ּ|i_\-f_߱L tr- )8.eBP{\@ sH@ JU`JF/,"oHi {yjgcB{$KdkI󥒐.V,!_e^"T^Ux= q]rrǷn# bٲ_w@j5Q&Zy-{3~QP%ip+1x5mt؞ 9@̚#!uL' ˠs1LN2<݈A1gtZ=oiͻ4%71 HSgoo11Lr.CYZ$?HXN[)Z>J5G >0%% o'[^ÈsʕQ Pz(q%`(uؠaNܞt<*=hȚ #:Nj;| SUT:|wKbd ׹D-+[HK>]z)PWm5ZN-ezL9ȃNq/3%Dl@>m*4^֮ Yzn44IWcϡ=idw H@7$5c1D%VY)Ǻ *m"+6YbYL߭mNDU꟫Ͻ!{=j0FHT]~ddv˴U4o!e,NET9jM0KcVvF Jj]eĖHЮڜNBػ֫ OUԐ56}0['jt!zuc9fhR'iCXVe@%,ϩcrWkS|IBP5̠kDSCQ *wMlW(Fb/݆s=}+j֕4z \48Plf4><=z^^8-u1 բ%ȗA;?:^%S"_5E2K+%6Q}YF5b9FfN8 2+刀3w#ĕ슨;kH(H羙)~blbf-w:2nZ2,l`Eх+D;[eU{+>#Noe_i1QK册Bk9/Af͚Ϊa^ܽw2d/=qr M}vɭf!ޤto)z $Dr''I4H:8Z<6֙ ſCPd6 jDCJڝ>Ss*wRK֗k2H(0 ?ڢ(uW R֗*|`/> - ^U>fm'@Xď9zNOZRvTYb;u>d7a٩б0۰oYRe=&r0e&}c")\.@}N*<ȤrF̈́fRU1ue^F1.oyۂh9#hB p]Sg}MAY~EmCdfj ɧDRQp+u-mX!uTdz TTN3<0ehV4X#'ڭy@ى6D_ ye٦NB,ԭ'c2fr x5\0^A#9-ī ;=yeWKꬓ"ELj\VhʦvXAĥ)S+N͹~A"B!z:7Qm>!3$|n[zeͯ!CM<09fuª!4#6PkÖ27`3¿3Y` _%'`;~g4q+[^2lq@ Y?v 8-o<"#jasI^ D,舼:%|L<tH)T@!"||)rMT6M(tw]zbU 5 /?];FV$A*W2}hS37{#aRp~ꩾ[v #NAyOVV<@̞J eӲCFg^ L7l*U"Xx-7I<{r!`">>5+3!'p]^%4ZM3wj-w?7j]AgDv=0.U 3@ \nXEm+-Æ3tw!̎Dxx˾ex#*-bUCwfG` WeZrwc$}6qکB\062NZYOn'(5rO?qvhlʼ5Vx3,;huE|"¦lMw>~IA?Ph=w3"F:#`ipb = x$ŷ~ySN35=Fx."ڝUFܝU'z%DaJQ4#2nMΏ oG^m=d%F >yx,C5!׾*5ώڒʚ̇}mkrS=d7&SDp6(u/pÒfQ,nPA4ߴ);QԂUN%@ZgI/_b#v]o0.'XR9`;1N18%e|gpTXApu0.ÿ- ]3W cB \ ̘75(  b/NӜWvnXKffHtD;cM%ƠC_XA*\Urc4q?J^[ #n0}Y!6ۜ`fuyBbʻW0:Wh{1Mv~{ }.j[$ASgksXǗ;a@QJmb\ qX[!  Iv.b>=N4*CGRlؑFKAI6t yRtl2*ee8\aљ?*KnD9J&Bte*4@B"mOqK/x3N13BE^y96,UBOe+#9_XQ4c|cX>!f)dʼuTDtH\ܢP97},RN 2NƁU'N-I͢Mcc ]l`?[ղkc,w'> stream xڍweT%Awwwwiqi[ Npn}gfgϞ_[vCM,fdvr0 kw{3WQ5{PAn`'G% 2$ 5A1gW;ɕ a v89ۀP%]6$֎f W`boKb@r[` G5Rl:ę/efDRqCa,9O*Mog ` dq{  d'0@VI9Y}-}!#tw2qqٹll\\>v Lj+X /Mg.e' no"Kcdu@l@ك-Af>N^ ߿4 d X@µ-A`G0qpNlars{,A-Ga)G 'K5@bhij?m&@Y]vm ~l#dޟZɤg]uq@L rKZ%Ew'iG3bDgZ׋߫I~lX)2 ? ;>yBw^ bGa굩}znqZAEyKfR$+/Żw2$F82_m%ZMv~"*"}BR;y_tyъ)[^cӹ 85q)4.NuD!żdYVh+פ4@ܷCks:TL#<%(&}Wo)rɀAgV`OfC}?VF(  xxH!IXNF H7$.*?By9|N |H\J*ac|1C~Yik0}LDʅdI5z\c`z"5Ox~i 0a:C͆t^..D.~亱<:9Ӭ#Lht=>[: C{o֍F ^2ed\8ΏVt`ʃivoV;NL/$CeYjbiH4:R˙T$EGT^dGM&Ee(0$@u7"U{AW31%-]. MLb%9h8n׉w%`=@쪺𲉁{KwY.tE꧵E-߷ӑpN5;/a0d>`&\ڏ/7\{ubR76Zq>w'l <}z9[7I7vd RNbSB򷬇弗&y@%j".>|7hpt6łoI%:aJ`YWnh0e7#YA^:6`D^|r$M8Q B0_#L1^3/fɓzuލ ŃryɱBѱNj [J${VV)vgWZuJE\pf#7WcXi߽Ҽ?$՞9f0wE]ʱT:VA&5m#e a2C4@SN`͹tY}!>\j<o O V(+m@B {j1*΂\Dh2|>?cSn7Ю{/0JV\|x85m9:yӤFQ796jt``1c(RK cDŽ.2tf I,҂6f*f&BN'`/vU6/X5c0zerѶ5;ZU1aws.RI?;n];(cƋduGaB{}GH4jZtM)LReb[c k/A(ٮSf'jV}@o* S/iBø/Ν]T&xƲ ^ Tk΋}! <2Nhbg[хh?9[(SiE"FVa:Bx|F( o@|ƞS]xfD~D6Hd|˷6Iz0ќ<.Sˋ<%n_:[g'7^%?[jacy=̊j}~D ĸ{l|Z'aETٟmLo*%dNmŽkj{K*-pn+h0ˋj=4P4x>k9/grW'pHQc /׉E443u1{D7lM>-ˑp:.mX}~~ L%h?Biԭ2cϵbAy Bp;ǵ ΄N`xe.X[1'Ӛևl "?!Htmv~rz %>GVlXtIQbʊXt< g8o!rs%2ӕ`T!ţc H`![3RT4O/ϴɼdkƵۂGMquON-O2 Oy?.2;s.3?Z2B;V!NF3j^k`Twϟ[.7=Ɯ' _]#⌆pGItXT_X^nq tK^vd֚e&Cץځdv)rA a+Jն5Im1|#P~}>{%Fӵ߹МuNȪQEз9,f7p\Vm N-\tסV [f4ZhbK _ƾqD̛VDѰA@0pG gv;2DF_5~eW(V#4%JY: hEx[-쩕 8UP'B/VcxYH`biS_R˿+sC`fR}G걈ơMi=5+M c! Uq(lq~艱AUrw;~{pׇkyb`vҩGQaAaSћa7߼P:l>Սg昍t#1jm3bBllۖWWuԷ-Śji~m1Z[YsF`&a§qZM(C.d?1?5 ~"-; HANwҵK>ȍ#J{Mv#<7[dI%`Dms\ }:e67|u]ΪGa48OR߆l<{1tљHpLj#CBLm|#)UUϜ6sP=c;CA /Fm139Ґ§^UO:9QkaGvֱӮfrtDEd'~5M%Q+ߵ90Hp[ &ʸ%k0mAixFaފ1= s)9)>Ls0E℧u0,/I_n^%1W >1,=0/҉ww|WY wEOC3+@xD,z日O-Zbt4g- q .z,]yT}⇞xxM2^/9u=]~J$?G능1.lH_3U*&Q5V;tc'GɠiP=P5ܲju1?Gxy&ysmW7Jr9ovKU<.+*Uc#N4,K\_>TjS2G s3\(rwЯ glx޾Nd[|k|O<7! \N)ƢrM򤔪G(imV>hU{TՌ{P8*+M[/]Y|`RQ;b &ɉttD6g*h&?yHY9#Rl#d`qf*Av1-@Q냓!_ rGyBQ zJ\O]u aM%FF\Zq6*gtKG%x ` &BP s흈}vuE'x9-q}㭶ANa1 ['Y܁_tQ 4ƣg4g:8|LYT~K%cMqD&`Ѳ.sW wtQNv 6qɪ>y׻ _|7u-WzֲaHqWڐ>P$z˱v}6!#LjbL!DxxĒJ/ݩq6N]xlt*ѴDn&Tf`Gpwb$֞ gͥPZ?z:  kT O TmχdK,s'¨{͆VHn2R{T}qj=֟^L[M9'8 {rbBicN}uaN~,J$,=^4pfZε*]Q_I0`5qO+Fs7JC{*ZLM('tϷWF }+K: ^XOg"'W2{噮1M/ YZ:}y,2"=i=դĜ[f!9! gORhs]edKZ鼄I< Iʭ#-ITi>DasWj";%Tmw\;Qnkuo `ytwb΋CIk4Vݫ٬C?=AYI׺7;(' .A>|-h5n]E)iyg dOx t+"1{'4ow0 L&gg9JH *w>c'x(gG3R0A޲9P@,d[9&t~CDk "P]n,G2-ހ(չ.<%&ya=`Ny+ysYCxYJ;~u,cC\FM:K]8vR7kbW/\ދ3& ȓt87`Z8XU_[&`#ãCU*_hY&lfOW>6%s#-Yw [Ee8r+yU~$I@hҬ=1}( 4.ĥqyڷnKT|(ptN\FkL08*' q:n7GOUAJKN֡O2C9wj.ϕ}wUM؋tD{|?LG7NNWENdF䱂,<~zКơOtzE?*r0WJzw PYf} `_ eDc[V͚jQ찆IW^~(}vXD4|I[$E!JEuۛO_a c֢fxe}Ԅs5#e-fwR25,2)}~~<  3}bkKf2DϳH[͚7$0}c^!D&6|3k|dӵ O36N^Fܥ czLsUFYMꃸJ7{U>>$kdqECUvNRjۉ0z""1 F;dtenm}A"j#$DDQmQ>Ȳ̂6F?;@ӾA ~`е+FXb;)s!h LjS !ZQ0("#^#~miކ[APv}WA@mItҷG7fu{S .癓MX A‘nLe,PǩeCUj WB]~0s"i#}4ȖxK80]Ý\]gʤͶw޷ύ-ٛ;NՋvKEBbU|mEۉ0;[)R+p{qP0q^J?do.*{ac޳\OtBP';+Uø6 uL UK_rhlNmb 󢰁*gaPh ՟ٝ*2?2?\LCo=r'*z|GG`xIs`G JK3RrKuePj=äa/2Zw^,:rZ ˙=_ Oo/++=ZM}5vB]^sYռ,n:_K3 \ NOGG:np$*"1 ($0SfNIaS4|jZAr1:!o#<%^HX {-TobM4[v!x='iΤtmHX OHme8CG *Cϻн.쁏mBqV{KvuwZ;F¯ܵ/Ic ng&*SG'}tEγͰMhk,u7IƝ7)84͗CDߦMIUX,jw *km*67@Z6~8*6Fak֯ [צ+C j*ky0)|UWąȹ+>e{SUC/M|.鱊͍*  gS?k([05Ȁ|_?;%um'ƕO#9S| [uqn(B,$QLƟr2qxϼ{dW|6 A*^_|ceoS=nv0-e‚CQZo\k(Ӥ jQ( M\ tEp{ޘ)&?3DW_]q^94Euu&:2gfm]0v& LQ d F]/2 RlTJڨy7INXH|T-gUb(kͷ<<+'n!9Ѿr jVmf~#,tvuF=VBn 8x.bGݼW@t;/OW%%zm%>kCx)(4i? uO-7#`Ź܍YGm5Gw!'ܶGmӁvn[b(jFW>+I@c-]rDw-R{^8|JqoO*O*56D endstream endobj 801 0 obj << /Length1 912 /Length2 1712 /Length3 0 /Length 2327 /Filter /FlateDecode >> stream xuR{<XmIׇ5j riˆnԘQ2DҺbQ+C6Z\6B麣9|9o&@P]Jd  0DFƤD)`DRH$H0&AD(n̑*}9ReN@$ \ɎF%ѬD a4&T$8H!|>q%1`!\×1%=BcwƇ'y0Hb%OM,$< Z)2PMR L•P8I1 ymoC:RR V*D0o'\܂%()H% RrO-Dy"`s(RO2 3O.T9E`s)~Pc/r"aWAAZpxJ9B_"w$|)WxU(cB}EdL"}  pHB_d\|@ HSA, JhG+k[Z"2#[pc'%i5i"Fb>Kg(p4=/ғ'ULnX<509LR+g%r,|P;9.UR1+N$8Ĩp'We'bޏ--wk,<_B) V|v^[A|IV~jN1ͱX [ LW/ز)~z[N/-H!-(X}Yiy$ݎ+բn6x׫<g%O\]A&oBDB:4ջ\{BTe ?Ϊn5yh:Ch WO掑5eMo[El[A-+Zq%o@3Qbbl݊Zqp낁6ŹT! (ZN_5*z䱊[tӑY!g m߰ؐY'84ئxĔYnbBy M/]r[ endstream endobj 803 0 obj << /Length1 831 /Length2 6017 /Length3 0 /Length 6603 /Filter /FlateDecode >> stream xuUuX޶%E`HJZA%f:)B$F$%SA:[?:kﳿﰳCP ?Hgn(>}'@0g1!\%_ {)=zBnH $.),,)($ID %H%`WD"ahUPIyMR@dďwzpJpqzA@h u%e !PH?ZYq A} +=UA EEB `a CP.hBH8@. a0;gW( g(A]!vsux]!`$_`;O$ψry1@fvRNUM|CB"D=O+zm*J_ȷMl\ 9Rb$f4 !Ciy mjByʍsSoLfJsԗv<` ш ›3*'ZPUv.ӺDzJx1aiDnmw<Ӵw(\'p6p٢tSr-RSn 3SM}\16j^o?v2%^gyN$FWMs.rrb{vpDk0}=%BՌ0/FAhŻGG^>E &]ѫ|=V/Vikf 3IIX|zHx\^ygcg\s~ EW7̦\ĩɏƱO<[a"~|skZjkL7l :_;tM{ ( `hx+.E^YXDjBq=җu݁e'7قxX{ AEҢ2{mI#j$X_YF&Yޔ7SП\Kz'øWzIUP'm/XMkq;0!%u4h7礄W*Fl~ &`zx)x^[U.07vdu?jWC]'Uѥ^2`K$F g{i+HNk0upǗ>㍩}XQ1\$](Z&2%0 A8cҼ LS*(M| eV%_ \{tVa` ʥU bbz~A{RJPbl]:FrO?:} )h(|*#֤17. ζ.P缴HԼ{㾣~]&BK4GghKf6Ve}-@L; \TMyӏ#C$;%Kf`!h}{ B iiJ8o i/nq l`wM-z!{SaKR|2ǎ*>gxSnk{sanKhf ~|rDEiP>3jSFg\ߚAkd>1W1}GbZBZ, Q[ʽ 4f'Ë9j{-y hyqJ}9 lC͕rĠ=#\"/uޒy)M~ٯM8T:VVUl|nfZ3iq.R48>gKuN곐񬍻phUpdr>\a'1&πc՚ˇloꎂzee)w ЉIכ,_WYY>~g FTgi1\ݰ-W 9s=7_a)5̧ 9lSo?ޢ-fEPL=t3fÝ])U_$>Ɗ֛Y.JpﯕGIzYi? Ħ }JMP7%Y!n4_ ful5kK\nmcO|Tjz6bSYg>%W zQёIR~.#,bW%3iY ;omj8\pKּ̝Bh~ Rܖ7-A[CFf<7W# d&ݗ)v0Iw"Ԕ~:Ƽ%8NGdEXbEG;W"pD͏+'X` qwOz9+Dj^t'},lrn+Ʌljq1$ ^GtSH~D]d%dsnogZ%VUCWwm;n jWO}w),dOڡhMpK&q֒,YI~0U_ɨ~q_D~j~نjo-.BShKQ kzpR;"rͶ&8{:j1%$Ŗ* `M<؂p=ϻ3<*%&QL$s::qerJriV%Mb oW~v7a!d4HFt) _|θ Qi\K1^|Ʌ=1ϫsCZ 2Mw0 3gJ}͉lڨuB ~Ԭv/]OͽԅEx͈" *^Kk<AYx,[Ét:[mv.R7̇nlwdCR "IjA IN $s*9S43 ^`+IW08puI6$KjgKn +:d_\4(Hol r[R<RI 3Xv=N`Fp@vXxdւTYW|OV40#yCB]:@' 4OsNDw4o٫J]JP>[t@"}(鉌nJֹv\Hhߢa.,8*tn_# eUcՓ*3h1W]7'd%~26 )q(0҇u'_TRBorfa\~%DnECxtX\ _ L8#UXdbDw8.N#.Al|yjÝH/^g xŒJ| V&8rIA5+[wQUZJ߯ Wag- kc-*3f1~+蹔?֓ӎ:Ft$C2orؾvWzJ[H{@+b KPLF=.c~;ow"߆-=ϴW*>\H9H)\8l5ofv:ZdQ]F/qU_&${B8_[4z#s؝zJ HLřJ%3=.‹a=MȠqJ'ľTJíku{{T PܾE;ue(U8)_tWkW)htV (/XF6L]:Ia}@9ΪBIVO7݉)B=z&oUCC'cxU6[7mx :'x ݸ,sM;>SM^Y.1U߻T2U4D[ Z?lpVyI@ȳ,mci'٢57C4j uoFeq21oR00gsjX/0`} rkɜm{Q02> TU!ec ;,'ԃ>e9[ݜ0E[#%h0+s\oUlNSI7'Zu3.ni3 j 7O)@v]@ɪ"V!C[)-3Hsȁ''~!9괃3"MW5dK}/ >Ӝ{fJB|R[ AF[^,$4.$KKלAF.H_laQ|.@8X$n7!5Te3e |O@.gU]!d#~ˊ0^U vjQ!1 C@G"e |ZiDF|;g&͐ 13#?\Ef~Վ> endstream endobj 805 0 obj << /Length1 1307 /Length2 7070 /Length3 0 /Length 7947 /Filter /FlateDecode >> stream xuwTT{6 "H 00tR) -H7Htw{9k9*b;S- (PgeUdUwgUZ8[@#jejA`v+1I0QE ȃmn|9 $,aNp;{K(#.4. @F -@j u|4 ~.mhm,p{vvGo9-O"agc;֕9Bpgĭl\m=7B~@5maP9ɿ؏?yP̒S w{B0iog0[;A`/4O' wtzy_88` ٢cyVan}ck8ߟ>bgk] l+I2O .+??xE0쯈ٚ=?V?kƈ߶03(3oY0;am`7G{ rp5LaN07(D7⚶5bV _2 K- j K)[3;hdž鄺1kv6[; x+8qrmعpV6`8n8v3l }p.~;qW`pAnۣo:;C{0{TwgS'?s)s]W ͜o c}s6=6 u3 |5\ĕum5Aҥu0)5j:P(Cmeԉj%E;9+i9x)$fBv8@c' YVsE:-;qtx_yZʿ! ]VכhqX X4KTJRxtZg5O&-%C*Lk.mFN2(ׄc"QүxoiaΊ`UrN[X+Ƈ+_˼xkMVʰtzv,t8FMJ1Y%+y+h5`& zZlX,%a zت|L~/G Jc n]AEՄ |xxY⼛F^bwOrvGݒ\'qm j?yY`© tmÓ8%N A$Y?H(\SN4Ṇfp>-uȖ Y?,~ 8Cނ}n<=ktVՊF2]Ȉ:C @V0zi ܅D=Lw oD%|](If1a ]чWY'g4=71R1LZ~ a4OwK%b(sͬZ0tW=#QS0/"Loޜ b;͚kC\aaRh’)S&c^n _ɵi ;7Dž#!Y 3gpߑ#8%f$]I9tniS\x6?z*USnf$l?;o4q|Ҁ oMYFSAYsh:/d4Nw0@Z1;;gg&ޝ|Oj~6Ҽ͊rvkSܑ 8mQC<C}MgWҼ4j넂")p9a}u@#/q.kZ#(լ`Yǹ_W!tp ?j)揕E玉s|7I4[5 [#t!`i!I!ֲ=,O YUx O^]~  Rb_m bzߟê0lLD'Яj$mΥ!+b a c2鲀VX(x]eWMz⸶'퓗P hH<{ 䉟q  { [Dk,xHn: Nd]ܧܪ1<6gj~ѝ&g¾qn ZjlWdD"FQ.oaIuv+[S|Y r^IUlJ oyd~Ȥ=)#'y^^ql1zA1G.gxyɾ$yP)h.h8SL8iit$)#vRXt| 5e#hClz#O)Z Hڋe?ђ(IF!M@Ҋ nb.f{T"`kN5{ns>Hն/Ny+U:sulr\ođoπGY[PP_/'pLOYHIoB>֢@oZ{QpabQsS>Һk~-X 9M/_w5DYÈr3{3( 0Mov&߱wQi\%gUOy`0 7wA[+se֊*t(4wAG+=|vEPnjm-gg_gY2d`Q޹EM9 .oh4w յȗpAvq$4a Dyb:ܴ?زQwDծ٬6R+_8M(ڱRn4g*i4 p3U; 5쵛/?u_*Yq1oԿ$GUgW]A'1r4kw>0W ȅgxsD4-h 3`ʈEkG\WY5P=^$V؏уFϱnd[QD+^OM.<]KWmqKH/C[`\u/Q H! YSrOY+c<|N6K͸eCOކa,QI#8@gZv;X=wg;?O6PP"gi#9ysrg QbП8 Msӱ %C;"xWgG(XC|;*٪:ʻ4/B(u[qa]v2]ex<\\JnG|Nf RIKGePJ݅iF>4KP@rq7K+PZW/W qkYs.=_cg1I{F\;1K*^"S[Y|lƖ)\vƗěQP~JzQ@wN quEnj0YS/4A6>83QלxJv$Q%}i^3X՟J{o-k#l]-H_i UkόlM+"r#+#McdVNV2OskiscKBhh Lk[-ks'(!^N_u,jP>QZ6y6ʅэTk]{q=ٮCZ*U&Okݤn%9=p|we=IS Ӻ-Kg)߄t~?f|=J օ2C&/d]/<˟Nj2EJpi:8&!2Vc,OoY x2D@{愔Z?R*r/ޟJ&N#(}5ڃ>Fq7/ ) pm%QFӎ ~#z[LȋV1qU1Ks@ M I$+G%- 3!j slc/T.-TRM7H 4pxXu] } 5ٕ79P2mTE0s#3֦Qs>^,bj0vk2JNs+K2y\R8/0.5M׬k*:T.խ{|dv Kؠ[RŷN+Q~}2$ FlӢp@I}rƩK)$@5?9IUGSWE%V+NQ5t[I& Y)v.#F$xcA}Pqk_zޛmxpR e"ܕ-A=ʻӤmOxW|qAtۛ*)4w,=p1@2(X{6v8]!5rq{Vp?K 1,Eu$r$B=@at#J ؠEyL)oe-u"s+zn/tKtU5g/*]EiCe}#l+ AQ c`RR{X[/j/b$[ĩM(I L2 t®xKvTSpP}jbr'\Pe,m;BھUH/nmc >gV[q3w݁=o( X};}I(`гJŽ41I|yEgvK7K.a2A k+qu5_07Ɍiw%: փ[p' TKջz5;g~"kI>{]W?Jrdp/^G@*2}fz֒<œ̒X>xbsb,y,<~?MfOSl Ѥ jF* ,"&wa&9!8Un*D)kp[3>e: F}$3xȇ5q/YqtD~z7]DC̬&cF7Nf\1 h:x5W==3H'H{W4^30 ӨdUk<9휣,Ú`JjK.]gY1HlXp"oq#DtySm0?hp(.,KJ.*/<ԞɛTY f^qmwsqQӵETPm~ bnInc8itToNEJelܺh5 :fen}ZbrC#4wבyh 7 "ٯ1֮Sx|@,-h}* 5#binYG#_=;RX-Ec{D5RO#Ҕ$oPޫO!C{sҫ ύ{4([T~X=3U#cz]?adpN)7y6|KA ֻwuS ϹeYksVM%_m_'f5u:< ֑n0&*U*'МB_MQ'# ,ڵFϞ * : <͠D: _mYݶXEgIjV0F7ǜV\ M/hHmogJllߺIb<Տq1;(^2&=RgF~6y#9e.L_i}6GtW"?OQ*?Q:*> hYIΧZmPT8LJWR#mOmT"nZv&9urDt]-V86bzЩ%a ~f1A"q#ػ4zA2KIw2 ;{81 ~-- 0TlyTIEa3E1j,˾I`!jr=ၚ:h#Tq-I1n7-tSp'P927"Mo3F9u}9ZhX/*%q*V_Xb%/uwdf9cЮ g{)agq^ᫌ*m-boa#>*Y;`< ]+Y@ƖhI,n9sm pO&25{-l@j DKB6RtpwTO+Mf|QޢV!gaH eԓO{ɒ>VlMYhUt103K֙迋|%N{ 2"gz8# ;LY]fYu_՝p6+Mg 8H㱐e;kUy1VP3]xoL;L)2O6A0ĺ{ʿž1exvVԇH+DwxڳULۃ5S0弁{ܧǪoP̍ `sO[CӼXWH\C[]Wc:OX |FHg~k)2./8;#>M)tx}vp1d),<۝`Mg&bs %>WiA[ M%Rd Q ~Ѻ@cXIRR%oWO5m ]/.imE9CrU[:̊PUj׹Z.ݭ;e6anc)ozÄ)(^BS5U.!JY-jI: ̨Q= ocXڷǙ< PR{ . sܢP}ɴzC&m$lx`384<'Xs"[VP#%bD+p~~9`M/ixx$\_kCM)=GwxҨ Ai-٘ï(8)Wř*hI\=քID" lƧ<ߟ7\of CF-QzDt0As1=hޘU8IB !# {gNh3 ;=ovk@)}\9~%mTjH}~T//vz *wFId endstream endobj 807 0 obj << /Length1 1075 /Length2 1391 /Length3 0 /Length 2101 /Filter /FlateDecode >> stream xuRy<,iRgn_cKa}ȘyǼ̼2ITT:HUi9\HQ"E%,ern9'?>]~CZAaATcld9 9RA8Ai erd%0(9Af#T%k88Mht`B1$QXg@7Â1ai^u327[sx0mD"K0)̕aR9CQl?>x2)^(" Sr"2@nfN\e\ O0EG11sap4‡!*4;mDApe FPDuG*cEL-HCrxnP`ݛrDP>M<]#?5e!µE0&!$y+$`AaW, w S!h)@(L(6&Cӝ1}X;k=NDŽk&b< ЦM_UP7z{2:{4L#rwDQn*8r"bb2<eрI W%8NvW2e+诡&bd!b“ .qȤHV?"SlbAT: MQråR|_w5#a81U\& `ƌ 77䃁_{"gp4% f5aK #R%sֵ:^z knI3o 4+nbn.'o_jZszK;fgaVB[٧N5Ks[Yow\=^r/̻vRnB z> hk{Gڧ e PAjyZeWM<:7ckf&rqI)>a6[3vKV1YsZF_r@Q q[cr=aҳi'V ml`v0'ܽ.}&ƭjˢ㻨j6GJK_ygA.:J,)!!OgmPp@xBj{ ߓ,꧖Wv+-8ñ+D>v]1ELEPknقJ+mSY ZY9nݥK?yuo2ЇQ{/0zblqXa #_91G#5g5/}^1C$b;=ێ }Ve$(Bp@sL6W>ZP}4:BIG.9TFڕNez ;6%֨ $IU3HM!Tr1ZۻLPF`i lOC7J\4~m9{[[ſ&KdԖ>rmL endstream endobj 809 0 obj << /Length1 1635 /Length2 9053 /Length3 0 /Length 10138 /Filter /FlateDecode >> stream xڵtuX5 t Hw7H C3H#! "-Jw7H99~~\3uf0(G yy8un@W6#+@X hY#J2xxDJ`(!Xy43ІV@C @%r0gOWw~Nߝ~WrT0w\\M+胍z z%]-m=Vzn0q7Ph+%=߿`[C 2 ܿ xvC~7fP{(q9`C Ÿݹl.-~v8xxqD؁j{Sk0]+ C_bB ~t+6SpB0~HDnp 1E ssu=C!o결73usǀP7i׶A8WG0{ ?>u\ğd"B=X dp*`? P[ y0 0C bM>oӵ?]KzWp%W x fCW,ÛS^~^/j!8AOƞY?Oi-S/Ag-#4RGIo ]K4g0ԕFߖ>H4(+ȌrfhL|cR3 5%`0-'q7v8δeIF"WGBivvd%Q\4[fm2/xDù*r{A= t؎,;]քʰӶR}$MYw̾JA*h\$d_5&\fբGԍ,\ JM,rZ.mzyatЄ  1L\0c=֏UgƮM7zu5'W\g׋ 'N~ͼc=[DYAKJ %Zʃ|* ǸƎ>R.Biς=OKxLߺtπZj ]sC 5,[6m_g =8S ( 8nC .EWe8q\m퇴C _ǹ9&7X,IZgϖJ;L~f2aVKz>|zMI.1-qY%OC_Y WjؠX%dٱ95 jm6Iw>ĠXTDi*|sT$ݳ_Τ+|A5U%Iԝ?s]Quœ謭gl$ is|۫[4)rbW_r~|6BvH@&2@2ཀdN]Ϧcc k j";H ԜmZw>I%+ nŮLq\Emt;D<3Ió|mw?1)"O{?=|3:z?;KÊ4؍J`%>n&T9]MbR[y!DL#xAً;df[7:LͪEgAs'+#50RcBJu07pOnqm\suރ;+QhH <2YN9+*}f032IqQ=;kݡg嵡x[X՝zr}IsG]݊x[jp 7 `QKSsKdrb-nKylfqD QUx{6QK2T׆)AET-$!lr$[N>k#mOCy6Oh*wظ!=sN 6m_Y)j O5Y^tv P uSHwTZ|i]qB'Lu~O-7ڬwy'vW(:BsolXgNITօTfO-J^<,FFz -E!]znB]\ܝ';yܶR틖%v3_[XAy菚;J&!+W4shۑH5g~TY TQJm Z47_ʷLuP:5>:}O:dMAq_X@i>1E+D!^33x҈;^z[^hE_˄0˚ج؊_Ж}z*@~aI ͱ{tU/ja:x31Iƻ?b|۩yC ;~8VC'^ԬsboQ0Gc2Ok[G(Ȳ.Bj)bbw]Hس4/R/tDl) =?c3k ᐴ jzK]K#2:'|{,ȥaNVx *Ra2]tG= GYl(.,6fHK}M$g %2 =^ռ^ezev7dZ?`-zWϷH9]җ8Z%Fʑ ̼ƓHݏ@إ?(Dw\ZG2.6A̜gSU \5nxEmPwĿAa}Š49f-1 "c IDt'w3T!ƘVH]8~aTILK=-vo7ܵ*u435jV$Z[:]Q">6 'd?5D9'MM#js4 heVxx\kq ij|?p/574"֒-.QNw!s ;<>6}ɉ5,X|"p7C*4V7uMK ]W݅BGsN?}yOwr!]& ]Bo_[O/6e:=o5˧F@Cp(PQqKp'n)3]ʄw/ ~A1Wb_dkW [+`|,lڸ_]:pݜe~|jTZ5T5A34k/E٧RSH2¬ %:3R}A[Ow䠴eFFApnUGqW:Q1I}aһ2 /{7Maɕ7C%?GV=};nuV 6wjæةb !cZJ9(N %C+ZCxHOIGHTAX47e65t,EjJ*VgT&ʫyz_F4N}/}W[z9ME_?3Ң<%} *I"l}e47=ψ4KW↟B) 1}_ˬOP0=l~p7ɴ?M!pĤ˴TS7N^bcD$cpC\6'i(P$&5؋G7K˧%`۬[|jۘրI.%~!]*h+~zLb5r=.HjK$! ԬW\3Bq.Vgg*EU-!xr Zס/.2qwEjl.’k(an[jo,[ %+Y%\ qYQqW/ D~e}N7b.kl1u<ćZܓc aC-O8"bwh.liFC "Lث| tSo%>'zx}My|8g2&xQ3)Wͨ{ D CWWf3&ߤ5\pt.Jߤr2uAԝ^/1w? {Ҳ+w('jq:cNp;kLѕ%nFj_y0bsRҭZzlQ@j/́c=30mA= ]ޚMtya:Bs~xiatxXٍKs-wْ(LZ9݉  m fS0[#"1:~bx+%.e@ qdݱ80Pz>@=ybo;xBa򛴧̏,fOz] 9kS4OV5;$dfq52seW?i3NE;v=u"0X86CkSnTzPEț51,x}dK8yov'Z}>ZqAc_zjLa[sJA#kn\[RaW]mNU+ȖT^!D9'{8?~`u? ll{5CBFM\Ґl&PНȧB7A@S2 uֆ4!ER>Hڳf{hc寻/:.Q!䓏[iv cl?1}$~! a>co/-,6ɛNZ8O/{,ٞHJȆkaex^̧h6z aKb>/`v߰BUL:CL!gz):Q|t҇.%n|3I*^G^:"%tQ.!Nvj:όW\F q_1if0!zYКĆű{w pNSn[XBOPf8~y` ݤP lĂ #({ETF f#{h("~5 ,@ZQ$Rk`ăTZ)ά?1jBMJ-F;QD`V&q ]I*_C)*3ٻU|Cp@-\K;@*tsHNEim 4L">@@DN+zs6L. 1K"4*βXCrxRp)MWi }UM,sF _l884 S뉙Bz ^VyO9(3YL= ͪB"hr}q65;fw;9m4I]lڏcswg3r|Q}Ф6D-Nq?ne`.@C-'йa_ jH 84TDw.o# oOw -upzmNY'Y_1qe*,˄)uey EFmvΥ+Q?5Lǹ}ɫn'6JJ,!fM܌;sGTcGSnEEaovO^Mщ FE'&vvEmCDWMKx>r*=cIۜ#8cuw YTdn8ߝV1OJޤIqLp5$b]Q/ b¾%6\eZB]~x-Z tRO Y!QK_Fd+I_2(Dl t_j6/~ݬ!̲MӑB9zN,cA^Cdasu#i -kTr9MHeίĻEk WO^·v x 'oe cX.Kh;1% )<'M>~&uMCFѵj%5UֈгM5~D~ź", <_riz (1-6H+k̈BU-yr+iW<(Ve P}({GA'?yūӌ)]dJ]@1KŀK]*/=Îw -rd(g7d(3רaq/9ivQ.F]1S_Df~+yYdڎ!wNI/RNq{=Cnk3**<21㜢O^|鬣$kt,]]K 2&\Vz#To\.cd҃"8iX3ᭉ1.j(#${ _4 q ds!/O 'eaONE< >d eNZE\j xuIgXk%Y'm(\!5]ߞa ׉D|= (/t 5MoNHMRO.:[rtǻO%Fz+i:l0W~e~+ނe;q }bτkWo?^he9ĕM)pI('5rVS=;q}=Fp7;gy0g1`jɳjBN4:*@rð|O_7"-,=;_w`-EuZYJFEf5SBMs)yϚ]e*q],4Uw;Oq½N5sktYX&5͔|QOl {z>դuDLv诬ھ;""/RyI BBR 9l4`zt2(h\qД2_;@ JF iKUj Ch ,с !"q&msfbxd-hQ³]qvC 'IfPAb3mL@/lj?=Wch,1z]_1UG{49܊ endstream endobj 811 0 obj << /Length1 1618 /Length2 17295 /Length3 0 /Length 18327 /Filter /FlateDecode >> stream xڴePݚ5ӸkpиӸ;Npw!8 .A>w朚_uu߽/]U-Td*Lb掦@iG3+?@AQIʉ@E%4Y;:H@ `geC.Ns@2rhMY8LM\?@Kk Go &f3Ml=\m&yfEfLJ@0ZY-@:@FMYSEaPДaH)iHZMu@%>44tUX tq?Q T Gh@ '~fK7W%?4]. 1nt*wG f@W$i9?H"@k+ [+rTT& G  0  \_.qgv>~&c&nm3GWkW*v]?6E1%9i)u &90):~ ? `jWIZrtbwQ:8z8/nN,n@9 0!F䯙?'G'+qAq5q@.n@? !1A#_$ͧgD> `@`Qr}H ^nvvJ&@?L-?"֮֞@skտ8]d!x1K;~c;Cvb8pW&6N} `?~,ELN]LAߵO%`b!v..ۇ́(H8.wׄU?b,uV8?hr[waf0xll~k3%~ =fkˎf6-Rf+Ϫpu䓠־vIEd ӂJtB޶SgnUEL Q&5W+zN uK9::H|]ߟاѯWtl@{/baxtvޟbM q&acɬ$ ?OL;h$! jjGxo);VӑK9UԻv7zK5+qIIJ?@wWb<0)fWĐ^s^C{"=(Yǣ{/;G(q !En6CGqԙFƦ0ZowJXVϱaI<:kt'f^{׋?; ].jJ[IնE~" IX58H/O[S$Mvx5GšJ$Ptl&h"pz;b}s$\;bɳJR8FHW@۲70M/4eFh~@Fnf~Qs]ZC.h4A~/*oxRɛDFr|YRff‚BK_vqƼiְ_=xܣov~jٚ&-B~W= E-63#.5%^> .1Ή )=YY#`P+E9ڷ ︠V^̠gHOkaga8v`2+b̯ՍD ޶ znD :E/*qҲl%Y3unzqPv$ïh'h7e6 j.tWn^?\&piVbSu3 3vȩ,}')Cx7Q#Q8\t{`^vȏϰsFvkQVd8QHMl:j Q/WNe"JA1]I<{eaFX%NY H郮,PD5kC[UWN#c^Mje̫ lm oPqj+V1550h>!dTE63gI މOzNO##ÝDž2E QgS>{%gckͭ훚5!cpK&KC}2B' R^W$^Ugn)Рͪ85 DWPҙMЏѐ2Bz7=H](EUЇI_Ƞ à#FbkB˨oms 2%8g Hlʔp'h(O\V 3tNZ:dmj"{Dcaq˧@z%ִ[T@% b" F-/FMpM&4UV!l3,xiyzI[ UΘ*zJ}aڗz_nv6',Pʉ_\w U6,.H~xVU saO9bU ch·DYe-EO`^4VO^(zzBo¼@1:2W"ڵַ rbb?Mǃ#uPP"?̑p 5Dw|cO]22@'і,M#zsb~FE{] S8|]rx/H:)Iĩ^~hDӭ#܃W[!DL;淬WGZM4Ws#O,ήn[-xQ>nIZxA 1P0 A(W:"+c>_d$ ޒiGINEȢÍ] 9R3ď ؀\?+0;Bt.(HƮ̢*V%易rGޅUpEPMuؐ9`Y*ns\_˴s*[tB?ZLq"f,'|zPzffI*dә6y5"wxӅ0r gc. ]Qo2&?f nl^2:.l繒xV>ҝ7L?7#k4+ xqyh=7EJri`x0sK˼7 _sqe{np#AXԫ2wZ#@OEC=}#y ̤5;cp+\:5jYv%yqX,#FByɵAc=)s̚c\ӝ>.][^O$~oQnNfO \ ) ^$+U-u^ BiL62lf?BЩu9(Ƥ);D)ZOb {TKTSN?*a4WA:1ѽ^ 8~+J;Fui6oljL~ꠦ sf'-q<9fE:}rΛI+cVϮ\>ĩK $O$Lʦ]GWwnR|Z;QNC"".Zn  szʮt "$h2] 0K ůx4[w_"|YHX^whf௎{\.U)HAcZ%`Χ6^0gtOO#`cH ќST>+\ABP I4)>#9E.8zt!#eR\Osx3jU8S^3h v$׮A;F+9cȁ+,nϦ1 @`fB9ip앻{m_ȣ;Efv-L\auoZt(^^).gd:{ِr<sy5cn8]ФyB'Y솸|Nd~(;%rRkZ`X=y=Px^l*-Rk.\_R\_f(Z5)ڔ=q`k+Up{5e~fK3LO(4SjqE+:C9>cض27BmfmAIx׃PE [n3ڝmN5i6镥 ۗ< a=S=oҩj {d?!8a;EK>ū kQħ=94>M l;("[`^b99qώpX{ihf"d}⒕Dv(,M6V7i #];#Q^2tn ~Ec&iNw$a7LWiёvΤ n\ԨT8z:K\{KȆ>*Q$Gc^ 7jad}A|qQ^ oWx4pY_08ćXփx 9nJbڒ8KAiE_ԧRuY:Xsq#U~tt+q +e=ҲHpj!̈y r_aZzdq]j#ŰPi36z &\K $,hڃYnυicx*TpD6VZQ уŤ}RA.>' |F\]{JSjqf6b ,Z8h\†8pq]`9/7{MNk <& ^TѡFp:V^P0g<+/mm7L\'XbV>a׽OcwaU ?;)'^3wIx4K]t6} Aǂnbo<~( [_zB~[f%tunX~/n0Z4ƚJzb&/a};FSAuҰ]y#00^i MyZ3i-$:~q}dPאD:}}l6DR _LC]}QYPng6̡"|2(X´3$7b,NۂܜSxԺyt3]5& {#I Q@PFSpV]_'Ǵq3z;uzb , ޛl%,|7}٦tNē [$9O1$;N̞h:.Sn({%_t'5'd$nKNm5IH|$ad_r_@^هTPO{W KCpB]k7#H5| H5sbLLOLńV\*>Ag ZBq866Dc.AvrtBXlhu~uoWoBPT]U\W>'579O5f8[dKRV%`Ѩ a5VZ04f5l |Ug(8s'@{Uqw9WǃN Ky[ A(È0mkzZ=~zҥT=i]Bhid8e Ik!"LPBPǺ(H C >\BCetM',3~n?^U>^IH뛆5{]HpM$q]~4LQʽX?C(AhDʾG5l&9vӞ?Evg<V;5Ye%++Dh;^}v#MY\뛠&XBf[&FB`sF Xgҧخftd͈jzUAlWe&̋"%.ʙkOqۄqzbkd-;rYNaKa2-p<٘6ߖl}Kvw~C,|"Ng,NJ".iu޴Y+?ŔW<9{o?M\$%0·o:P. J }TI /dK[\Z[' xrF][Y۰`c0% 3UE\'%-Ʀ >nI8XVhkbA4qJ,4`\$ ;*O%O#im oS0i}=>L"K=w8^#lsc"ՍfUUƧ*>\O{t#h@ti .NnBʚ^C.qr1ut'-/M~nI<â3{ߧm¡c%t֨+=˲~qu{6/ S^.6]K25j PR+us?CQwlkWKZ{4ǵяRK1Bvr[IL">MN yRg3ɭoA~<-ʫ]6ˍg%^j**w! $Y÷e3*O?2Em#-b_e=-C=`Dq#8O,.#f`*i^m$xB_5C|n{Uݝy5dB~Ӊڟđs\]2\꣍51fBO!@77tMJhSI};hˣ Y9_yd喍פi7҃,s%Qjk{`CmkP^QaC}/G mGkgP1@ljMáxX ؟ ˄դ-zUS(aAOByt9h~ aÎ}uc ;ܝҫwdȲ PFz<>߇ZzQݺ(Rkbgfh~׼.E sd2Q2Չp>h$<Bx}ufƒ*Gt2W{M6fyeOA#MA4!vD<;C4&&$g;'_i7v"i@<'"dlg8CE%Ҕt!+iȆ|2Ax3\j6uBxDCodP dfR潺>8߳#aIsӳKcM4f s~٢AHkl0W2HؚDMUCPH2 jp= vU. +ɩv1NO#3hl{,\&`AMlD ](#%[ ~_I ;"B7_85g\̙F.liR8zoh\._ȕ‡#inJo@JV"#6+[Oࣨ_#i-ٶ|X crePW!hjO?'j~5d2,:sp+Vs }q-} 'ɛ4.:'؞DB'(yAy?^j02BPfq\zqū\泸s! 쟎4|~#M l8=TB3aFR8056-)ˀl#0F.WP"t5bz?Lպ{uBoW7 yl(*^ůs*W7ld_[pt+-Ԅ. >!9sbm=3["}wF&`qXٔcl\:L?j we 3D,>>8IGPݛd|Ty zH˧{FOSSUgPiaL^k[ aySpj B#!^b/Z(rhs䵐S,>5OIfPuA% #8v6;kn*aHLWQ.]1f4;ün~Cc \}L=bcE ˁ{8SNWuwD+T6T4x;ELQζP:5ֱa\-sTܷGS}rM?N۷JH܎~QB5p ʔ'2 dYj(A (Qr%+I~^5m0n@-xoݭN-zDgq `yX-\p0%Ltwe;?SYb&6i;oi a#IbnOOsx>/m/-\5]_¼_D!9c?B|݁.cӁYN\An˃/l3? ~ x4yEa5bb[%d#&w!;"L}(~[UՔIKߢ̾z ֬٨z79T.(mB-uKLk!Hg/UoNp\.0``"Z'-(V3[oQ_Ӄ3I=NE3t'z#(-W}#qle8"EA*(11tE 3m`j;^BF%(*#&*,&M6st,@P40*@0]ب|`Wl?D+CzWtn}݀z[8f~S\+TU5% 6#IJtkRo%ʨ8&NF~ĤPC 4e+ kUK}>AV1 y% Y&·pj}lkXE!!0(h KMa2Bi;_xh'_p?_& Lຂ/[?@T8s*EGLςHӬJXX f:~dQΧSEo=7 uD$4UiH"q1<3\i" 5 e*:U'y&O9^2Ȋ'EHϚE ⼝+ںr= @d(aT ~^7V^c&N\Uޯb /pʂWQ]!-λF5OO5MbGui:P&m ZEtA sw>iuGr(`/6ƬN=UH:[.!i)C$7 9oa(p/q hp4nGjܯ\K ?FM`Z^Dໝ@ۿY&} wv֓_>Em:#߈'`sv75r'}8NSI|+%hzyB/oSkh]wǢ]~+YAn(U >0Ln[HK=z7ޔO/%f엣졐CȃC %&t_aVE $2}osYߔ+ʻ3H0kڨM.<ɝO7E7֚{B |,hX~!>w)ttbSkN4܅dc(8A8aeչO E ~ \,^+F 5Ե5w+ S"b/liedRLUO%aprŦ6`69Bwm

ir;5ƫm5auSRXֆҼ5"ɚ_/>pE)KʙmFH^bY) %Y_|J9+kx~ߟ47L H2)#%tF/e2I !'3x<[uEJUMl-7YM*ٽmB(f0{֨O^xd4d)pgE=|-ȶ:;㸅ڇ3RW*S8yNItuzΙ0V|)^8-݅[''ȋlh|Ұ|^H%c5EW 9ZmD<4Rh'LVpͬMmd %Xs֍rrr@dԵYdt7MT(SH<; ۛa+ *M+4a^ O+~k`N ȣL ij=;Y_Vf!ٸUAv>=\.$MUVf큉@K!/_h_ {C!R?y{Np|j. ?CV6py{NXH@F,У3\wXzhC^T4@@yA rk %4V‹Kd;`T'xk %r~p6 &`@sUKwjH5$%4R%7~ӇIw^b"$dppi.j#m Gt)lu"v ! ojqِwm?sZ}Ҳl %8@^+)FeRC,H`zIf2 [Gy׳G=d50r o5wzޓjj's!7flv[ Tk;lۚ6v()S+깝3mF˹6;NW@fOm%,֘TJC|^rj560NuOn Lbh[m$c?c˒Y`] xkUN+ǁY` eAn}.66~ˣA2;%t*O endstream endobj 813 0 obj << /Length1 1637 /Length2 13205 /Length3 0 /Length 14267 /Filter /FlateDecode >> stream xڵeT\ݶ- {Apwww  (5H }skժV͡}lZ( %lmxr*6LFV {g \h3t8N&&n8r$4Nv@f? %[G'z#C7 dHsw;JOl%`hcag(غ~A*[`k PjTĿ$*)P3|Vqu/,*jt1aUqP Shߌ#o7%qfƿ`A6dj`kO#+?TAW[Khg:́*wSr c#oT~$}؝"ִW86憎)) A6N@C@'C'gG?7Є_Qg=7tۏ;ӱ6t3qv_m8U0Ywg l *r³`džx\Lfn6ӇHmLDm?P;O ;kKn 11˼_Eft09v寙oO;[;#d y:N@o3'd!a-_$/ P3Sjbkc01*:}9^VV @? AVXl rM@N"_vi' ۘY,2(~>ׇ?|4::ؘq? `RVTO 0tp0tc ;;C&@`duH9;yLm' _ܿwW;HZ28WMC#-"bIgPolk3M~ ݀p ƼA) !>yS%P geX2iSm8b;@|&rR<>I6AVo'Lv }}ąG~/tRd~+dBP=n2zLSҲk m iFla2ͬAn֨gN=_KPX1բan7EjLf&  4Y(c. Kpo *c?ܔ&\F꣭_ΆLrZb &@Aa -ԨzVY8S,:x'x'3j\rEhHxH%4l%݅r}NneUvI"xqI2ntYY´$^|{t.~]bEeC;ȖqccU(GJt뫁:U)@<}4VcэAPG.U>T~c~{CS;`?,W;z8af_L.`+eM#/n?N$ao7__M!WyC*+DE/6o^)~VszhQԱ{i+|jtM-@q}Ub.AEۉ^9M"v:6yQao{-uޥRC.Y/MщCsi lSEB3z"7П6XJpWt^w|:.p ,A'i#ktb#m= źލ1vopqpbTU;UXΜl߷xO6 }ea'USYmalB2+Pk~8Z@;6`i*Q^͟c(foƶMZ9cj2jjܦfM-RG+oc=3˛p YlL| &HUo<^&}h8S#Cԏ$٘:S40Ytʕx-dJ7< `8JGB~#8? Fm&Y0 Pwj0,k'lwC3a ''ZU}r邻=sd`6-'3/|]ىjQUP73Y=E]Io.WemAr¾* *(ˢZ:!i,0F9օ:,R#7ZB&hF?o.sيۆjkPjVRogKQFij&Zz|=d_S|7m(BUگeCY*1r=DvU=.FmB%c8$DdX^~e3mbŘؤNC3ȁ,lw4eQSj']̢p[bFpgNwa$`RO7&Z`rz`#l†AX)X~8ڨӠ};㋐*չx@SHٯшdSN P$ T8:#RZn_v ?Uɫz2+SOݚF#肼|G|1y^gtR vJjw(«58T-@Ob| $vLw6]8v:\v⡻9XY%1SZ̖gaى򝎂1a>\^3$bHS9R/.}q+ Zx@\ƐSc7{;8*<=y?$b?eRA5ʽWTHd%V@({hUxB:dV5u#sQ?t X~D?LW)g i$;qO`R7Q%:S{~"HX3o_O_%>|?Р<7WT&(檋=DD}6[8,1 בiW>!3 pK( A p&j4B`ˉIL$Ol"b67"b^^ J k (Y}3΀*ϫFA#m3q/iNUg-b:+\S]$+w}bh]6$cwc|37OG~ռ>oR^O$rls4QCR vcfưөSӮM\{t?ٌ[XÀ'9WpVJiue!:zFa`aN4M=(G}V͌s+1h;\{]?=hbzu#!׊5;yeQd^ `YZ/Z06N@6c7?~Gב|'4I 2Ms)qvö *ʬ(dG"\EI 9&m]DQ(w\0YDϱWi\DZ=&riу@rV5O^B ԍo@y]Wm[*0կ3Yp4#{Z hC7+> eh*tˀ&NnMt -q*H%l?s⑵H|:"jjծ?4X[̮ǩPi6hR|W- ^' q .ƽzK8+`ZH9Z|KVd,U~GzJ>ͰɈCpèCǫaR"A6؈[|c}wH*[{UR8os.1P:}H[:ܕ)2P\J}_it;|ң? }/ 8^u "ĝ[ÓtT]+>`:'a=YFz>O֮S('D#M ,!nhEXBY&|ĪEa2rq~N+\tXjqr33VF. EݤoOs, 93h=9 vԻ(( &@$Q`juNQAArO&IjbvrĄN gcz5w.'!u!p_>E#uӘp~*- xӭ^=g68(⮦uˬc7evkŏO$KɿBh[X7 ѱ$mAb@FmcR*0A ~Ѳn9ۺvΧt[>x!a%Ma`KG 4an$.0NQC-7.Xaqw)IJZp;Δk-4ua˘PP4Z!n0xO[,,) FZ}%L#H Q7ۮI)Б-MNӷ۵%/Um@^Vgn˜/4(/ 6ȩ(MCÕ:9E QAD~O~mZc+;@w}a z*1Ugю׭l 4+E CӽVɬ!;po^ :cSc²e'k S\g}'K1B-IfKmmֱjyeX4h FamB|5.2C?xed <ͥA 'Fg;c5[%YEPۆd`wJEG@hש!)4 zUi>{,-g-eE%o%n n҃` 1&@<8+cRLc`ÌkMc7 ^IiVRl㸦qtXuҥnjmOۧVzV4hK/b֜V._A)ZC*BSjoZ zňvtPQ#&4$Ŀ>NwHf\8XS c_ϛϻIcbSw0C0bl8/A ]uO`` !(R;aGMˁZxH>?z,:6f#:REץ AJ;YviT0 _x[v:O\u PZ:#킬Q?gl- 'ﶁ`}#=JE6羀E{[w*I??xK7ڪ_by1'D`d ~^d'-޶ԣ!(w Хu< 'r`+_ T6/ (^!&A!9gM?yn|+[7Iwt'g*n>㥫oZl\Uܤ 4 B,Nn.)v2/<1d#ր@$a#XLPCμCdvq}mK #ݣ.8W*)]!wHQ̈́_k1-(RA eXF# ^O8xjhE,׳^8tҎ?M&E. hi]|V{:lN-_( obԬNDKe8+5J|,Wtk:o+MV.0αd)N_Yr.IZna"`=uuڗ}n?RRKYC_t1 :j\; LT}v౱'0*}CuӶLI# q5: Ih٭ @x\97nruqAYr 22d'@"d*MǦ ޴)P7jHc""$r@Sei_;f}#ۏD؟qKUU#c=+̸ ,O`[5O~D,͓bBF>щI?8*{#?"wZ\Q9mm}p -M EE ^ tF [qӗ_苑A8N tb" rD$j»nW'{bA[AZ4eJ ޾lٚ;^r"CW֐yЯF5аVVN<:|{3 /tPEA BxUAJ.p:+REJ&oE:K8sL5l\^[篟t5n0zn Z%2Țz;֮bX^Z0jvRߐA=+t^J[)kAbH~#x/xK1TƠ4z }ݲ®s1Nbة/g|M"}~,ÜɩzR!NGH<h>c ]jlXn@tFoG̕(Wk'b]Ӿ@ )FTjr3 >- Bq4k}=1 7B>)CmsӾqϘ s_mX]#Ep]`3nN-jѧKDIþ%F$zHD'a\hAnRX:RNd[1=D=KX;Z=;|TSKa}U^co6}P4Kf"HuGsj9-5Cή%u]T\l]Quc)!A㧜-R/upo-qC=CF)TNgI ИCG A`̾#gK8ޮd,ss*Rt]ֆqszC)cګ@; cHدH-PJ;J+]MQ9Ub̰ȢDgR:aፅXG3َs,͌`'F2t+S~ k~367eo]d<ꘀQ~FE=A/"lJf_(:o;N'v:eJC ec4QyhoEZ*l-5cKw~ ,5Z9}vř6]v*|}Z7WYvG=?ǂVSz Aݱ^eκokzE;}u`*P+3j~,5< Ӷ;yniJ._M-&e+ݔ H~Ȧ0$j_RW}a-OfL px(d=6L4Ƒs98>~ t}Dyl Vӏ)μٌIu3|m8g T\##(d>n.[db>W_m"&uA6A.7+YfI䗥 Fj^_<ع"eײh <d4ϱqxtӷ(PhbH`䊯>YEBn gVD%V|pa^u.7Ӌ8/vqJ-*DF;y l[k_kWmod]$dȽo9.l8=iBV4jBH3iΧ'L,=0:@qnDŽLlHLI:mkJu C, [oPp )mdM/MխtmRe"zJ[=h˔}ctYa!`CW9SKslF߂Љ" 1..ͽȪ31ń^n!ies(?S|cH&azG#H&I۴RX-pDRk8,8>Jp$[,S3lSq&|^"Ѻd2 XƸԤ`)}nS6=7O s £Xw+@JiUAỒ<4([yڡ C8B*P+xM*etf/e3X%&q ny$T$z_Bk(?x0 P's rzUqġJ2~ qĤl^yJGqW B{ vhs/xşq\0>KH fdӷOpZNk ɛ/#)^>IͥC,Cl\ԤZZXyީ2[ov>.|Jp/WSLIdN!@?e!m}T@' id XB|٧=:j/so}^MoY!8_Qi)is;n:{VtJs9D8ՑF,g~q3L|),Ks}>׌MrֶYi4,Iseeҙ '% ŵx"v{ud#`t+W{VMc[ݒWD [ՉAzHHv3Y!>=~f(_63%Ğ]P~5t{kN`:->r@k;X:)ݦ k*)C N_#xGDeD:Lz pt5bM+ ѯe-@:jC)v)1ބ%}KG&@OMǹcdH} L%շ ]Xcr('IK^EPs{v*Rۺ+}`l+i:i&nޤRC3Ί5;=ҠB7i4sx5[U ZzWZ5C[@}S8LCJG*Lord|FA> _]Zo[E}Qէ`j 8'i;yܕC7HЂ. SGibCX>6TU^_/j&'&C}@smA%gpJfKG1hdb-\Lv\0:*9W|P3Ҹm#Bl";޴ϾSђFݍ)TԂxÉo93Drk0M{C7X*O m%Kv7 ^z -rp8b۠(}<*u(ᚄȎ6δ}C1xs zeھA@(NN|] ua;P0iLW;s |ӬHZ050BJ QEb5O.EZ0( _URPMÊys!Ʃr5h,m59amQEr-~  endstream endobj 815 0 obj << /Length1 2619 /Length2 28207 /Length3 0 /Length 29732 /Filter /FlateDecode >> stream xڴeT\ͺ5޸www ơq$C @pww\};Ggzjj*2uFQ3 P dPPTكXYՀN6&**q'^v(S,,Ti= 4x.@V?@hb v-tq쌌+cڀܝmf9&E&lЂ&@Kc[shKՔ5U]@NE\]CS !! gHkk`(i+Jjj|Pde+ lq3N5w@kdr`r3d:mjo7`e wNi/1.k+ GKcrTTvV.@{c{Sp3hF/@v9oSWgk;fl6lS*V?6EQ%Y)Iu F3*3xxylllJڛ~'anVf濕7su`ִrtJO4؄ft%vLo3o3X_oke x;.N@_XfV.Aڛ2?#@AR3' hr?zI*i[3Jr3/Leu1-'4&[؂=V\FV.' _|f `VґzF0I{S `d6NN7+x̀ N8AN7,/`Y0K/f0KAf?,;(AAwPj`ݵ pwE`A`f8>S-xmmoo_)EI/ W!A0)?BXz:X۬`VA 6Afd/OeNp=xC 7x1b+hG":r`@'+_jp K'Vpn wg[cg˿J fbks+pqg=MAN/d z! N:>WT~_,4VwqZ(8Yy貀`;G?7_bb oF6`Y.H5M~ v@aidlZ'Y0U Ct\#-f)}O"w(%) HAO/)оH*us䵙ȶ!h{&͏tr9rdķ4Gy:b&~_&땶α6b9bx,.NCzm#D?k3*֡M]JQwjŷa LvJlSBtbݨlHH+[)# ChaRR˪jF$(: Ap'zdv %G6zSajI=9Y>]߸8} "ȩ#pafXJTySzj*!5&H伓`X[ gKmrԊAbc|i< ;B^iӡ=Q? sܺ9ۂ6Υf@Įrf5.ȞxJP%wex+/~/Ae3#^ wͶ!AxvO_ʵ^Cl` vTأ܋ѹ1C6hgt[>W5 M}ӊ7۵L}u/?n&0K>DW\k}DV3ec+!79(;QL%0~mVbʈo,Ot_켦g gB Ew}>wqQ2zpngXuHԢw^: tz;K\:"WPȽ_kG4:JGj4/_vZm筓`z 4SYC(+Ji@"pU^7`/Z ӞU1-%5}2pFv`^YRģ-6ɺ3arКPISBd^eL/^/tg-vg]+4 7%H 1;w97N. oÎLgv"L6znsoc2e`P׉#v,<%4r/f//H^Ϳ;'4ϫ 1u}jP f!Hvtu;~'Drw)҂Ќ7ߚXzqd;>FՖ`f`Cɒ|.% m~ NGBԺLb﷔7^}o>R<%:N;Ӭ5+%Hn\!Lg4kSUiqw6fLv(WmʚIX X;pӯ,'^U  y~xf. *ݝ :CB>"̏;J~ ᅸLpv 6mXv8>r? # L8.c?p!:K@=5+2l_$#K篯YM^*5J bc/𘜸jָ?cuX&/.l dݢ_$^၎.>ݥt mY@ΑejmS= sI'@b_a*lJB$j`kPO}S6I5->>Wм&NDQQW=e{djNJװZ"~)8).|fr 1z..P^M\~cys-0 p}Ϻ&LD~n%c3Z#oeHd8jŷHiUdMKF$"q-NٴKg"'h ua]MmܡKxCj7H@2nᤏzLʇXO7#qpR]k}?B|pA.Xob{ШOĶI;!Mb`&j) E*+5[ôCy ʹfKݨ3r^tԮ"9nÕ3ug{ؑ_Wnd gb۠ێF|5؝3AQa]fΪqۗU&cͪKC'Bs kC),k +1X) .q.hwvt%E "d^tlTN|41ghj~t"4sDszX'4+>Kfm4 dM ā !З%~0#VyLnH۸hb$RQp3 m8^})Y'SIDt?oLⰊ(POaW+[j$`gT}*^5ePaGβy!+WU 1"'ǤYU7#8E&A4PX QdB`OwUJ:c^N$Jr\Нohգ7dOX|E@ YEMJ=]YW$_{m\fڴ?td/`w┴Nv;t]g2g>sxFbaufy}zi1'ݖi03?6}S6^Si,ԣiJl W^۽`!_ G %1n}יzQw#AXd@+Q(}{~+;e(Ps{}ǵ((&6XRP̀])ٴ>@zZRƞ\ 'zCͺ4,4XfKF{. {$i'B=l$|vPEyJJ(# OCms@Vj5k܋G" !映I0nR#SKmpGHڈp "N[ Ge KYq; R25Fntчs/!R!ޜ=npNV\vHp{:7dxpܤC[a8|"6J_̕paa8E0ΤP,1{xޠ|:k_-o) Bh;qkp;Mc~sF ,Bkh2/MYAF:ekXTss;;RF;)4hdy1^_ Cecv̚nZͦv%{2 -.E.[Æ)8޸ѯ2~q -g}J_-\N0CLזA#O7v͑m_7L0 /R;ї [r!h}MD#㐌Ycnohb5,eq<9l{+M3CjIun4wܮ+L[*طXb7t[B'"BYO~WS G[#,S,q'%y_;<.|b A3b|i^IsDګ?`5_6]c;M.ݢg?سFF>sL[ Vgd˧QfGDsqo0Um]/uY$h:n-"@Y8I$ظ&C!욗:Ψ:b5FZcݲF9%&I0эbZ&t~{ ]Kqnk:Sp y)h$ Ti9Y:bo8{K32y8h eOnҬDBB 2S3f_ RhJkFڪ=)3EC_J`awZpA=~~RBsavcT^k&UP +eRTþK4z!XF657Co_Yġ®Є_g8Z20Sfesc5X36Ń4!J^ho36͕^<\r/{uΩp 9|hTƫ_vd)uZ FSt&DhT+aVՋgS;GFPCFO՛Jy|/<=/5}yL(\Wr ve#±" d_;=뛺 e|K*{$C% l-TcpsTz0d,*3u~ ) $@eN4kAs.zx7}⥅8x-@A 4?@u)˅h +gڄbcc<d{?%ws\w%8СZ2ym_ n3E񓖨ڬƈő MOIԖe aMUZퟌt^%_Bܻz^c>*x0b`j.vk6ToJ)2}>qdjy(>D }$L"YFI7qyKo" PKP 19_ iwba@ m>80Qn/CC J0u8˛z3:r i1oDt}gA!۽8D 4U b[iʺwNM {w7gڡHҙZXP79ble8~+A Mz@ÂB?E s67fraB<vĉ_.I=ǰwxRxyk##~?1~nmc(ab;Y y 7]jn ,(zerNcX + B&9, l3;3 5'j-nl' 10[DnBV79Ye#VdcÊkt".Q߯+2SX`RR [ 5hP*[JSÿ块lp0sUWB/~ 莨5J))f\Spۡd~&TD=v(x+ڿU iBNZN]Z&|X#?SUTRw&jmV`SǪV4zukNTŕu5%3Ij@I wԃ.-8iys+i?.x 'js/FM@ZQMkaߌ\:Ҧl)H3 4=oemS*6sr沢4I^yԉ;,4׺!Xߞy/4*>sXHVM.bZ?jh¬ZBb? /_eSz:tP];ek zUa3D6ψ @Gj̏&8 vժHxE)VMeziH.Na۝N M7zS⥨pAXsMkE}emG=TdfukD\Z I,{?mP-|| `4($;@IeOmj]`w/O?p]V$¬ !; P'۫U-d1`;=: 6Ud1r/'[{D .uQ4d(0= F:Sr1&~ى>xȣ|؎2/*7G%8CV~e3Z$ֳwXgrޡ-Q YnҩcXub.(ߪi7o"@zNqW|?0z㣀b +fJqͷ [›KR[r/ňLP9$u4ݖу+*2#m/ 9ܔ$P75mKID?>F$6A+>lX"/}!J?39k[ߤ] (oe*$w~a#6#rz+1f(!xeU#.4!ⱶl`=Fz1/D.(L%!,7e<) ieb7S&cs]ݎl%L.b[gpt2 "o֘=:6X\.ٖ`ZO*.YyS94;+>^}&y''ħb"[yM+7-~" )Oˬۆsr=^&Wcn_٨ &7李 ۣ ǻ4̯(I=*xnߒP#I眐WN~xBf "ޥH%q kVCn{i4l5~wǯ/{8cY!QlCy}g:noHM}VMz Ǩy$4O(>IæVOmKhjS-WOg%WCȶh-\e)>Ӓ΃ jZ`׸UY7gDp@eCASKNhټX-XeN%nb*XQ/z#{ѹϺcl껩>a/,;<<#ORZL?)W.BaBKQo f }A(jJ)fCX L@) ; KӬD,8劫 qkÆΕY!x>I1I6 E_/_E&D:HS[tIn|ɝ9S|||9Vݏ7lZ{FZ93RK T~T#ճ'-`94K{N/E *D~нVgW=m*p c!N+Y;z43B0ޮpth$[qHml1^QK?fYK*4YN9bH%Չ_(=Gş{K/q}1/pRÇtq_/"j'@(5S᧱gyf5 ?|=K$ߚ\8q'ƅa[|mb\AZ#_~my:'8vbF{uW]nI3Շqw:q_n>FhGME_bUSW |DFLC %Y~bE $%HEmqfў]/nmD%eYh5lLbpɉpC.cmr{)byU*lw{KU/H[>{o8|hm U%pLiVk-\,cw+@vBad]Y/Kq~rKkyxih!pS1)*(&h=&Zm ^iy1;zŽ28((6{R^+|cXڅa2CQ)U/5qĩd ]< "%Nv;?D]E'IQ+N CB$ p nePtpt2 ډ-[ H2ڔaupu㠤y&0, k}()YI(^%u9#ߠ&d֔O&MCE#qt;+MN5w?J "?R.F\!AC֢YӸ:yfA7C` QeM8wo"gQ PXKE|y&ԡ`w>ǩ{V'~^]*SmC2vcݗC9v ܷX^o)ki%s2d+藒4_]F㙤la!{9{ kOQZvP³ȜDMn}ۻY6vQ=G;r I-uTw8F6P7d--Ӯ;Sa}ncQ-1*ajY&햱^x~O FHhϸ'_d74R]nGm jh ӎ=eSaClgјj㣪qwyR y%SFce?9"R#,m5K6{ VOIRm,ah6 |Vn=% RF EzZ"&3WkyhutTmP-؟~r~uZ"c'%4[:jnQ^; 6ba(Jzթ\v!zZςA$ I}ϏY ؅ PkןYz1EyE ;>* 0&㇢[{qE܂p❰(= ,N`]`mAi 4&4m;[Ҁ*!A G︋I&}̦s$xz lU<㓿ZɪG#f.*DهΓW'V7YK=Km۫SKBW SMInh\(jTG\7BN}XwyCP2/{D2` K*j_Đ*CۧpR&Ro\ t ,:"zXԾNF ꬛+F g;AV",Iq$F J+u_ojvp ?@ !qZ =>?$.d|ܶIm>%Qô%VMgX*dL9.TaB' ~4'ئ~re>vsy8v\7Z_ pHIޚ/ e%).<ߡ*(;h*$f 3\czIb^4|?qǫS(UFISk{HL>S+g+YS)%obn1hfFm ;;g\=s\.#J/C4k$h&fa@[ E([2;<O Ɨ{T**gol3 H=jP_vE*|5#6uBM.b3A1eTά#w7lE>DwhU~汖Ӹ_*;1#8&;^ڗޒqRpw'Lm` &2S}~9!XbNeDl:М&#-5@K9m&[2eböfM.:ViZv仜5`5*#'D1>}-W F)lxWɯpFRbs*Ƞ2´>iK{6-r[=KlȥRt_OoJ_ _ *mtS >uo#SIP:L]_Έpp UZwn],5_X˜4-3GcvAsLif#_*?0 ,)Ɛ`6 fHEcu Ei{3k ِF8%T7n>ZX,p^޺ \nEK(u܎i〺Yb G[!lnRTYx;ȂuC<LZk]míV>ϮU!@ ܘ=Om款WwnՃU *2h獡§GFP\PdيGfT}Yqr^wEʡ|՞5I~'=0 L}lˢלGI6h\iPcp:] $h gV7*?%t} OX:PSZ7bM=\| ڍoC54LQJWkؐ`?xǥgI^%Z9rkyn.(_Dϻ[B.(B< %iD9#h9{|PlL{%D?~yNK*-F[I ,:R'wic͊ 9AB@5ѣ'lƵ2%b3_HZTWc=@Nm(U'R*.C+Ƙ^~:3]ûjA[ӤZ4 Vl}aCፏ4Pq^?ߞ+ q=MW8pV۞,SX,6q9E ɾ2(A_s'.1NS۱Kݪ&^&hs#fJAM+B!bm'H k0_pY(Y>jtRVی*WL.25->թo.cYLPI5;#>(2}!΀S "1%10uQ3a>0MzߙIh%&I\:5X-7"- 닲'%K ,])PQп\Rc%ڗ3LaiT;(gsYi;[ r+U yb0TvC9S9(9.V|Okm:E[ E`ʼn rP"B_g3W`~SьuȷVƊ"tb}PʞTy0e'o{8T!鵵1gK >$mm/'}apc+y{ۈdf[)NM!zqtT=y(PQ Ivz]zYbtcK1%J͡(vu61zSx+ 2AѱT7qw7k4,_R-v,1NPʼЫZjIwUĔIzokqĮp>Z-NH8SL'UcX5XbɓO8j?? N,G2-DL@%|IU1nwCKáH |MCP$Sm;AlFeԻ>:HirZYwkd۝oh"Veg^bGaPkBb{Ч!>?ŽDY^` jvG6?U{=ȴ Gd<DFΘu Vk7)*0f/wk[*,|ňɉ0R\)7duB>)Dzlv p0',5/1&܎Ѕb=xPpTS"!V ?+k9򭼱z7e(/bqM%HU7Y%%{n'*X!7/˿aȣ>+p_dyMKgG$=]~&fZ҆aDAi"7~zIsxѳ=Ќ# eqkba`8' ʀ\Hm7CjyqՋ9󺊿cZXӭT\M7J-X`J؏Ht@3<"`͸JJ#NF|~xI*9>\AhDu^>u#j8}̪x whqoM+A赹Ad峡fU&'s!68\?:DUr8[;ހR?7aҽ3])d2~;8F$ұr[IUwYw/̖_o͉@5N1e 3CՉ[O1tPU[9W?L0h Y3A!YAnW60T_Hò4$6],3o7 J;H VA߿Hۭ1fu1En<^iOӼmfL4 z/e ݡK@uŘ=Cx\ s#ޚ^՞m n5cm‡^Um)Obe'AB-Œ<wyik͕ (޶ŝKa[7VU3x3a: !5bz9lN%x,8!w)I¿&xfU癔_qIATR[1ͳɨLNg2VDžc`%⫄ϼ|j2X(Gm.T{7ПC[Abyn9 F|ۄWh8(؜:ǰ]R4Ĵ(GNZr!:E۟J'pOd[pU=ۅg"}q8qw_#U˝sTHг7XAB qM|Hg/op(3O|[d$3TlaC^Vͩoed͚#>[m3oqÒ_J%⊖.1ZEˀ*~KM~YyqM2c#$X7ЕeժyOy_73K+f#Y42{A$ylc|ؑwhùXȥ)ཆQ*gW9q[j;jǛ\@jX(xu(i/ sLߞZlFP˰#*p Yk. D=98SXpg1&/սJxXk6H) yX}6':3~DX7ۺQg `o_W{wUntt:>|$\ ԫU"H,/C~Q;`<:(wiYk>09aY_!!Eûry`xXP“ȝ ';.Y{YW7dM+5ޟ|Y{K]^ܥܷӚ v[+2, 6i(~}Բ4}1I6*pHJE)dc16~ (Vm {G&Zy w#vm'{Jv{~PŹA  :a$wH ҆qk?8Ai)7w2R!ubܲB69z*) XL6#}ҏDi~=#|a{}g|JA\e'哋vٺUSWܾ r&ͥCY$~'n l \xgH|o`1keJ<+H/¸Ź)T^mh`@ oI@aԇa `u%-9Q[yel]ԗ.5輗K m$}^z)oo] "]MN()T8Y##) smf\BҖG0xg!~; YWθ*rҳ!$R 9zI'A5C#z`rZ;>fZ$>Rќk"ޜSUೝH!`έW S񖟿DQx_-kayf'UD UUbvS"Lb9PZqA~p\'87h촯:9 ,x lHppuo&5O;, 80csqu#2WC}Xs$&-ݡ9!)T:w/3$ok$=q@Hg pH< }\3 Q'BKuSRikFkMA-: uQ?an m\|o"4[45/npl'al-SMs|GJ9٥3QQZoJX A B/#a40)a]JOM0 @k4 5yRwshO0yK/- ls(p&'Ds$)FA@&YK)!5{ r,W$4zǼD^P ;1 lhXr-do<pEPWqD>0zC:SͳyϸNxb"X ^&+qDoL # G#|&5ܲp ̓ >SxaZlX;:aQ#I4`tRʫoblpj4 7| <2S!BV[ɉ>3m,ڥ걽|G4:0rfā:u!/z>4GV0. eۭnxF;̂QS~- tG+\{ rckJYeG1a/HΚxJ)z}W_c]t- a_335KYsB`GyNjZeAaB$kq@74:Tce#. p/1ʼ1> ҔAj'LIFǴ#|BQLqe*bmP#H\cf=4XRƾ~edx:.c0ϊ.RʣL{p>z*_X;ь[LÀb*J6ґfŦX-,+/f|<<*im\4KY0G:llʥFsH$} GKM3¡e,^nNS2e$'ѺΰieDΩ7e(>m5Y.Ѻít+R酲.3Ei.&C>ax|=aM.@၏o&v+x>^RmzQu&dյ uAMHo./` @Zޗ{̐;)TVen"gE##L}5ļEq#2Qfnjeqw_28M &װ[Nvd βiDqBǯoIdI}{XWc.#91Dk,#mH PJ uSF&fU Qz8oXjJgNL^P~j0K< vhu"w@<]zx}b^WkziH;!u4Q~ h<Δ|C Ld~/n+WEͿs 7U06)6Y?nWSyTKiU==hCk?|śV43c: ĵ;Q ¾Α9ʬU RZY=,g53J8c}I;gB^IjgeSz-o2D1 m*jWaMS ʐ׎)fA0YaTmźNTGj @ZR=˳`B$HIJD'(X sWGqJkԕR<)JNSaSonu  R=$edKpkyrW yKtRT{K# ؆`:kApۋ}z *ၐ8}+M{aߔC ~㩠d9o'caص9yG#`ey^h{)q%Y*3,W-2)8,XQ=@ԋlcݜ3}0ŹWsO@&8ݖ$_/X|AHX8˸ 0MXx3whYWX"V9đ, ZEzD,a+ a6%cVOqX͖}<9 <r % TD5޸tͱW܌Rр#φ=1)H;c[ aO+}W:SlF(HEm PPqGz?C`*KWp\Itkq@'qVb1NJz‡:Ϥ] 4TB(odKتqc>ܮc;`Ǜ#~Q;%G{q;Z0ok-g,.]IoTzU7]ՠX_&56Yv\G ,;7οVQ>;{`;gTȭir!uސ Z(~{fW}%k'}k7~d b9tZ-^rWcS0t"b JQOK{;Ne[}W}BPr~v8:*__"?}9"`1zZRV\aAVu=5%O"S u /QuK02Tr) [`mbs]h,-Y le{S*(фgCr Tg &]g'k ,7",t)ZƦ Ԑ]} &\Ob kY=߽7.^IS=;Wv27"JK=X1ХqE'@_{T[!t`tY}QI C ÒHzC$hϙOCUd f#fXp e~ʘjWˀfĨ0@a]cvRx#ʨ󱐒4jP7,X!q!<=ľF EE /BB{v]XA89Or:H#E7Y㤕2<4jEM3To KR`{I1OX9L8_A#sSF[ػ\Zg:_c$W) E nIjwO6'rgy4ܫ0sJ%aQ ߀{kD և0I %Nm)RTlhnV{ˮoQ7W΢H{bxkHhBjYXKut ]|u- 2?kn3$Zƥ>CbkJ{;Ӹx M1yoݷG^;oς <-IV2vz(K~9l%?]N\,>Ky[ҝ(RG;dU燔J)Olh=kk6rjmCk YXE}Уwi+ܧRrhg-= Qޱ;07r!v!*7YVnD]"LMRޖFyHuexb< AyȂA"q6яGT-oms/2AO~Ƞ:^:y ^]G3Y^lygr#.m 8f[KkO +ǩޔҚV*pgGQSqTs^(*q].8ѧ0G[.BsSCxѦVRXe9 怂GSїP+~=.hFX9zdUJqN}*Ĭreiƞd_$|CoeԹ8:35bZJhu 0(P]f㒪㇤&_$|~7/1c/ N:LOuPh~)Ϊy{*N3:هRޡctG̢` 8 L5_&S;VK*]ٯE6הIz kԁ@edzJBcsR2C6Xo.B2&yu'&A v&w :ܣ&:anTf.P, {=#aZoc!`ڗ ؓo!OZZ8Xu@e:˩rD {9@+!YaZ:#F{AKq&$HL+Wei8$2D$7S?jbjZ6D}*Q |Aa,*܊)3]ƒ&Y-c}WݭbfKuJ]0&|ߴcJ,F_viGmv1kHeᗁ#\htPx.*7" mnqlRzڤ`Tԣ6$ezaq1F'&]uHΏ"C4<ΉT_ 0ӷOQH94!4I9E(ϣ=2#!x{aE+ QE+4Z_@s%"z d)ePG0\QM@Q[LOs2z]__Kn{W]z$*LrJ=gW>n XYs;=i'!:0ȗcia.ȤHUF/<:فc 4wO H*+c˔:*ӷ۟_Ӟb Pe|t93km/pϸG=d,Am{Q:up tGa)f;O&rȰK^I.wZ" $@Y*ȉƊIc+4udcN,4Nu͒nonJ9!zaE_dj#B(ؘvVj'$ī =XkL%e4{'!z-IvY#Ը5 1 ]gQlfjetOSN1}\m߫x'_~ :qHy_ F 9:v&hWC*w!Dp_9o=~dA 2U*3_{a(F`\qmzHh2OdEǴC4qY0Lxlt-o+־7@BS?F&*]A\4c|rS v2)_|mD%1p!$ ؤ;`U֥o_l|Rtl%`+qdńt7U.79ߕ[(QyZs= ,:dhRnQnpVS'|pG+yVH Ϟ>CZZ\>d#ƈ+RDAyﴔH'SV BeyQו\R湛>1⏤ȩmѸ[I䥒 .J[5^im(?i`3[WWv&6dk731I32@vF7#^5 9'dR' ns+<9ЧxRgzW<mue) O;9>16VGB/Y50{ 9eLV3"2bovE·U┉`,--Y[띔&=&q>En{7iZfW[`A@W񍙦u7^8s (jd$ߢ|h%ۊBeM5GGij = puƽ>ET?t[]/w['A >\lف1"AsEMS/脒: 4fo fgdsZZm>U1Hc5(#pژsNO"¸ X I9 Ha¡/J+U.~clSuoKy#)dȀ\٩S, IlBO[;[pϊ\(sGtWZp Ŭy=Dx"to'XXk0 Igyhy@jm%(д2Īk@@ er,9V?P_ p5S H#@bO2lrԾR)P[5iQ=¥LS SNH&. a0db= aʛ.MFuDfX]{W}2b,pDx(O\KY&A޾lNlb|v Gk!+S(Ӟ}\sx[XG} pK\u̥H.47b\l̉olOY B?i( 2dX`s5?cHBвhfعekkBșNĖN" Il65ݟcs,wT$7$T#ը`Evx[!NkRI,E`|xҁjŮ78ibu2شf;ldQ$nzS\ҹiCGXC {`ݵȺnX`4P=&vçnI߹*"&^H L֗45VT>s]tW >vKN~oS#^")WU\ck}2u sm-:"Xw5rva&(~e5tz@z ߌ4r=?&P`W;`_乺+D=ޱZsjyE4Пx=vhF%l&?]w/uSU84FjAG/=VgM3>ٜ*sZ9/2U/@$WMfȬeZ8׌c Z(s -}yǪJBV]~3QC|gÊԡyntW]Xj,'bi?j>MTZw{F%7'Ht+_O-G9 8s u m`<08%ͩNa{a"e@IKoZ#G@Si uJ R z '}:wp)W}/*4i5L`,-X \X Ih`2[ %WkQO)J$@d(o sb}|Ge_Y{p[9qK˛8sVk Zx'X(-m_`2/\g.<ɦ<ȹ*ؗdϏj6$dxLjNx̟>_ 3ҕ;~% )4-CG L#t@(+Bg19}Bq䯄mk)*IJ{(nUS5dz2W I>fzWV|>S0:F<2cM9 B ?] Ds?~@;Bxn79H4~[ގ 4i<}cuo_ 69c;Pn*紪2jDӤR% Q z(Ǟ]J z^xi ħ \8WPt Kj8#  gIwtiګ3K[vVj/xƆ 4j)3ތGi`=@rꡠ@d)L@Wj1 %Fcn>HjRS_5VҪVwN;To6 endstream endobj 817 0 obj << /Length1 2618 /Length2 31251 /Length3 0 /Length 32775 /Filter /FlateDecode >> stream xڴeTKCi݂Cqh\ww 9gfrfwłg{={W۽$UTa1%@NL,Y99-H։Qhlm`cba@u:Yl n'slƒH J;@dndANF`5H vٹ;X;;oLiCc+ $-hnhm T5qe -8_I2DU@u↑@[pf yUwow9qUU-EqVk\OmTJ:lJ1wrefvuue2svtb91YU#`:lkwߝZm$@+mTr&wL@17tWVQQ`cha55::9;>%M.uvpC*w@Z{zo m=/dhwD z=K&'"/%!( <[F9[&'7"{<& pՎrpgj451g;f5[ {gؿ\"?23݌͙'kn~Yx{ځ֎@o S prpz{S`bayA+)\ɿU,-xl&@SDfyx4hqKZHƆ6o1F`ch?: G 7_|-r2o[3k o}f hdL0rq0vVt̆?cKt L3|;tV|7.Vp?eps2wKU8&L6ws"`}n(P!X$z 89&৬:9X鰀wVwz@n}&=A/Wnon@c91_erCHxd ,%qgŴ6\M2P_:U>H#Om&eZsBĕ𖡏Wu&t2鯹ZS-[j#̞Dʺ=jJ75e-^x}+=́0R$S#m>+'_/{fI9l3hz$Wgq؏ :Эsi<-;g+qﷷw254 ^Uc܅d7eAkW/"<(Q"t(\˖X>>4hR xҿ>_8-H|\{8̎OE|66 {z#UYo3SFC9Oe?N+&4'1U8 Ԑ,=!ItV" 83Ck*dY|u:9W,LkV62 ?SojޖG0VgR?3^QbO'CƮ<: xydXirw~wm f2pCZZF΄YQ!]!)r̃u GsSNWUliv.y>nyxvTDe %)%@}9a2 gt99e P[-/9˫1SQ`qvoH͂34 ' Yz$|*G%,̧\S&}M;Լ9kehںOƓ)"] ڎlӬ{/u[JaXbdD޹yтٳn·iH;.e{%鉜LL&F]'&+sP/Sx)2qa/'d]8>P}aKpT@dCFp\naFz AUTRvqf6ȱDT]㈋r@z T>f u?Rx귫,/ Jȏ0(#E?n}GH%)s%Xp3a) c! lY|ʠ|ZC(mIJ: I{ƀsFC-Œ% W{_Z yJFsc@C]YnG~VIsm1G>DZY,tfHNwoG)>L EW^]&].^0EN8ٍXuHUG  #Zw `YW=U=wR[F>[A(WBm[? Nj }88]mY>f~-gRFf m٫H5mq>W}u}2T⮘G do2-KLL@[$N=S{L˕pADVv}t,ccMMbc3EGOK gqmҷ9/؏ 4iLP߬r!`uW(RDa)E*05ʼvLF]0[? LaUDk3nP~z}:R }S/X ˢOC\Xh8mH8HCH#KCodoKrAy.T革,2^i۬N9>x4"No+#c\@lY]ѫxoS.k=d˸*(3VO $$b=km$;y)Uoۄ]:lGasf=v#\Da)!g7?xC Q=AHPkA2U\}bJipV8uA)ynOħ=La!s6bzՒZV%^A[ӘN2Fc~ĆBsl*o}1f<_5>NeޔQZvZx fIӨ/ՄЖʔ7!C1H<ϗs.FdlbT^Z_|ٳp08,Hb@euydO첵RMe'KQ.kPKĉ&@C˘ ]\m^R L=%xšE(+@ I`6<5lD?f4+W} e^B$z/n;xY"tPcȺ|[mU@ 9[OF#HN!yU<arO~۸jZUw+ &^':GR[ ~I{gD$Azk FJqAĀN;u7Cpb;DgL^bFթx@JBOmRGheV|ǁS~: .#xfvhVx9g2=[x‡)L>St2{{D萵[4"[b~%joN5Q̭QW պrr ! 5l/nЏ9Ɠ#oIe6p x (RGXm!a"1{ QUf)K8Ѥx CJ3 w(bfR*VobX=D{%MYhb|aٖ8 qw\h#[(C#^?&1HK(,AzFPVeym> ?c+-18rܝT-YM[0*" OgU7ozɖuQ=RkB -_̥'vږ-C+_FxB6~lA:hFhp)~zvy;`ІJ;3qY=ҌpH /ewJ^=B33q))K X)7I]:qےќQMzF|%&_u[⥜>RT&Sz0 MHw^rd\*Doјf|!;*#,{)F˝q7^ڗ#?r:VnKo"e{>%o-)ަD4xU kWSEcFhYoa#@b*S\ (ɚԋ#g5fׂ5q8{8Er\ZKZ3D>y2+eK.Lv/Wo?u|%2V.ߛmmP2뺊׆)Tq \[J_pM$kt/T55 5l%Z-CK?1!4~jGq%8~$.U,M/OrDQ$FLĺ~ux?G&e.g(}=1_% xS[o:URG1u('zp#pH½k@0Փ.9^uXX`8-})uckP8i>\3-qy)O4I!7m Vs]_G昈>/q yS6V{?!`kCԷS(2J>[>"p]^:ē*`;6ɽNѠ>YDyCt;0RYV8I$Oa]}VCq!663#\G,dEի~"F::Wx)dLF!(6kXfmxt:1}CՇ.ue4c$(HpB6Y ]}g:VBTBtO)סAq=u'Ho`VYPC:P2 FaxqJoĪH>I@iITV pKO[Κs&'QkbDKS J9UABF+9$;*ŰYOV=۳!|ĔD%o5i`7A_eZ&ϗo0⻗'[`J*fZfV̢\b<;֤NA7esƪ}KGB%QTd-iH3][T\UY_Fqq}Ï.m^r6B*g52 mPm,Dng_f1v5,J>06BVnA|D%xb+کb[y{r+R.a,:QVi)J{2I |՘'ܺ\$tsAO$b}O#+ 2ukV"R~6f*Sqod]D p84}Q+@+,9&NF\0mc+7QCΠ.HK[=S[ (&;=1@Ï`&H/wm,Gy e;Px]FǙDu~*/c8lj0%*L :eh^g:ktepL첎h'֢f&OߤG-fs٪;"~nxx:!!s_e F\?G T}+MZ.I((ה1f@JAb >1N^vȷ5c#`dRC"V/؞tQ깘)"[L#E#UU\5ÐIS=iJ}k |(e&!Bн6npo6fMgcVy,~9P~ r%>ds $善{67;OȶF@ݲjxB}&_azy<)I4e@c¼L>S JD/߿w@'[ ֺ*d]WvnJM H8%e+fq8{݌"^fI'r?hKvBQ QeXsn+ g V\%ⓗpy ?gѹᆱm̦2!HPI vE)]CM.hy.>F'|'4Ԕpo|)/o}Cg(zv.%W(k׮e+y3ۨĞ%&\6Dwh ޤ {L7߳BnM' vq|>۝:癹l[U3*Xe MHm~]D͕ "Ǵ}Z,KÑZiuڛ =OxF+z:2yc)vigff5"@`AC9a=:YW3ov.C=E[xBngt}h) Lݿڭ쮽eNS^|-+6E: >2sF&R$!vojoܶRؒ_WRCRo'eY?y?ڣo,Br*tօK0D,ʡ=U/!Myf-(Aî"ft:zOyN(Fuݚ̧):55k=)5TyblaAy .'EUb-åf{iLJb}7wSӶ yh84iߵK27E$\QPm+Kw lz꾉f!X 3QC!Mܒ;EW8~w4&aYbfA:|oJ9.HqU4s-0ud\̛if)*/rXi[T+J򨪾w=֍!@ȏy~nJrAEncOh jӎڮ6AdwϹmd)oz:yGr,,¤=ͥjxgRZ\,SO)j_*JO zvWB+V U$Ri}bbr}w,PWZ\On*cM09 Ib_Uߞ=m,=ߴ{nZ%>3Ug&=>&"5j ( o~AK*L/('$n4>]:S57d]:\kS(ţY+J aen,/帒pgZjuGRևr_Z1A"QC!_FĪEӸ얉9v)ǧX*Wfp)GSAD~5 T UO M#9'{r器ч<&_Yzu4R ;,В|JKspg1;$?^TKJa8I@/cM.{_"O>|\$?jt6`%j?DQ'.(L829T 3EF:W-G2ti9Ɗ!M.dOagZە5I?R@7\r]WQVT XZ]i:F1\$#a}IOe][rb-vRm䵊F9Z0LR!!3z 6Ϙ+[-6>אXXhd_L_׵+?_Y S)>zY|iX%Ǯ:CaM>Ύ|JKU~,&f4H7U" wYEMr ݞEz\s= 7&9{V6\Չ`)\!'R?VBpXDXF 8Ϻ%M`vC(E%!veOCM]+ӐX9N`i;kV!sj.4V~ F{î8W?B3CC> 8U+0poiGjk!ч6nZQx9ܶ4!?Sie%t{&>/7lbJ—H!qJ5w'ӣh~Lmqц+NTBu5w' d38%2Em$ȇ#I?P!M4WE{"(Y(<9y _ wKo,<^\ޠN}ʺVb^"3?"FdkÅؒJ*lvN ӽ}@y:z4#Ai1̕&yO_.@y/*r^ۈ_|jԏ?q WBSBk4J\V+eڜlDIxScbMW$t>;"@)I $Xޑ.PFm)_S,V >np8FUZx%vUli6_/@k.G.ryBq5t́ e *1Q m +n4n^E b[~ğR?3KJm)cvϓ08<l_רXoQP> k~^)|(Gxr󔿾VWcЖ SǢ(1Wt䍝vX:Je-;YvR@6Wvr0j? uq,3Cp0`UmIuC$c^Ö( 4\{=  E'X,LP]Ґh1]G΋=ML jk|<;t꧜BŸn\:N9BM4&a(lG͌UX!B3e4 ?9Xܴ &ϮKk\. zw"oפ~r { k~Sq&SYKͮ(єUˣ[5;i+WA@{-o1l@.MW)>*6rt4W[Vak˫x#[96B>{~I.]Ӡ7<<\TK%h Y0uɍ wtvh m5"φx_9ou4RA'z.w48e,AE[DpnYtF}h0w(_Ƙo CL-26DHJ 9H7߃{P[ekkʶ]hjJ X @H1e-6C~mMnԈRF7^9K Dy*A򵤳ȰW.2 sA@:|(\Vm`<}퓓F,  KR5>whk :%e-Nk& d&0yĭS/ro6&cU-*M_iAMo.}XBxIӛB/k":>mqņxLgKM z(dϷѤ9C5I-Mk,ou=oU,ݯit> ~Z('0)\frDҁmK ۼy#.#Z/yAhSte7|OzPBwc&YZx7aD*#BY:rV˖Z$12`|24Jk,==?C漁f(UBb$G$7xACܫїb`,RWwC?ܘо>~hRыb6Ui043$ $)݀= 4&5|BeʥNRȮxnR o \r8yRYAxD"&qى)D}H>iB"+B KŦ`\)M q~ (A7氵h"0[I%St?][w[!NCS=qʹ;ܛ8_Zr ^sd(@-JM]4 9?(~u,0+   Q-, ,aKJT.'3ⶼf:uS\E@ vȲV:H!=6;QJW >PZGl:lj)-U %EIB^95Jp!2;!Q&4Q!F^ҶW65˱dXnCݤgXsd@ϊ~]ޗ{O[\5OKY} FE\ԡO)<@sD8`>S6.IC@{o+lk_"]fEPp ubjyP>[%N؉ MR-~d9TXil I%ބqY3^d^@%e4 #Qpʈk|{6w1-o%g^k:4b hs[ZTgu˙aߴߢepGJKADRv aڅnMњ1!(}MFb!pOi]AX~&q5R2u#S~ұ[nܖ16g& I/_W|"ǏJ)KzU~1z߾Kꑠc?l( \WA]q (ͯڽhHz]i*pS<ӈGZѺpC_ kN>';YDbwB}̑uNzZdژ%@g*'瑷0m%je}ڜR:Ū3=ddT<3fJP1q~6gq&mlH<Ɓd=V["3' /P$^NDu{ϡVL齄څYG/EC,DWWCZkڏkFِӦL-g̓?f=xڢU1'xx|(H/ w,X=- ,'@J7ŸŲbz߬yJWE&<Փb2VR?Mb2S. ָ~%)3L|cQ^r% ҧ$DvRflB:)ZQ9}T˷ 5송M LV~JWGڮ6֙^1|ȏ,yv4#9[]8ךM78(]ZnP8 Jso83K(g%uۈQK`1qfznн9!At<>G+|6@hNBE 楃-A9SAIlH^3gD|؅^ V7Li ]]T$]ai}ʶ*-_?gPDx䂼to9fF|(O;WrJGi kDQ5=q~ Xr ޓEҲbʷLPR`"~ۖ '* hVJ5d)pߢUhQW턮5J"t 6:00_6R[`*1ԈB7qqM~P[2+BD'ηV3N(gKH[P9L`:P}u8UKsV#\ IGVˢZkbȨ%?6_HO GzvZtқzHTQl9vY&RqBåN5ALXLٰ +75s|^9{"0up~MeC^KN~P¹3bZqwEd.x_Ygz ijoX`9xLmLfRzڈT~?$xhZ:Tgw^?SUi:a>ל~KR;DiTDͭ\^ctRNE Yo;v.-,,*(/:ܞXCji1]HlN>hjKHslPmضm۶m۶mm;;m[Η4jx)p}KBrI푀ST~sxmFD;"+v,$@=NO\$ ;!9LR+?MZE uI%ǖ&IGv1Nl)ہ5q,*6\y2N!bՍ 9SgfOtOSL'371_kǛ@~8R>ByɢVφs0Y>뭎,_^rͰc3bX4}wfD\ę/ nz<ЅG1'UlA@[Q(97~o' /X9GnyfvlmqlKs6oL?~Hi/,O9 f*(lgG[+ D6ԇ]f $n\Kκ\m[YjL(}+kןD5lK޶GJ,L%LGYAJrns |}FJ%#!vt  0D̎bj=e۔y'uZtT[ulѡ$z+7#vOE;GjwD(ϟ|FfSY7k!>S]Yp$Ju(YudZot.G1VҴFr۷>OT>cq+NGOO6VV3{N`.l1TdOP_pdvTb ʝ.@Ff DS^s76ׂzT(X.ggb0hmIrXK{O:j^㗵$ "\NZAMԼ< WǾ0@areb&M͕ kp=r= aNv{ %$^5@ʀpxx̪wTP%ăJfWJJ,ݲeM+E vp[ ܲ,A{< [ZC5"C3{\` Vfr$C S詤qvuD,`P,pGɽ2dXNLaȠ%KDH"(v)cą2FfJwc 񙧢96Ь@3X3GtRI.i~.a2ScN $H$׿ny` Uˣ@P`KN,8h%uto7XnaކT**,ɱW4-0)BidmfVjCí]QAq[*]fM* 7(6:CG0m86U.7-* #e . C.ߌ/x ΅>V=Y:KXwʋ2ed[:I&*Ia?@ / w#}%9pHB$\+ 1$e|hJ3y3HWJA2M t]uxNe: SM8g GyrT r-u bQ; N¦|=\1o<Ž_祝ϫ-D#x!K?EZiu6Ua7HAi?HӴyM6#q-[=c1m[sZUfu~r:e엃< ^NA:;8ŗb^$1|%?Ovɺi뺍sLX JVZߥLw)`D\c'7-OͿ/n !28If6Zku/}I.}3pŘezV ҆3-3 t;cXaZ<N0ѴBLg衲sFGu`/q9xZD4*>ś)rW\#>o6V %Uؒs;[Ze6ffc'>пYOrk*U98٪BSF{xk%Z"?JNLzwKr2㙁w? (&\4V $4'U3% Oї_c"@ɇg,|mdn_=؄ k/B8N ϣmO!7X% EۿpB5 ^4$DaoC1WuI `2diah AIJ,u9ySQߎ6F*;ןpm@ωRh˥@/`|v 5h-yuo'ٿ*\)iߤs>^˵U{_a!rw U^[ _"*u"τ<̶4hJ!"}AlYq9gPnό-N ۝㺮hpAvƣզ+لj^ C/NJaWoRlpD'.X2IY[kNR?wYõRŭ F+gm@KbD ֕BB}X`bxhgF>g+2ȗI\#ɿrz-^]ʷ>[xhߟ=c=sUþ]7J&ٰi25BJ{|XB0jECTHͨC&/qNQ+#HnZ6{ vFهk+BN9TbսumjpJ)0>Ƕw|tGYkiwuԎF Df}0!LդB{ȩ5j ^K%ELaieYϜ9V_X55E}f©$ȃ` MO+lB۝O`;Hmebp.hder$V6Ƭ{;q/8; pHMJv] ,sH >#"mkJ`(X^M҅q~~=lMN4qb~f9}xi&r!F6Mq,RlMZJ4AZGl3%H7I'%Ƚ}G_W5W " F[B͛2׳n eeby#uFRT Ƨ5.[2<&o;M(̯/)ᄶ@Ss/Cô /_FPgCD>vwV ֦FSrmrY7ôhm5+^P"vJ \,;/v/BN>B<*gRuKt96ֵHp629vje&&I+|~!U>]I0p=_,A,O탱Cl;Zr9||2M:ar.34就ک7ndH:Qߟ/YN4c$sVn/tm]H| i_MfT"_o-IXN*~Bń 6(M<;tvQF*yh/n3}Ȱt;?ʝ <6JWzoaN 6}E7VE]G {QN+/W<Dl^̄gqκ@ ۥ ,Σ}nB 8Ǜ7:MtȖNk~y,2^J`+y9C;-3dOx BAy7\MSit+b.\ɏ;@[0lڪмAC>Jӌ'QIO?5s.Uߕ UOR4ӟkr^$") yi) ).,ZyR 1q,zQ5u͊zP8%{|./!+,r%ڐS%F`hNP{jLUBd:36}draNyF4$a,iE'Gn[P_kiOpP$J (&IQ<$diוHKEvngWa wȨ6iT7G c(zC02uj(UI9[x@jٕdc^ᓦTQ0TVRSPLG^DgmN?b#$ɉ -O;@'l5n 6!5Yf_uplweRn#w7C>mĈ_XN%T)| }].C1\Ʈt2a(dxYDSa.l /T;YmZ.Fn#TKb^?)/(4{M灝{n 9䥄hZiQMd\]c!7dבDN@ ZGvO~Ockw?_ wK޺YK?s0B'#T3q,Ŝ-D|ye(N0"IN:VnT$Z&.!F ~r0]xpʵOeJ1νZ*߸6mL l&S;eⶶV'| }giyl(Y!⍱/&2;눺J*$ԯUpm|n&8ȴC L?:62pKm:Ipj]6a+%B`)tb`[IiPwWdR7 6wcf_:n KaN官FVH򯌦>9o/vO>m-h)*<78Vv"SUmza`KಮlVzïBMttɹq[.ҧ}sP2$OuK=kD::LKiu~vY}xL1!j+z-4x?aF/nXGDK(h`tŴt#FgOq 'Dɑu _Cꔓ}CCu4Dt{ -e nDoq^"5_>JB=efJ~`br>;=%"hd\I @U2`gPw-b 3+SsN+明@ϊÀր Y -80!nCU,3?6`ndc.AZU$3V뻃屯wGoKW K:8ɷEz,vINm4B8԰8I+$ qk]_`58&H?Rx $8XZ~.JdSc5ll1ŪHONX_gE < P֣ks_Tq _췶4AO7s9Y|ol\(!HxM że>ĢD3sf|zU?݁Rl-f6,|CPw([pd^^>׷O<+vnE<mTnI+hA/h.nA}v2Lw|X""ĺxNhh9,f)n)ӝjv{8 qf-]t|11vlWĊd#dT3E+V T*İ6Lpu,{6 ! &Nj|Th! J-aV[aQ 0̭nF-s>2S{_lK^֪ '짲|Q%#=_En9[Dz<N*-y w [<ԡLZnv<{k8'mBX2vUG\+ܟDDGĹ . ؞(省,H+ʠXtġ19}fvHLia>Ej ;T?Õ7M̑:2JڀEqU -5hK UCyԸB<)#!ES>Ů41*+L2RMFc4[)k;5&2^uR^أ-OJPj[udFuen7M+ƊݖѶ]DF {:C|UgBF>0v2sᅽc[^y#Wֿ ?\:ir% )ERLw 279ƝAUDɻ93J^%>D9.iۡ\oab@#Fj(@KN'v3@3_(z^ĶL M[FHb1iTc*9k4RÕ"PH?.+Am)]8݆cX~-QPU_gwS`M9 z&Pp'#}j^&QU+YwiKb'$7HOQuQ+uujdHE0s|yX2(\tpPcFawVO|I@|}.Kv*VLS!Uԏn>j7L[{'&3j 言#eKƫRNӞԖLE!¹ mx*s ueeSq !]Yw@'l˺ 6 MHxOJsP3o۪_ek[IGln`ݺkTHEU[!' Y V9䣏&pD1<*` bɪSb4kōv{JL*pvxHįFЂ eKw`zם~s8^, (wOlc\nhN^2%O:mЭ@%E"QpXN6]2&7~>cyټT-4 5^Q$V6~"0Rgߨ 9 H 8̐^@e - SP#TLVFpTʼnoe̯x8̻S BlD8+--gnpmzH~eڮ<:{Jh>uc==OWF%CæiCfbϬ`cl1|Pyfن= ĪJ\E5|ˬ4$ VFU[Ҏ/ͳgVP?6 iJkQ%N'I!O7eK@&sL~Y+;{i{5{u_5IvMkqO̻ ;Oh /6B^~gP1Zd$ۛټ KOiOwHwN?ML@S~-Fqd?=iwLOV<"68K>D{+#YXBT`b|:#!Z3)m/e].`3E8XeFZ">)i1niYodIJ`5,X3VZu,;LFH; nNq9T etar&?Dm*{ vd4o2 NPHe>gvQP`'.d?) = .qR*wL=S{6#^]_^/̒麈BAPSn4jsBX,W2st36.a٦#D=r-v+>wO ™? .}L91=9 ~e96`Kg&J 口&{A6qjj@c1rnBE${PB;O{t:zHTRpNlԧR|x`eĵ(? 'O'%bDn3S7Ԩ,&@ 'j['l}`w4W:Z%v ;4Ab Z=Z!>- ~cbTq#abv$G SR}3Bu3F~8LZ:Ӂ/3@h-EC:cyatip?,.AmN&75Löu m3 8kME|`|E8ɴ5/U;ߘiR^Ka2WP/GiL=w&Bb+H܈-Wxšz9{-d*Hyg 9beRlٯF4Lw2N#XEwO4Yߵ\o]h1wR J25P ?>.} v((JY8a_%_a/+_Lfԭj%P,ENlw{ǂIIcUyT[K"]vyo89M-T^QG'Nj>40 t]WmK1lpxNcq_ r2p6:)+BJƃY˕nbMO]%0CΚX2;?&K ~q)I8DFG5$n*GC@>]:$}Ӻk~HuLj JǠ.΃^Pc;'׶-/%^j;DG=ԗY^Z򟀈q\r5cc-N2f8yӜD8;Z 5Ai[f& ZQpJlf4 hP e#ȴ1:;%(iE[2o!'q.%4>Dq<+]d^ !u?-֞-=ӳy <՛$;HXEab1g|qo _$iq,ɼ*?n*AH1c%L;nl+okdA/jX ?h{/.eVf5,,w3cu QiNr~& ͗0&gfOzFAxޙ*d},h|[ n SC3"D~/(0̺_p**HmSeYP*kK(t\u{=D$Utt8;̲ ?<.L~ڟ"-\&a ҨBioqafm1%)GyUL";> stream xmUMo0+J! ᫊"RVmk N7R$ݪ70W?g_,ɍehܬ=WWU\;;׺v7MOtҺ=po>fv8 | G՗_n}w̭][GL2sQ擾ݾk^!00jYV%H~~v}\; C}h{ϗC`Rރѩc~^ON6[7ݛ ZԲW/{FR^ww?U4H6!L@@B@q\s *G|F/+>㹴3Z~Z83f3[:٭ ߬Lg3t33 ~!>CO!>S 33>IY ?BXIAup*Çq G潪N$p|eO_:q;:'dE_kCvW endstream endobj 820 0 obj << /Length 846 /Filter /FlateDecode >> stream xuUMo@Wla_BZXʡMW ldiof<ۻW_W7nzrc7)U7Nߜk]{7+wR}uN7|5s. )裮ݏk&8n~iyQqE0N[,g IM/*D@f`B9xczOpm`>W'9WRzL E]PwWqD`PދoSφ}= imX]ӷn<7̵^y]/׵Il/ܥ: ل0%1 " 0Z{q́0R0r0QK5<T`,if,1L.S5?׃[#M cL#F3X1+N978Nsk`q KpN8q )q4ϮEp O.5Ypc.Y7ь1O*ezl,d mY%0ymȋ,aYʘ8 xA} 3/Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{xᇣI^U E'b\o|s C:].cDܛX=oNܙ endstream endobj 821 0 obj << /Length 845 /Filter /FlateDecode >> stream xuUMo@+H.ȲrhQիԒ ؇6jo73o{q3mfѭVOn/Cf)rtskzf꺼Ɠpi?p>fv8coJ?< a9(})suזÌ\$qATh L}s6G 7o],jotuþ{UןtptZ|MÏѩNN6[7ݫ ZԲWO&suB`ilB =@ )U 9yI(ѥ S*043``MSiv|kiCXc, pDˆzA:x0)ljsn l9u}SrI4"nXCA8%&ٵ6AI cMϱXS_S/w"': fyRy(#c^g!ch"ƨ-kC^d cRx~h K^| МQV14Nd5cY9Y?C9돡'g ?%>O:ShYggΈrYgDg>[bghX|&^V|{ig33qgng3tZ[Yog,g-g B|B|\3gg3?f)O5[TT+&GUP#a#7a/c?w:'dEgtdbP2ڂ endstream endobj 822 0 obj << /Length 843 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N7R!ݪ70W?g_,ɝиYs{ ]7;׺v=ߩǡoݨM'opiT}IAu~\3;he?<{Q%(SVk-#&9sQ擾ݾk^!00j(+m$?Gwt>X.oTuþ{S_tpСtZ|I1?H/'BZV;ݛ ZԲW/{FR^ww?U4H6!L@@B@q\s *G|F/+>㹴3Z~Z83f3[:٭ ߬Lg3t33 ~!>CO!>S 33>IY ?BXIAup*Çq G潪N$p|eO_:q;:'dE_kCa endstream endobj 823 0 obj << /Length 845 /Filter /FlateDecode >> stream xuUMo@+H.ȲrhQիԒ Ƈ6jo73o{q3mfѭVO_SpuUsk;8ƍ꺼x]snbT}AAu~\3;DZ7cAޏO|X}+JZka\$qATh L}3ʊ~wɛݮK57F:oкa߽t:8Q:XTvIYo'BZ;ݫ ZԲWO&suB`ilB =@ )U 9yI(ѥ S*043``MSiv|kiCXc, pDˆzA:x0)ljsn l9u}SrI4"nXCA8%&ٵ6AI cMϱXS_S/w"': fyRy(#c^g!ch"ƨ-kC^d cRx~h K^| МQV14Nd5cY9Y?C9돡'g ?%>O:ShYggΈrYgDg>[bghX|&^V|{ig33qgng3tZ[Yog,g-g B|B|\3gg3?f)O5[TT+&GUP#a#7a/c?w:'dEgtdbPMڌ endstream endobj 824 0 obj << /Length 667 /Filter /FlateDecode >> stream xmTn0CB*D rضj^p6;oltR3ތm=&i$͹+$o)'[֖wkuͷu5P.^ϥ/UqlN~iՠ $""Ĉ FpUS u+$b]Ys>zb:z:VuyS EY_8{{&X,^CnCWڮ_/w} d\|?Y1{[kEkMiv_n_`!R,6e`wʧclBrՒ5yN҄G&1!ʇ' Ds!FJRLDL "P)jHQ#]Xssc*~;2 >Dm^SSf<bLl*mavu|3*qiSƒWgMvpzQƹ~KtiSxЊk] 桹'eA 7=s>eƘOA~yՌk?s׮G0x-o|eka>kZ8s&wsaY1:@+r~sZתi"_>6_֯en endstream endobj 825 0 obj << /Length 590 /Filter /FlateDecode >> stream xmTM0W$BB" 8twWH M N~3j+Dofތm>6eQ> stream xmSMo0WxHq@"H Z5]DNr߯P q gޛgٯ?zfwzYտnJ>tГyJOFW2TE)`2?__[ղA^z|/FX@ KXbm@wQ$|bD8IcLNR =F"BF_^#APթ[|ͮW ޵-ՙﲙжzqLLIsoe $x> stream xmTn0CB*D rضj^p6;olvR3ތm=&i$͹+$o)'[֖wkuͷu5P.^ϥ/U} ~?'ZwI>W+|y'BpUS u+$b]Ys>zy1 q@YhH޽=mc,bD/{co7+mW/bݹm_-,,GFOVL"r~}/l_lr)2u;S16X9CjIx<'Bi# CΓ@lMDϹLPT#ZC%t)&"lb&TE5Ҍk]WL،]\FB^G5339syh[jWx0OEd>`[~1A;:3*qiSƒWgMvpzQƹ~KtiSxЊk] 桹'eA 7=s>eƘOA~yՌk?s׮G0x-o|eka>kZ8s&wsaY1:@+rs~soZתi=6_wcC endstream endobj 828 0 obj << /Length 752 /Filter /FlateDecode >> stream x}Ko0 ϢRHcp"HYL[5h 8 ߏϽ&P鱹򸛬`'V'7箰uWW)'[֖wkĵޚm] 7.x[oҎQe~'?_Cm'~b&9b? lWM}'[)R7'S'#C0eU ~Eə{?Ӷ>6r)Of?tD|LvU"?$ts۾YVGWys?Y1lK{kED)}/l_lr%*u=P9ǏZǫ`*džt:Xjlh0S1;]Պj\ "@G?V3:f : ֔F0!& .5 k"e6a2R)4̉f8";<'X7FnzN1svrvz5jfEr:f ,aYu9kxGaٚ52C Uz Ԓ5f!ϥpaM0|b >1i;x;\N0f;5_YrM9ct9%bNE}s5R//3_aNy̆gxOΜ1r'xr'O͙3x7g΄r1gΔ3x~w73sj0g[93+vqVŹAF%L8^ӶiE6o檵 endstream endobj 829 0 obj << /Length 668 /Filter /FlateDecode >> stream xmTn@Cx0ލ,Klɇ6QUڰNim@Λ]dyofw򴛤es^g7 nn򦸜m=|O]S nmᎂuqvʾVGt1='M'R 'R#mWM Խu]f`XemL*eU ~Lc@y[`gz ]i~W]dA`=R9lsk/o!sT4}a}jKl)r8 9*VK"&9JVaD(r$L"fGh"Ex΅d*K1a320.BEDf\#Etbb͍]f07't6:XCX:1:3vxlNWOTT1I90W S9xT>&Ns 2r> stream xmMo0C@1m !%$H9CMTJIn0Ȁx r=y~gɯmP٭oֽOe&U- L @Zn|8S`T]-? ç;47itwrkibGw#n.6*+e6f(JnX0x{n;6P4K={7,| 6G>e}Ӝ]p+8 ]eIqhx됽+7.a{KJ endstream endobj 831 0 obj << /Length 581 /Filter /FlateDecode >> stream xڅTM0W$I !9HZPkHNB==?y3|{ߺnR|@^MndV z_Ļi- boV OVZè(cJԝ}垺C=%$l_(m JLߴExRJKulwfwb6Z?46wbuS }oo>b!fv̍|?97SiQL?3iEkם ,mZ^@̾Cu |Z{jk軲S#8 )bQKt^]yV+bg's"IDDb48ȑXY<"  C) hU=D'1ǜ?F0O8e"V [H%a/C1F}3F}릜?P9Fc)('qsQs_q_!UW~B놄."u#q_1j2+g+c> stream xڅTM0W$I !9HZPkHNB==?y3|{ߺnR|@^MndV z_Ļi- boV OVZè(cJԝ.}垺C=%$l_(m JLߴExRJKulwfwb6Z?46wbuS }oo>b!fv̍|?97SiQL?3iEkם ,mZ^@̾Cu |Z{jk軲S#8 )bQKt^]yV+bg's"IDDb48ȑXY<"  C) hU=D'1ǜ?F0O8e"V [H%a/C1F}3F}릜?P9Fc)('qsQs_q_!UW~B놄."u#q_1j2+g+c> stream x\SH_o (խ7acC46׿eIR xm .$Ցwf$JI4$Y8Ub.2MJOE;f&dt'k͒L }JT1zh );Ff4 TШfsd4Ku^DYOT4Tq(L<g4#덤 uF%Yjd:K 8o*4If$VޠBTqOhQ!$NI6$x6udLe F=$SƑ*LT#BR DRR関f@/zLiKsE٘/QE T#M}>4aa*_ɻF>+#_&<ٙĚnȴb/pٞ> f:}x_`~嶈PgWIu z(t6~0A:dgPNѼARYVC53 JnhL *尾TQqΰ cG+@ %MA\P&hX)SY`IO#*8= ݾQL[ zS|!rAh|MUԃL I2# ǝ|R>3>! 瓺O|0y*>CDxnhْ`oF sXEj~x4k7&bmD\>xLͬ/ 7I*qQbtw Q|ts2g]џ`/tP\pc6[\c] ܋a9" z\\\_}VŨ_p B jX_OKjt)2ֺh$?'yW\CqŶ7~ Rx#($z+N;^|ũ8/Řq:j[)N9Lzbҧm 'sq&:\.R\R[|]}1O1#1U|ōG/1Әa!(d)boB43F舋`X{EKEfq'. ^=i|\]5\`E|Tu+ m㟈x|E]SB÷W!W1ܟuG"8>}8m>"g2dj2s;ŴW۔MhSND~nbAj0u^~-q#a;NbId&>3n۟}ȣy!>чCx޻v-6_>hhzC^acp'|pM4E6MW v 5^覚/393'm/ ׵KzءhJZ"cG t!$A -HmMN$b4r6&UH#RJ=&iNrJIu1vȡgϙ`HjH#؜g!'ΎL, ~_‚K,ks\kk2JQ/,{ 22 RagZZ'Hdr60'Bl#3a̅$Id) 1d{ f %aޖ+ddbyQ!B,C(蠸cd!K.JKZ~YNQU!p!:r^ťriNOIdFӪ)qw2kp:_!JrX `*9R347),6<1bHPX%faX (lTD$YpXlaoTSA¥BdQ;d?[jXeH,#}LMBDo*LOODCr qcT8Ls`T\*@JhQ+vQ{10.H`fyڇh,EQGbfQ1hMm~R~\]XKƖ C 6V!B:$K5@aFT٪9C4(+s*Pq +HH\\uIpWi&H} }7,LoCiQѕP2wF2nz\؎[Yp.jfCL%]FVH,n!Cѭ!I2eկ[#it F5!e}`rjшl5uk*RI @يmrm\DZ1sBg IH II1U)SlƔy1rH1Q{\9kHAQQs} 5z#Q@He:FF~ b( @İ@"w;[{=AkYV[s":"Q"i xP#^ eL8&I6$EQ)cKh /*;ΰN %6l0!s&dv*RxGxBed/g{ɍ +p.}Vpf|\\Y^$U)OcsY߭a$PiaI y5LM"4Xji l`4mgzqqi zeUKp;چYbm0a68K޲ yQmОFa7J\'ָuaۀm=,`Ek |oY<\qu= lj*mYxWi Ct4(wjƑp2(X!Ŋ-Z ;3.dFzx #94';>V15 ZKcC0Xb.ߣy,TLAS@%L[j EE$@~Rc"(^5Ԙ D3Pe^bwj:☩PA,/X5~%YUX d3ѝ4`]QKAO?+=V/ h|N(˽s89yϻ/d:=KF;)=iur`lҜxqJ\eYG+ņͯy,x.`w66<wQ|m'bWjw~{Y3HeO}sZٱ@ +=|G5=o iZ1[<"%yƠ?Cv, Zӻ{#Ijze#qwˋ:@9HA(Yd>C EcVDs0v>sȗF\+`.؂S6zTZT~|uxhݹ^N4 6Վk|Kuß7Ru[گBӾI\--khGm2T/fh KprxD~AEqvKFJ4uónI"ć*[V\4O xU}776rBڛb`aDtg B*Z+]1'CsP&z~M%epX5 nOGV辋w5ji8\)s;[[`fWw<ѡc/H?8ɛ8=]$ή%4$ڭERCNÌ7U8bD)[-ْ.QDAي 3dV\C$Z$ At=q3 = yiXYm mIQWtgnyqxH֒S?3I 3 1+~|h>|蛿7__ELt Oz^pnْO..vI 6ZR *] g k䕤AҜoc%WlzX>w{KxekM0%e[r`m@-*6L&Wa_sfn6U֧t l>w|Û66BVPBkn߉a5Հ!!)V]?Q署Uk endstream endobj 833 0 obj << /Length 584 /Filter /FlateDecode >> stream xڅTM0W$I !9HZPkpB }=JUW{ zyol3wE 9i nl[jxv[fɐwJ^oL28/~/ݥeu/ݩUC^K}.C=\M—\fs~V0sn[UmV{g1eV5#:p> stream xmTM0W$BB" 8twWH M N~3j+Dofތm>6eQ01XjGiʙa2\1JїZ)b5ʈZXC8pF8$4<1Fm* x<)Na"y>R-o1?%R# it;%:N/M=7䥳YW5GO= C endstream endobj 836 0 obj << /Length 482 /Filter /FlateDecode >> stream xmSM0+C6&YEH|)6Q+'`C}=6*73o0qSٜ )0^lV4bAo^ɇiz2^ɊZ\ ($؇̏3Uu)Z8$JLJ3;-1 h2wVZ9q"Ǔ{~L>ܺ>7vKOzssH0J_5: m{Ah$DVU5w̼/HJ- ٖe>t++k|2Dx爌Ya1 |JV A"uDNy") htVE204`iSA׈c3 wM$].7ufY:fU*0^}#^yrMkts1c횻e_ᾎmb{O?/0+ endstream endobj 837 0 obj << /Length 668 /Filter /FlateDecode >> stream xmTAn0!@rpLRLYqPHt6Y>YRhwgvInUķRĈ Fpwן궹VJIĺhP7UlgU]aHc@49b!4o&E\_"~wWBF˥܁QG'[{xzмVQVK-\f\SNR$b ab^ aeuQ^s$L"fO"REx΅d*ڧؘMP9DXb"2rF]1.;vUr.,FJ^kKo"Agrж4c)sd>a[NN.J195kdY]$\^snaKC??qFqMyc0=) &l(mi,s|d &\cVۮf\iĜ=q6h!ކ}Ce}.A A ul™,kr ZYV'  \65֍{tm,iauCe endstream endobj 838 0 obj << /Length 667 /Filter /FlateDecode >> stream xmTAn0!@rpLRLYqPHt6Y>YRqhwgvInUķR+|z'Bpwן궹VJIĺht4t3EJ.gy yvqhGzy7vMu"/ޝr)*wjщ駾?uNh^+l+w͋R.bYFyBaM)VPZ01/P:M(9O&' "> stream x}Ko0 ϢRHcIE 6jlSp:L@@{CU>{vg7R<=.my@g G*U]aE0moRLa߉*E\~H#Ǯ{s2ZDnwpbЧΉ֊)˶rC+]k^\r%*rM=ShC?z6^hia,6T6lqV Ӥ:e ZΡg $tʚ,XS5UL5sBLS\X^k)D,+_ mø 24̉g18b;<'Z&7Anz^g: 1svrz4jVywF> stream xmTAn0!@rpLRLYqPHt6>YRhwgvInUķR<=_]tuU7*Wo;зΝu-M}mS+7F?h^#:ID>էWR#.]?ms'ԭuShP7UlgU]ŠƀprmshBLpM4+͋EuKQNL?9yK-\f\SNR$b ab^ aeuQ^s$L"fO"REx΅d*ڧؘMP9DXb"2rF]1.;vUr.,FJ^kKo"Agrж4c)sd>a[NN.J195kdY]$\^snaKC??qFqMyc0=) &l(mi,s|d &\cVۮf\iĜ=q6h!ކ}Ce}.A A ul™,kr ZYV'  \65֍{tm,iau1e endstream endobj 841 0 obj << /Length 667 /Filter /FlateDecode >> stream xmTn0CB*D rضj^Sp&;oltR3ތm=&iټIt+œsWI}WWySO-m9c;;lojm]ϥUqlN~iOQwID>WÑ"Ĉ FpUS u+$b]Ys>zb:z:Tuy*gq1 yMXӇ]U _m{ d\|?Y1{[kEkMiv_n_`!R,6e`wʧ؄b%k  +C0Lb"B9O&#4"> stream xmUMo0Wx B H=l[jWHL7DI8otUE/3ocvO̽o]'6ɚ|}q/]Sl n׏c] wAXsGעoL8TDBV ǠjYN|mỾj9>^}Pew5#)-ʪ_[B3y{zMXkXBsW'gae{nۣ !Rڟv'/_!y^hVhJ߷wG )bkj[Q; Z?ZϓeP:`eY1 4A VE@<DN)"k57 (exdLeP0#X G1,ao1,6>,,؄A Oqa!ZRnZ=vBj &V+19aJ{^Hj2` L΂=(nE5#ls֠^- $b8Z3^b:I2&}{Moρ+ &`ʫp JixF˜P!=(p<4)j7<oxY=1$טF- -OÛ5bZKrތ W1jq׹GJ . W\Yr> stream xmo0+&z@ !TS#fڇ-)p_ہ^~:/L,l޲L&[I EGdFYQIb MMogN-;#uz gp릧N |m:MkzGp)ְ{7vmdeh;Dw WpԐr,|`CeWZys7-V($ CpOZlZی3CѴvu]"`XuBpxe}zJMQT =/0#G^ hhvO1jLC ˕} %ef4>hn&7kY}SbgJ endstream endobj 884 0 obj << /Producer (pdfTeX-1.40.22) /Author(\376\377\000P\000a\000t\000r\000i\000c\000k\000\040\000M\000a\000i\000r\000,\000\040\000R\000e\000i\000n\000h\000o\000l\000d\000\040\000H\000a\000t\000z\000i\000n\000g\000e\000r\000,\000\040\000M\000a\000r\000c\000o\000\040\000J\000.\000\040\000M\000a\000i\000e\000r)/Title(\376\377\000E\000x\000t\000e\000n\000d\000e\000d\000\040\000R\000a\000s\000c\000h\000\040\000M\000o\000d\000e\000l\000i\000n\000g\000:\000\040\000T\000h\000e\000\040\000R\000\040\000P\000a\000c\000k\000a\000g\000e\000\040\000e\000R\000m)/Subject()/Creator(LaTeX with hyperref)/Keywords(\376\377\000e\000R\000m\000\040\000P\000a\000c\000k\000a\000g\000e\000,\000\040\000R\000a\000s\000c\000h\000\040\000M\000o\000d\000e\000l\000\040\000\050\000R\000M\000\051\000,\000\040\000L\000L\000T\000M\000,\000\040\000R\000S\000M\000,\000\040\000L\000R\000S\000M\000,\000\040\000P\000C\000M\000,\000\040\000L\000P\000C\000M\000,\000\040\000L\000L\000R\000A\000,\000\040\000C\000M\000L\000\040\000e\000s\000t\000i\000m\000a\000t\000i\000o\000n) /CreationDate (D:20230927160843-04'00') /ModDate (D:20230927160843-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2022/dev/Debian) kpathsea version 6.3.4/dev) >> endobj 834 0 obj << /Type /ObjStm /N 80 /First 702 /Length 3519 /Filter /FlateDecode >> stream xڵ[[SF~W-vQMRűC6kS1PJ_tDKꑍ7t\s*u&DpjEB8I_f) DS,!iJD*dB![T #tO]"8D5%҄Hc ̂"2u( `m&NO)x|Z-`3L$A4G=u"0vD&ZZ"|/M6/ft&dOuÉG\Ax|:pp6JA$Gr180ŷO|yWF:J-5߁v4#Gu0'Ax7דW~`4 w2K{}S0N>O՛xAM`M,[gwywT vU9<NJ7u/X:6D=p zc9`l1ߍyr6r:Dp "/WuDCXlIWPNIɿfCl!ut[珢jj6):u3/ca-}sT'Y4F?HڅүU)1deDyO4:tŽ ^Ϋvn/ΫҷMkM˞V5b9$LZGtaUz%C54 jh&邯Ҩ+XRvr"m팰zz{͚U510^cߪw%qPvz-#]P;Ftf5<Ğw2IF&DhGYf͇jCx{֏= eYn'$pHYnnVCp.TF8Hin:6m;|`6G`Y05Ět&iL}d{"a-."|-rX{&(}ɗ7ǔY=LJ5>?}Q7"d,oߢ-8,nxUwE-5|}n.6'lp4-V*mGNE }V=)1LSeHC{\Գu]{f |K.?|WN{yUVCK>HD^6HTJPhmfrGmY;XX/N"mY֕!ꡣ~=qC}d,ks9˫["cҸXy^}nCH$4E鋡^⶘Y"ߧbEDEotqv8mьf|Kj* U6s ~>t., DwF+(l`ݗNz@ow#%^Cp}n*?.v̚~P-GTVʤ+BF 䲩`YW(hN*UɶRd&c%EDJ9j?0MYfN/SE#p?`.g=?:C`:CkAS0/|g"jH 7m;|z=@B׺X]k/s[" tlQo_s7Wn 76Q52Hx!Q65lD3'T#`1sTCO r5h0r)w !ǽ8,u^1:T@BƫTbH@=BB0E٧"0}>QQ(Rq`47rp$bYZ5p՘ΑW芎lА2=1ÁrYΖ_lW%M,>p!c:/}mЏ~W%mjP)zỲGF25lenkh5 ޛZdKJ&xX&uNWe'ۇeu|rU2G0GO)zH =&By}[QL3vw*ߧmUeE*krLfRj#BzPڞcD9wט3s,|X,o}8zIJX|{.z  zay!o-s{띳EmR-,=qfF3cVv@z.Ym'=3pm[PYv[e4,Zts+˫o`}G<+ .{yDb0>2`! 0!v,b8.+ k]֟= G.^&mǎ.E.TmQg %G4ąmZy݋(f) Y-P9?9}C>ͮa<>uI?0W힢G;Mm>"=,C1pvM]{v=34 [(p 1j;C|C)6cȀmC<2-RM ,̔C5y1e 6xK'v&5-MIQ Qaw_ii_]~㴇ey~ӤW+0jѱ+" m.{Y*퓪UKBF[!Eha+B j%6MW_۵XOIu:ci͏P<ʚl^mk?@ n'~.?+ouگ|y`k׀; endstream endobj 885 0 obj << /Type /XRef /Index [0 886] /Size 886 /W [1 3 1] /Root 883 0 R /Info 884 0 R /ID [<941FE93FC7719A3B5475DFD0F4DC11E8> <941FE93FC7719A3B5475DFD0F4DC11E8>] /Length 2130 /Filter /FlateDecode >> stream x%kh]Y:ޤM$mӦytw6MG<4iҴIfO00nja 0E-"[#>@A_ϗks9{_ks$I&IX4`-Ia@#1," |@*|'V&`Tw.Pc w|J32ua}~ z|2kp_;C A|- A 4SЌ^tQQ|32i(8yR l>MKPRN;ЁY|2<:u^.~p 2#``LI0 f "X+$F7*K(bmcIױa,ͮpl @Y@$3bKX'tnup `l;.yKST1H"Y,noXRQ Շnp2:TYb57*` -Pas6hDQG)#z"gDԑrH9b8 j,9w(3"X˜WD԰@PD,@ϱ∊#8"#z8"#8"0#Œ5oSGeG*%"8Nt9p>DuDQep%GtUDqڒg@-DQ]Du]k5>e.Q=LO/HAA TJmG`'X.K>x^KUUQϵ@]y{Lg-7ixzgcd8 N`%imOmA`(7GplT@d`ehE ݠ>p` 0 8gkn\` 0 -:M,b̀+`́`,˖<ҋ"8ep``ئoPY 1 Zb~YV'kĊݲF<"k̊x,_n5n+kŠY֤?.kJOSִ^zM֌^iuJyJ֬9+ZI4a*fޖ`/C֢U<~I֒U>;t39^CRor(+U9^w<srxGs-ǣa%;c9;'G->Vyt.p[ \"ep !0 F(ׁ^VL}O}_`\`*=oO'l< endstream endobj startxref 518764 %%EOF eRm/inst/doc/eRm.R0000644000175100001440000000655414505105713013416 0ustar hornikusers### R code from vignette source 'eRm.Rnw' ################################################### ### code chunk number 1: eRm.Rnw:634-637 ################################################### library("eRm") res.rasch <- RM(raschdat1) pres.rasch <- person.parameter(res.rasch) ################################################### ### code chunk number 2: eRm.Rnw:640-642 ################################################### lrres.rasch <- LRtest(res.rasch, splitcr = "mean") lrres.rasch ################################################### ### code chunk number 3: plotGOF-lrres-rasch (eval = FALSE) ################################################### ## plotGOF(lrres.rasch, beta.subset=c(14,5,18,7,1), tlab="item", conf=list(ia=FALSE,col="blue",lty="dotted")) ################################################### ### code chunk number 4: plotGOF-lrres-rasch-plot ################################################### plotGOF(lrres.rasch, beta.subset=c(14,5,18,7,1), tlab="item", conf=list(ia=FALSE,col="blue",lty="dotted")) ################################################### ### code chunk number 5: eRm.Rnw:665-668 ################################################### W <- matrix(c(1,2,1,3,2,2,2,1,1,1),ncol=2) res.lltm <- LLTM(lltmdat2, W) summary(res.lltm) ################################################### ### code chunk number 6: eRm.Rnw:681-684 ################################################### data(pcmdat2) res.rsm <- RSM(pcmdat2) thresholds(res.rsm) ################################################### ### code chunk number 7: plotICC-res-rsm (eval = FALSE) ################################################### ## plotICC(res.rsm, mplot=TRUE, legpos=FALSE,ask=FALSE) ################################################### ### code chunk number 8: plotICC-res-rsm-plot ################################################### plotICC(res.rsm, mplot=TRUE, legpos=FALSE,ask=FALSE) ################################################### ### code chunk number 9: plotPImap-res-pcm (eval = FALSE) ################################################### ## res.pcm <- PCM(pcmdat2) ## plotPImap(res.pcm, sorted = TRUE) ################################################### ### code chunk number 10: plotPImap-res-pcm-plot ################################################### res.pcm <- PCM(pcmdat2) plotPImap(res.pcm, sorted = TRUE) ################################################### ### code chunk number 11: eRm.Rnw:714-716 ################################################### pres.pcm <- person.parameter(res.pcm) itemfit(pres.pcm) ################################################### ### code chunk number 12: eRm.Rnw:720-724 ################################################### lr<- 2*(res.pcm$loglik-res.rsm$loglik) df<- res.pcm$npar-res.rsm$npar pvalue<-1-pchisq(lr,df) cat("LR statistic: ", lr, " df =",df, " p =",pvalue, "\n") ################################################### ### code chunk number 13: eRm.Rnw:741-742 ################################################### grouplpcm <- rep(1:2, each = 10) ################################################### ### code chunk number 14: eRm.Rnw:746-748 ################################################### reslpcm <- LPCM(lpcmdat, mpoints = 2, groupvec = grouplpcm, sum0 = FALSE) model.matrix(reslpcm) ################################################### ### code chunk number 15: eRm.Rnw:751-752 ################################################### coef(reslpcm, parm="eta") eRm/inst/CITATION0000755000175100001440000000641614473216634013151 0ustar hornikusersbibentry(bibtype="Article", title = "Extended Rasch modeling: The eRm package for the application of IRT models in R", author = c(person(given = "Patrick", family = "Mair", email = "mair@fas.harvard.edu", comment = c(ORCID = "0000-0003-0100-6511")), person(given = "Reinhold", family = "Hatzinger")), journal = "Journal of Statistical Software", year = "2007", page = "1--20", volume = "20", issue = "9", doi = "10.18637/jss.v020.i09", mheader = "The original JSS article:" ) bibentry(bibtype="Article", title = "CML based estimation of extended Rasch models with the eRm package in R", author = c(person(given = "Patrick", family = "Mair", email = "mair@fas.harvard.edu", comment = c(ORCID = "0000-0003-0100-6511")), person(given = "Reinhold", family = "Hatzinger")), journal = "Psychology Science", year = "2007", page = "26--43", volume = "49", issue = "1", doi = "10.18637/jss.v020.i09", mheader = "Article about CML Estimation in eRm:" ) bibentry(bibtype="Article", title = "IRT models with relaxed assumptions in eRm: A manual-like instruction", author = c(person(given = "Reinhold", family = "Hatzinger"), person(given = "Thomas", family = "Rusch", email = "thomas.rusch@wu.ac.at")), journal = "Psychology Science Quarterly", year = "2009", page = "87--120", volume = "51", issue = "1", mheader = "Article about LLRAs in eRm:" ) bibentry(bibtype="InProceedings", title = "Linear logistic models with relaxed assumptions in R", author = c(person(given = "Thomas", family = "Rusch", email = "thomas.rusch@wu.ac.at"), person(given = "Marco", family = "Maier"), person(given = "Reinhold", family = "Hatzinger")), booktitle = "Algorithms from and for Nature and Life", editor = c(person("Berthold", "Lausen"), person("Dirk", "van den Poel"), person("Alfred", "Ultsch")), series = "Studies in Classification, Data Analysis, and Knowledge Organization", year = 2013, page = "337--347", address = "New York", publisher = "Springer", doi = "10.1007/978-3-319-00035-0_34", mheader = "Book Chapter about LLRAs:" ) bibentry(bibtype="Article", title = "An empirical power analysis of quasi-exact tests for the Rasch model: Measurement invariance in small samples", author = c(person(given = "Ingrid", family = "Koller"), person(given = "Marco", family = "Maier"), person(given = "Reinhold", family = "Hatzinger")), journal = "Methodology", year = "2015", page = "45--54", volume = "11", issue = "2", doi = "10.1027/1614-2241/a000090", mheader = "Article about the performance of Quasi-Exact Tests in eRm:" ) bibentry(bibtype="Article", title = "Testing the local independence assumption of the Rasch model with Q3-based nonparametric model tests", author = c(person(given = "Rudolf", family = "Debelak"), person(given = "Ingrid", family = "Koller")), journal = "Applied Psychological Measurement", year = "2019", page = "103--117", volume = "44", issue = "2", doi = "10.1177/0146621619835501", mheader = "Article about the Performance of the nonparametric Q3 Tests in eRm:" ) eRm/inst/NEWSRd2txt.R0000755000175100001440000000123214375241642014010 0ustar hornikuserslibrary("tools") Rd2txt_options( width = 80L, minIndent = 2L, extraIndent = 2L, sectionIndent = 2L, sectionExtra = 2L, underline_titles = FALSE ) Rd2txt("NEWS.Rd", out="../NEWS") system("R CMD Rd2pdf --no-preview --encoding=UTF-8 --force NEWS.Rd") system("gswin64c -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dEmbedAllFonts=true -dPDFSETTINGS=/screen -sColorConversionStrategy=/RGB -sOutputICCProfile=srgb.icc -dCompatibilityLevel=1.5 -dAutoRotatePages=/None -sOutputFile=NEWSx.pdf NEWS.pdf") system("qpdf --stream-data=compress --object-streams=generate NEWSx.pdf NEWS.pdf") file.remove("NEWSx.pdf") eRm/inst/NEWS.pdf0000755000175100001440000011364614375241642013265 0ustar hornikusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 2332 /Filter /FlateDecode /N 45 /First 339 >> stream xYks۶~5 |ɌW?J~tlI'ߤ$+Z&@.(l)0yeǜb| L@ULEH<6, LLZJ11 EgoL̑G'渖`R0Gy_2ײ&mJe1 Ez.^PLgn^1T0Iw/`<]mw +el)lļ@`c>` l( m]<EhK??Y32_D΀_8Ef|={ƈ[$e~DK QLw>opkvȨ]ł4?L,J)=?qU`$V+8cUb1lw| ;T-13T %C]1~',ORFJi3~5:z}=.IdD^E0e,ԌKllɍ"*fP6"w:WUH%_UӂExq]/mVS]j9Dk5kz>h@Nt/,2@aT#cIɵ`7;#$8!Szz6! kjuYѻl,ԓȨJwҳxF[-5~mE}>c>xfs~}cKG|xĚ?rSQ2)x=TkIONHc#ڻiab[4VChƶ Gx*_FSnᯠgW6/$~ R[d<*SүқJ3#A _DErYVn[UV+TӞѥ,;+~w.ˬֿydDmf1՚Y[?X=?K~o;x$ 巈&t*&$%߁QӟcIO1vYSEYV,]^R#2e*EGSk 釨6[sY x+6BW\إeC@KeҐJږ ud8 n߿,Y 9iJfkد6e#_rۙF:ZyW6Ow]sH|}msUusiԣvarC£5{[ s_.tfODʁ̹v>CX^:DMT7.ʻ~Am-[kͽYS ю'!.'iwh[qw;lu~lx1WVL\4p;fm3=IRMFw:]*ڕTfET\mϬ̶k=~"afW\?; MթH粒IwKH}^em.\N8!ejm%]spWoV)@T}Ii$=+?i'2!]=:->eۖ- R]j]Oɟ_&\p" vH)_%ZɏږW0a(on]U=MMg?UgE,$u[VxnKc-wxtgejme1\L[R+ 8P@Y[% jLj%i:Bp0~7 [wE6D^g-(qkA%> \"ΚxVMnq"߆kF9jE#lӇU%V,D⾟䋂AAWȂX+* ^p`>܌; ^ήt)wBbW҇YN&Q4?VS3_Z ;rLKnX+iCi3Ke.";icq Dg,ULlkY,04"&4<+|u/`4eDendstream endobj 47 0 obj << /Subtype /XML /Type /Metadata /Length 1557 >> stream GPL Ghostscript 9.16 2015-11-12T10:24:42+01:00 2015-11-12T10:24:42+01:00 LaTeX with hyperref package endstream endobj 48 0 obj << /Filter /FlateDecode /Length 2371 >> stream xYK۸QBJX t)gk-ǻ;ćuP cI3l~jƃƔ5hzN)[ ֻ~w+ޮÿ^W5OR\/W~+[sbZqM1zE.6|=\&-ٶ屶P Uۄj2*2ŝtClpN כK8毗?>3p^ۥ@ NKͥtK2Σ+݀hN>+Ɉl#?ZIwWo߃SA30W&W·¬s+X5cmRf @eqM$:6lAEeZ1Ǫs)_^OLMc7\{eR]}):k)?H[ՇEf9P 7!PAPT+>V7-gߐbR[;I@rW0@h뜲>$ ]D=7Q %/!Z.R*ocC4Ӣ& 5ɒSD2;s*b PL~&93;!Pk|X7J8;.W _2щw㤍)p[-bށn_Wվ7 1Np(еZ8y+]&QF d=<ЩT^|evbA2Aį_!|INE*E``uj(5PKv3&(RJF C䟡GȿhgZ:.%xt;\K2mR3ͫ q7Z,w|K3 Op.Xkm uw|7 ^ k=>n"7X.Z$ B5mY k5D10 dPdG@| ]Qnm!kcSȵR7@n&o}f"@xSI@K9Q]: 5 ۩ۦlhdr\Lǎgod%[\W&f?r;@]z1'**J)Sn&gl쪡*8P8 {=ё 򧢃 '/s=:'3Hֳ:> {/`,/V;ٹ9h/ZO>zW/?2|.?\?tUƅOlt9ĝDK aP; vܠ}PY: Vլ4s7)G̑s.<=+uCW# spRMlȕP .;&qjHq`ϙj]]t@:05\Dhǒ⫥aA06F6TjI1A$n$SX2OQ#;eD>X|~2 dn敃klO<}x‚n#sM9$jZ`{Pi e0%nW6+h,.,4p*C?B3v_~_z;\uM(;f ]4+/ w$㜼kĬs/lȇ(,{Xgw$)6~Hp>r"B2ߣdĊ/ NG-}UWY#Jl*[=) ?DF&U| E᷎apǾ 77Y^T sV\͌Rg,ԓnt 0kQfTfTKT+{["\RRAFTOlȰG89<ԊG_*^Y0}Оɝ{;Uq0HGq՟ jm+,} 4crOi@4oJ_a2 x\ X#Lo': Fho$)vsr[? w>endstream endobj 49 0 obj << /Filter /FlateDecode /Length 185 >> stream xA 0 Ħ]* 0- Ӌ?v2/yQJ3ijόWp@]1\`r4)2ElOd5> stream xcd`ab`ddM*-N JM/f!C\nnE߷ }w^1,9(3=DA#4(\S[[!bhiiT QpI-LSP2Rs rSJ +/VQ9 'E1%*i.?X0~N{ ۽ Ɇ]^qgJ~g]Ėei目<mݼf_=B6~+~7Kwl^TlFVw> stream xViXS1UQlVkzuhZI؁@&a S!J P1" j-CVgmysɷzww @ Qkɦzm>h3X5<;a׼X|gsc?MϞ=~;kRA`@7b+ iFu\^D+O譌Ip)Fo2:JzxV5 %4,28d;=uz;cr Ш.љeJo5S?h^6:Je-MF^b,J Q6gZmrzZSjc*Lz\˝pWMfҨ6i.cWj4|^;*.2VLǙY֙h3c1y 644./w,!٤}mdX cGZn0h&OF#lb4Sr͑Kyvz]A,&srpܢeikgjWZ%ˆEbNN'&"WHb+xx&;nbBH'— ?BL)>?C/;\x@ 2ijr gT"9I$;GE*+kj)g9a %*;C][]dlYnꥠz(}Jgu:nX aY?HƕC/ Kd%hS8^WF K}֓c2 lN,݉5PѮNݰn$&5>}iL/֙йrCAcAy(<&u! 1XKP޸rtKc` ٗٙp } H;O2A+)7!e4N~DO@m {42( ;Zu-vbD z_d. %}+*8R> (9TTgE1>KRr7epUyPAb>4"y!x=ȴ~u*, hb-$n*W#yhs&:@w6k9ױdB9Ei[9/AtA1ƚJwi)**\D:mŶҒvKsZE:~>|A'9ekGQ@VA] 䗛F/t`e<:PXoKjTsS*?jBb︃*c6E2x;CZ,PwĿw$MՄ(mJ[ho͜P $8,s~&"_2ǫ!B2s̔"[qyboRGu 6Hَ:8S:Ɖ}+ͪDBiYeUeuіL +fjBN*aYl?U IY D z갽1?&CK4w!un쵋k ",.fy֨WNv۰űxe½lɅzwXX'zn 7q?Z](GqgZ<؇JPan5;՜}v$mWF=&Y7! v%0[\m8XQF5=s աl.@%%hk$ P6X/]c ÕmV7T7eF@hK(>B>gʫ xsxyM53{5C'էV=dsP+\$Ma+ÇqXiNozS^Ƽ3Bڅv(JMjBv?O&c"?_ ~6tEd]H|+n-W!,c/HCb/NO|aV]^L틎g6ԝRJcNkd?`ϰෝbAՔUUf ra !0U,7Et(=Lf}7zX\v/>%(IƝx i44=hNeE+ lJEB .Z ;f#},!ٰJ9tV5x s0o,{(!QPjzqzUŎsADBqHZ,[qq7~CqT~3.j #%.J(xx9g6(3O5~%A/juH8urWp| ,BI?;t' 5YjO'HciZD1`Ʌ>],ŕ^> stream xxiXSW@UZIS$Z[gmXgEq@eHIi1)Hyyl}mivmxwVo{=?saz~ z `0X{"ź"V,vY/)[V[QoN64wYi֕ߦƇf/~~s A{^/\hH, ^X}$ ⿋ "q J!%~pP߲wg{{΂(ALwXw D b—DQG$a%M@~X_Hb"Xb!1QD \$|qG|(V&N^( X |Q0yDg5I`XT,_"J,Ŋ2|/>J6iB\lXTȟ/BcZ@X(|W4$a𒗉Fqr.|Kv1]3_o$ySfSt̶Xg;wIȂvˏ v uFzqk~}w~{/h񒥇-_QA!\G|“x"' ob!Cl&b1p"~Vb)XF8ˉb'!XI=#&$1p f0b*1$k&baG Û&}F"”uSNY~ZeöeL%>IޢB_Jwyii}2}&yIvuoX:㆝]>=u u ɟ5~O9g}0#7PnfslǃoL9ڢл(bDG&ԻлD 7~ <obޅ%b}4Pr@A6ѪV@ w.*e#?O]((# 8_(}Ddi<9KII?픚L3Y YF)$D6Q$ؤR9Sp)|nUvu`@#l,;e,X*cg,hbmF߃~}8>e?$NVV &KQ,h /`V0>Fo.[w_ g.SO/Do!Do[Է.bO= pqN6L]|:$E"o8 w{n-XiI ;Ulr8.|sHV5|>m0L;),W``w {6ZH.҃B@x$h\u]9L%Y+ȍYbpmԯ5_|G@WUy9pFvӹCorkyyfBLVϐ[Ԫ 8cRIB zܕȇgo Fz Pɚ-%&a@cgWÎszhUrS 5Nr>J5aBC_T2S_r)~庆 GnmCeQszVT[Pa@&jF2fzIzI1)_Q#2bx Z52o ]΁!iwHL\f&8N*S-H̑ H@ϹmNghi` ΗF([ج=EOk3T), gxR̢7%IxKLXO5)Y =+#'b80W5:?Us*k'XQIz7^7X mkOO=Rm35DTG+u)\m{bY4qq`o$Fo< x_z RR(trc JT鱙 3DcK|2g,M+(EPYRЖwmW*耾/,P}:us-WS ϩFEM\!+o"1'TTr32[z꣼{Hd< .A)@@oQ.WІoKh)ԤxuRPQ[?/N&)0Ǭ3%E 4e$'A[J{HN)PWN)vk-o7,us'Je(3h"FLwhH s;t~zDŽ,Kf#6 L!H(7gp%cD+dSF(Z#Lթe^'kPj7e) &Pj> khuamJx:GI:ϐ7̼G/?W:gX7Xةف q'*&z@&&HO߁mf }:N=<"+]Vrmiw7^#ol@)QCxYΣ#IpQzƕd偭JfQ]t;ynMYꀹZKO-@4(L5q+ɺrM2Q}N1,(8@!qG*JI<^+ǘMH ov{Ћ -E59 o6V5$Pv}ɟà .*dSWe>ت> !y"gBo>Z5wpkpSMbj#&{NwnMeɽe0ܵ`ԏD(ζAǩ, \QS[HI;q̦M&t`rD%e*}#LGSm*w Xq4񾍂>YO2zjLxbײS6e,3*$Wy2~P.9',,eE\# 4qC8\Xo. %EbQrm?=t`jIY6]M E&CiQinʫdWzi1ɬ, )96hJ{PIl62{p,YZ AG߆CQ;85,Ji(31%ÿ2A؁b'JH~{<$!\.~9 FA<);hÚd=dZ;egx#.ϏΆ|"ˍU q# \Ub1IhA>V6{>k?TuP/5 Ua1bj,FUpˢK倪6UTwݽO͋H\Cx1fzez3q{mɗh`E A8(Ϭ -*Sv>lXQQdb\,InHyɄ9 K7g xz:\<0w/"YdZޝh 7X={=Ǧ}\HM[ 2\J!Dݛ-Ծ{Xw\}r;~_vL!(L}f0e2A'16׷6 ИZlP,vk'!@}٪ qp|8P7e܊p x;Y j97T ![yh? *7a۫HWnPЏ%Ǯ{pL S${$rĖ;=_|7A$dHkK6%ccPe& '(  M%-u>p :u,62YG"VB&L<,!KˆIhd|&g8cb)?:T0"pñnK=md frbR`V͂Kܑ\d ,ƳHT%ihjlTGﴲ#L0ݭgPEz`&3$ | (VkippA!  7X3]o NA, ֗+a6P*&ŔURjt(i|' ś38Pg.퓆s#J\GQm֓5ЋgJ*W.yYlcVTqB_#MNLV啲jea"q2y\D r>c38>c'$Hq4XX* a]pLP%FSezf dT5^xq+66j-R&I2ߪdBVP6x;egs 9:J%%\F9BSIou`cǘ[KVR23ӰJNR*-dkO;iuT["'2R~q1+%l0VREٽ9E)%1YKJKǝ1!%T 6}{׻5}K3ʄc,*]Hy7M/%GAc$]rE,E q[Ϟ@˟6X>&P G&>#HVn H/o@U(.Xyyh4H{\`Z1 #=9-olU$zz7h7/l8 хGdH4 oNt37lH9Zb֊ =d%Uep*u&P jdPpfQRۚ|ԎR*-⮪T2oɐ'SkZm pb5@\D<-Mmh \3D/Q ,SI?bVp 0@nv}^M$`"b 28-=)^.$OQ l\ WEr#%ExPRcb=]oh0nK}O WjW f7Cc%aU|}VV>W @F}.9B̃:`džqsޅq4~q\o01>޾l)ꗥ\sD:Zi lM+˾]<3媾c\փ#!5rmnj:iAm?mh|ZΚ|W/ 6zuŻgzOsUȊES<g$M(6X ~e*xF@}~t%Z<@+p6F4666GE3Μ3̄VvB+uL_ms\GYzk?CE?d=v_,Ë_d=v̲U7TWKE<_¢:}ŮӹP8ur܏^FxR-^>q2jC;hnyXy ~#W'>P{yi(z2k(k; KNSّ](ump-dG\iflz ^j??l+VTK;pQ$]?W͌Io?|GkZ$]Jf0d]~AkCǙN5vc+ǟYM~NXc^_]ܩ25D{4 :nPYuǛ:o}F>]ݢNĥ>ac `>xG(#r 6+ } fn6"$ Ptx"Z3_k ܋Ǖfz%:4* F#WU|./}[:fߗ4pFTkQZ @J@TzZ9yMGA0jLbe4W6?yX[CmÊ(BF; g-\VYg4A.1aU7,bK$>S:ㇿ}yW{,`"ٿ\gZP~w\P07"L!wLgG @=v_ɪ< ٨Y8?ظt0{M.wwt 'Ay~$=u.σꌚq`}&q&Y![(q7<=;[7Ǣ%&Ʊ3>uno<")VD59z PW(Bbbx"s,e`4MӦ=6 7Qendstream endobj 53 0 obj << /Filter /FlateDecode /Length 216 >> stream x]1n0 EwB7qZ%C 4Xd{E'2%~Vâ> stream xux y6diIuRIcGbbPX{y$q^$A7jw%qHvWnciӂl:@{6{}l¶\mڴis#sa [}fSﳛG~d3\eW1Wjr' 6m_3{'Nmv-7n[{bۮܶ^nxvlw12?{~o{ޱk{Ǽv}}rdbxlfc^ضŝ莱;.5926n{]f>}E þ<7ޯy#_}xN<:ߜ?ް[nnǰo`c`ql;M :[ؓط{{װ[/a/c_ۆ]m....Ƕb\ {MĶ`lyyA͟<9%;p݀q#x)9yw9QfwЅ~Ozh㏆D(ag4L¤8)sZ,%_ؑ;jӨkrGYV58 G!f 0|GWYI̧@<#hRl4G#HRi1ZhšwbCՊdH Ux%^f4R#ep5 RLax5h.GVRH$P!^p<<>/1EÉ'ah#Heiz%N!%h4,WoQ0ᣆ/Őhl3jpafRW[ІVA5jX ӹ$U?3CN_6\JSnFwuEXp<-(t_) {/xP^2H^mU -.VeCVTEjy ]tS> iw< a)ERT4p+FɞlF4dqZ^חƪx ^өS1Ɯ>ݮ?w /ګ? |%'u~-߷ΛQlo}߆Q|69ͷJRSղQ)2L1#T1%&D1^շWT τg/5A6ϙke>i|woom Ɨ" 1 #cd(ZȖb%W⸒ڱR\mF"!lKpx,%2tZy:8!P"+%i1-.Y>+d  ~w|@%uU4(UKUuXa}u@Q[ IC-)Qo E@)  U^iDTRB.)H ~b5]Tu>QxӞ|Cz|@p2??8<Oȣ1UwMw'=DŏZ)X=lX۝ӀPC Q!dYB)>- fs4~C]:} VaXkW+sO?R[jb]w:2T8JVkaк> `h: mu]_}֘+OIa f![̱s}3!(ʼF2K̡*3^>=85>B?xB&F͸-UaoKuT.0 "UZIqSB 4d ]@`D??t"3&?1u-O8s󬍢wmkWvd)υ(">v- <+ϔFjdkrTǞ)w Q'9!A'\N\VVzj\aN-徿茎>{9W|^T[F1ִI%x^IgGWCռڼ88m|!wF~{ʨ2OsٍE%n=:iDiE^:zU" U<Y[Iq#l [)M )x2} 6b=$AQ )D81/|e@" 0%`yҳ07.|wymkbT(%D=_A[KUcL+d.KC O2ի'N>x:ΐKHgВr]-놮TM.rl;Պ7 FVFH^iN@\&2FROjq9).9ra S>t>n\z[ZFMi)%d]LbmW bRLgR8B2"GJ(Y55AԢ"˸kny\ACHhYĈ6^ѯ@%ܠ&"ߞNA yZJܒ5nj%saJŦRQm%('ʜJ+bPf,ҟ~()&J@Y4D-]Cg9O\ סR|lnqe oYt Ҏ0FMq뾍.=[vn:#Li\eK. ^pnr*qp sB@ yrZAa6l}mOEeEղ|YQWzrGq yGJ(_<,@?qw/uW[K;ϛ+5*ʐ˲REVW0F@8@8,qp D!bK ɌG/ 1O^sR c#YM TtYN)@L}gyWj$>޴?揇0Eͅ>E*DִK҇6W2'#dcsy=*cXgY$d2!`fYC!,29?",*JCV CCSjM2մ4:SfqxH3ڴQBrH!e@DRYPAܨ#) M6YVH(̇ƼEty'"DD$O"RO 1qa3A'RXS kRat;|/(?=rh 2̯m}wlc.goX\478BΓ+lM >_\mޯ;a0QȞr ĺC]f(Чܒ%~ Nk߸ 3q"Ip) Yh*&D.Gň-#]tu_hVx#?gl k\m XosA$N;_[+'1݈14K#OS@Wv -ij\&cgcc1nƕkG#i=82~}ʰ2ow'WfWfx/Of!ϒFֹܑQD@ozέ#}4rzLyJ'qiqn 'b7{fag;kV-SOO9N}>>8;2xx{fO͍7ZGB$d>)y9UA?@Uf~|pw[oGކ'IfEyFfD+#Xs7mox:Z[k֪Er\}V|^&_`N'k">epbiE^Z\1Ԋj ;]BW(#.(`>3el\A61o"Z=a[?!?rb(EIBH%UD H1PhrRiK?D6,p LM\,Q4!tܳssaSogH/dt6 nQ,ʲ4YS4YE*U3i " JEA9 Mdl6<yƒ˪n|~IyOU{.G/:ff9z'Paz/+YՑ<~yKqn| q:1Sރn|͹q5e+7yu<я.^u%/RAR O w?endstream endobj 55 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2033 >> stream xUkPSg>g,e-i0Lumk)FĐ H\pHUP]EQZz+ڽV׽u|'Swf}}= K ':PijezKʛiD+9%˜5t»0a bi`: /W<'ss9 i]>nZce,πpW5J\8+|Bc;|&f`ɸ J8OAHBH|-bT:B"IL\JI^kB@J$3F\+QpScJ(jh,dJ&uTKht(NF]D% lL--u3*z]H'dQH .KJ(& zLxCSy_]K4YYX{%*uKB+$Z,d3!߀F"֒i*/A1IG2HBDd7. Br8ߒaaKw.bI;*t|s|̇G|f$0.f<~߀?}[h.O(\G1= lȅ}>%8?H:Psp{`ށ[P`h:MH' mѡ`p\&[EAQxRaW+rlfm\##Ó@PGr'nF.$(m-hިS\TUM;7unVL 7nQb@S![煫9ŝJTbZB a"f6?xfpZlB&uܬf oP0+fUN yiE'PQyy'w%բTjSirA̲A #`~;w\@Ta$T5Ntw<+0N'5D 33cO>M\p+GhQ-<始eFLfˢqvY6^-VPmǎ3 1 q3{a`JȦrj8/5>eZfkijX\!`d=dNۃv&μj1YP#<_YoCKov.|_j4jg;N~(i#3mAQo\|:T`^g-̺3ߺwe! @FB/W(EaS  iz;9̚ta43w⯋t 1[=.+ %%F֜zx069\`8p`譋miYNMdvڀs4AYq\(ף H I\ Z @tYM`ky6@YJN0C]< n>.;Ϭ2..Lq0VEU )d@4uf: x3}JѼhuӴ6eIrH$J L 掊=9u0jwWNu s miqAGlm(_~UC>~d1.uzj~Q5KOk|%09&?Jh]`"-&Ne_B;tCŮNyAa,1%dHR>R6jڃeݭD23s6؄[㲳K,jL9 G0gAnOj> stream x%mHqj v=fZ/ˆ FO/ei)e]n;LݚN5u[W鴖"z }PF_\AFχ@ PI?,PWZhe_v9^O.C:lB,{]1me$b@mNVћw;$ɽk6[ĸ"^ݳ:%]Ɗ<'чK+?nXvVBzٷ rTR7_H" o+iWUcؒ&޽sFCZt">8^ߗj]EGk;AhnC98&7m|Л4~F+K/EG)pٶWo]R##T뉶*[r> stream xYIt{ _eVYKELe܁R`p5=I 7eRdի~{_61+J7"/~W?qhͅIaMLx"6R$l."뙾~Dt?|68#Y}4vؠ9h*|ћ-E8LͰEtǷ$"Bj8'ݥAmz@5<52$XtE}Ӽ^oSIJ[*z D`j={ =oGcM$WsBD=*X* 0P7NuPn ST8E͢B>MiW,N'+$I$U2-J)q>I>dIYAiH!Hc14I\;*߀ψN~TfT!uёԒs];εUj͹W`Ukۦ"i?*"f-8i*Tv)!ՂOYsvl>)oO ttk?00ܹ4ǡi ]qk8Nxc㯘L]:XF# $.]T..)̮KY{ ̕ c JFJUĆޥNr3d~HN`3ZRy:崪ߏp07[s; b2M*fU@5a<,J͸GJ8 YKdq+PD_jD{ 6* b Jj-~G.ٚq9-4y6!p*UvZ $tPO(ާ;Y\7 Y I$@ϕC= F0q DbbvNe:Q,q3px_deI/Lu {12bl6<;hQ"C ;wوlЂ%k5@.CgkONg4E$d;պ/wmA)_te#ޢ*d+` M ΀ ӓؕ1trfRYbd,a@  OP-q;0$,0R邰4sZGD sXr, WXtJ8[uj1ٍɌ'3DB-yd&䍟\˫w)3>ou;Mc)9eSʳ=΀%[l,83כ$9K9PehCޘcPxJ}-"ׇCy-PK0pzZGoʸB˳X8 ϩŏ{NM.邿9.rn(CU67&B(jW~.p )ArsT=0Lm=b)> )] ]iT#>&@Cu?n*?$5?Gb$l|z8qZ AW[| .R|\I͐br80ݯAYf!-hAr$l4T lJQޘ|0Yo hxJrEH4~.֘-q}ض_vO?Bt~/xUQ[k3=}w J@|6#y 96F c q հye FEL&3tH,#I"䈡8D/D}8*0$!|􎦿5C>mߎ`6(1!ǟńYE=0t`PCk|roO&26XraPMSSϟO=g0)ْ;5w#\92t18n-"$t"c]FTi.&Qi7I/G!,|DE q_%v BXܬmr_]XZ{HI\JH 'ON a|'nZ6C‚20C՜a O`m>N&> {Qw\})BD2AhkF°φ–#PUutLza7"M Ik^O>6! lzq@aWimoMhhendstream endobj 58 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1041 >> stream xR]LWݙ]ʆlCk%'U(mn7 ݽLfƙY:aqWPXd+hJhBP>O4Mdӗ&&4iؾYfviҷܜ{s]$Ipm yjwe +yVPOTj>5 PlJemmB6Kfb'22Zl2bav,5K< 9K~If654;p(Ed.ԪjP .$=fyQj Cp=o˻zeް} (ʀ_(8 R  9j~( AS3B9= UÁHhm&bRyEEU2'T־ޣʪy]3a ̀y,'(@Ag#I%Z aB@!VPYoec>YI#kZ3}NU tLY7;ϳ AX<x8H+ 1LIf !QZǷo-]U_/8#Q;soh`M2a':'\ P_G<#pbpr\Ja+bR.knr j1T4uc>O۳x+ 1T츣"}F$DrxaIg4z\?ՕxSndq&wv|v4W/3i zecBZn2~±Ŏ21*jx<΢ptq\KJOяV>¢fTԈ-=U89Ҏ杖~-*5gZ);=x)*5֟1:K1<>Qh _K·wni域Jkn̾ZddUWvqLHBϊ6?>?ro+32Dk%am=Sh|;N^\2S4z/M%) ;|0WcMQ+8$7>v??g 5y幹Qmeʶ endstream endobj 59 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 366 >> stream xcd`ab`dddw 441UH3a![Onn }=U1es~AeQfzFFcnjQfrbobIFjnb ZRaQRR`_^^[_nPYZZTWqr-(-I-ROI-K/JMR KsEYt[vw?g;O7DgN8{JՓ>CvR{wg7G}sSCim?3wwySWswdÔi}ݓfX;Vt˺kg)./=GxOlo-"Vùy620endstream endobj 60 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 742 >> stream xmHSqfrsTTJ27dZe_zs^ܜw[wwJCﯔ8gZr+2p 0B{aF}CK3O\W4זu۲<$aqҬ 8#IEC|χ.2;ňL.ӧiҥab:X?qEMendstream endobj 61 0 obj << /Filter /FlateDecode /Length 3021 >> stream xYK6q{WmY Hj7&;yXU>x(1H'#_v7>ƔqLETs=e$,CagLc/1w]#}zSlԟ@k \)/b^۔LVxI JL3 e.`fLi]ɩϪ%&MYw&:iނn"ߝ,nF`3WE6IUMι?NỎrr$Z\۾ZcIQ>ڐ(u{sN!2ΐ-Hԏ© wd~985 3Nϻ$~CG" ).f !m^K{+زIioA]Q%̓]+l[i@J]5l` u0?pb$clL .n ?MҰEdYW*7noIh CH$隲0 ~;b͐!ͧsF?dɑ_r}cv_JŚ*YC"|*QRȔl0&`&ݡ!֡yMY$o ӔjѢpƵ עBt&We@=wv> ? |X LbWC(2IޮAq;θw?i7R`"Ѯ*S=,9ui1˷|.fP ࠓ==CV7oȞT]}q{R_ǺGvd0dݽX+Zn1DP&oroSb{Jqj0G% ,SO}Y:1fп|r{45N*2o'0L6j)v]<j* ȕcA.?&T0HyI[ȟ36i= YqŊm]M*m ȶyO<ATź3vЙ(AI6C7/$56S*[Va=?8'XJOPSg^Ȇn UsM j{]€Vk^ a6Lc T<Y~noRN?gǢmgv}M^5Pλ._//-m|u@k?~* GFOF#]/+E]eW|` dl7^XB~@\;;U:!0 Ϸ}Aپ.ʝi= C|ea "cdDTճa-b9H/DtЧܴlZGBUc-a>雮nN8UTغʠq"$J=j3*,OJjoOҴU(}Dpw:%ͥOXy/}@h7 S 272_n@\D2,%EA4NOOoJ/Wу5endstream endobj 62 0 obj << /Filter /FlateDecode /Length 3105 >> stream xZK N``qrRrU$ȅ4Z^5t ؕD:_wݣW)߽tukj?Ow8B 1ͤ0&%\UR"9[3s1~Bs|߿q7d6ף S_92#B&> N+k|%)bM1F&7\`T-i}yyL e_IwC]X[&uGd`Ǯ ⴾb;a7z)\oQx/ M~(Ft%ݦiwE[A_7LCm9,Hv9a 6<~p1 GL&fJbΚ?72usrn֜Xdڟ"Hy}B^@0J= YʍyUOf}o$2a %n©{JD&uX%2i t3x~])(fN<#:I]-@62?8pv~窇%#>;f"9D=mltbWpYl#P{  !@)Qe6G0,]_tv#*͢5m M(xGeHϔ@IP]?w-'4v"jCi$nc*| Pl0"n! +R#`qԁhDw*[9d4T7I5VmSukBF;D|:5mB#.>\XcM9K  |ׯ]VEmV@\ <)'rξZ@l'GĽ' 3pa966JrqE ^L&": qxǥ 1:4Rb> XDPer56F$UZa۾[Sq0]g`_@ˑ!D/"ec,A5Z&l3XaC2, X8|y~ q00|B|O HzK1Q!2T/k$"s\ :EhUe~s15*wbKP ٓ_2w90H, 1<" \Ե /xp<,/7P>-T]ZJ|.0"y,3p[~XڞLȥ0>4%6T[rvծj[⺖[a|( mS VwݬB}z5WЀGAI\*- 2DT[_U=?DdpЗ`8:{/Qa^ޘݩm&5d-Al`:,yAĀ nE.jE ykN7R5ӸgcP^"~r&OlعE]-]N1ف}X Pl3(;GۗxJ}U83ߙDPR;@C=7L oHۤ#JvO;dZy( VT_Q% ޟyM7"B M?k#O56]KgI{>e-n\ӸoG[0pˈ,գexI?:j`;&o}[,cCE0)jmp|ߗU?΄p] Wk ny `3nx,y\66`agvûsDqH}#ZCJd^Ch;T*đYb"*iq@M]iobA9$ͅ]ɥ+/|G<`&!Q(}Q)$=`ؙ?6nlXjIX,qZ0c~jy#8ݐb9K2 ZV$1C.ȩ$Ăp={?$c$ sa+F!G _9 ~kn564bz }hH^osDFune/Jێ ͅϕ"0 S.BqO`G,Qv~5S56]F.+*`N'Oͦ<.9" ZגbRs1|moP/|ǡ |7ޤ8>f]L(%6ڰa>r/W 9r{y_9XNʫ~xu='v=!?v}f<>s GlH#ZJߜӹO"I``C N>7 t"x`Uٓ{x1^Ëv[fH x@X|_cmOR(~ݻ&?/Lca}p) Hv%%83}@ RI7b/xk>bo* nhXC [؛S?=E]b*ڭ'X拻g1,endstream endobj 63 0 obj << /Type /XRef /Length 87 /Filter /FlateDecode /DecodeParms << /Columns 4 /Predictor 12 >> /W [ 1 2 1 ] /Info 3 0 R /Root 2 0 R /Size 64 /ID [<24863c7735bea487e8ff2344599e926c><198b20470d1324c40b1a08ad6c6913fe>] >> stream xcb&F~ cΉWҁ@H m 1 ! Hpz P+@%8HH , X endstream endobj startxref 38464 %%EOF eRm/inst/NEWS.Rd0000755000175100001440000002720314505105525013044 0ustar hornikusers\name{NEWS} \title{News for Package \pkg{eRm}} \encoding{UTF-8} \section{Changes in Version 1.0-4}{ \itemize{ \item Fortran code for matrix sampling updated. \item Bug in \code{item_info()} fixed. } } \section{Changes in Version 1.0-3}{ \itemize{ \item Bug in \code{person.parameter.eRm()} for RSM fixed. } } \section{Changes in Version 1.0-2}{ \itemize{ \item \code{NPtest()} can now be applied to matrices up to 256 columns (Fortran code changed). \item More flexibility for the legend in \code{plotINFO()} added. \item Full and 0 response patterns are not taken into account in \code{SepRel()}. } } \section{Changes in Version 1.0-1}{ \itemize{ \item Legend in plotjointICC now uses proper item labels (and better default colors). \item Corrected item-test correlations added to itemfit. \item Sort option in print method for itemfit added. } } \section{Changes in Version 1.0-0}{ \itemize{ \item Additional tests in \code{NPtest()} added. \item Toy datasets stored as data frames. } } \section{Changes in Version 0.16-0}{ \itemize{ \item \code{PersonMisfit()} incl. S3 added. } } \section{Changes in Version 0.15-8}{ \itemize{ \item sanity check for missings in split vector in \code{LRtest.Rm()} added. \item smoother confidence bands added in \code{plotGOF()}. } } \section{Changes in Version 0.15-7}{ \itemize{ \item \code{LRtest.Rm()}: bugfix due to updates in base R. } } \section{Changes in Version 0.15-6}{ \itemize{ \item \code{plotGOF()}: added arguments \code{x_axis}, \code{y_axis}, \code{set_par}, and \code{reset_par} to ease customization of the plot. \item Imports functions from default packages packages, as required by the new CRAN-check. } } \section{Changes in Version 0.15-5}{ \itemize{ \item implemented an \code{anova()} method for all models (except \acronym{LLRA}s, which have their own: \code{anova.llra}). see \code{?anova.eRm} \item added a function to compute separation reliability, as proposed in Wright & Stone (1999; see \code{?SepRel}). \item \code{plotINFO()} accepts more arguments via \code{\dots} (see \code{?plotINFO}). \item fixed a bug in \code{plotPWmap()}. \item fixed a bug in the internal function \code{get_item_cats()} related to \code{NA}s (affecting \acronym{LLRA} and item-information functions). \item switched encoding to \acronym{UTF}-8 to avoid problems with diacritics, etc. (e.g., Martin-Löf). \item updated citations. \item general improvements. } } \section{Changes in Version 0.15-4}{ \itemize{ \item streamlining some functions, updating the vignette, etc. \item warnings are now treated more consistently and can be suppressed with \code{suppressWarnings()} \item the \code{plotGOF()} function was revamped and tidied up in a couple of places, e.g.: \itemize{ \item the plotting order of elements in a non-interactive call has been changed to put confidence ellipses and lines in the background and text in the foreground. \item the \eqn{x}{x}- and \eqn{y}{y}-limits are now dynamically computed by default, so that confidence regions and ellipses are inside the plotting region. \item the leading \dQuote{\code{I}} before item numbers has been removed for better legibility. } \item moved \code{NEWS} to the new fancy \code{NEWS.Rd} file/format } } \section{Changes in eRm version 0.15-3}{ \itemize{ \item an error in \code{test_info()} was fixed. \item \pkg{eRm} now depends on \code{R} \eqn{\geq3.0.0}{>= 3.0.0} } } \section{Changes in eRm version 0.15-2}{ \itemize{ \item an error in \code{Tpbis.stat} was fixed. } } \section{Changes in eRm version 0.15-1}{ \itemize{ \item a bug in \code{person.parameter()} has been fixed that caused the estimation to crash in some cases. \item a bug in \code{thresholds()} has been fixed that caused the routine to crash. } } \section{Changes in eRm version 0.15-0}{ \itemize{ \item the \pkg{RaschSampler} package has been merged into \pkg{eRm} for convenience (still available as a separate package). } } \section{Changes in eRm version 0.14-5}{ \itemize{ \item the package is now byte-compiled by default. \item some statistics added to \code{NPtest()}, \code{T7} and \code{T7a} removed. \item fixed a bug in \code{plotPWmap()}. \item fixed the \code{mplot} argument in plotting routines. \item fixed the split-criterion \code{"all.r"} in \code{LRtest()}. \item deleted all usages of \code{data()} in examples, since eRm uses \dQuote{lazy data.} } } \section{Changes in eRm version 0.14-4}{ \itemize{ \item when calling \code{NPtest()}, the \pkg{RaschSampler} can now be controlled more specifically (\code{burn_in}, \code{step}, \code{seed}). \item various improvements and bugfixes for LLRA-related functions. \item person parameter values can be extracted now for all persons using \code{coef()}. Additionally, in-/exclusion of extrapolated values (for 0 and perfect scores) can be controlled via the argument \code{extrapolated}. \item LRtest now computes standard errors (\code{se = TRUE}) by default. \item plotDIF now plots \dQuote{difficulties} for all models (formerly, \dQuote{easiness} parameters were plotted for Rasch models). } } \section{Changes in eRm version 0.14-3}{ \itemize{ \item minor bug fixed in \code{plotGOF()}, where on rare occasions confidence ellipses were plotted together with control lines (spotted by Peter Parker) \item improved labelling in \code{plotjointICC()} } } \section{Changes in eRm version 0.14-2}{ \itemize{ \item warning regarding group assignment when using median or mean split removed from \code{MLoef()} \item modification in \code{NPtest()} to split long output lines \item changed the delimiters of \code{plotDIF()} confidence intervals to \code{pch = 20} (small bullet). } } \section{Changes in eRm version 0.14-1}{ \itemize{ \item new experimental functions to calculate and plot item and test information (by Thomas Rusch) \item bug fixed in the calculation of item and person Infit t and Outfit t (hint from Rainer Alexandrowicz). \item \pkg{eRm} no longer depends on the \pkg{RaschSampler} package. However, it must be installed to use \code{NPtest()}. \item changed the delimiters of \code{plotDIF()} confidence intervals to \code{pch = 20}. } } \section{Changes in eRm version 0.14-0}{ \itemize{ \item new (wrapper) function \code{LLRA()} for fitting linear logistic models with relaxed assumptions including utilities for preparing data (\code{llra.datprep()}), setting up (\code{build_W()}) and modifying (\code{collapse_W()}) design matrices, comparing LLRA models (\code{anova()}) and plotting results (\code{plotTR()} and \code{plotGR()}) (by Thomas Rusch). \item \dQuote{exact} version of the Martin-Löf test for binary items and arbitrary splits added as method to \code{NPtest()}. \item in \code{plotGOF()} confidence ellipses can now be drawn for subsets of items, optionally using different colours \item new function \code{plotDIF()} (by Kathrin Gruber): plots confidence intervals for item parameters estimated separately in subgroups, uses LR objects as input \item adapted the \code{MLoef()} function to work with polytomous data and more than two item groups \item error checks in NPtest: \enumerate{ \item 0/full responses for items meaningless for NPtest, \item group in \code{method = "T4"} must be of type logical, \item specifying all items for T4 gives meaningless results. } \item warning regarding group assignment when using median split removed from \code{LRtest()} and \code{Waldtest()}. \item some modifications in \code{plotPWmap()}: horizontal plotting, different default plotting symbols, option to change size of plotting symbols \item bug in \code{MLoef()} fixed (now using logs in calculating the person contributions) \item \pkg{eRm} now depends on \code{R} \eqn{\geq2.12.0}{>= 2.12.0} \item Latin1 encoding removed \item bug in \code{plotICC()} (always same title) fixed } } \section{Changes in eRm version 0.13-0}{ \itemize{ \item \code{LLTM()}, \code{LRSM()}, and \code{LPCM()} work now for repeated measurement designs with treatment groups and missing values. \item Rename vignette to \dQuote{eRm}. } } \section{Changes in eRm version 0.12-2}{ \itemize{ \item new function \code{plotPWmap()} to plot Bond-and-Fox style pathway maps for the data by Julian Gilbey. Since calculation of the \eqn{t}{t}-statistics requires calculation of the kurtosis of the standardized residuals, according changes to \code{itemfit.ppar()}, \code{personfit.ppar()}, \code{pifit.internal()}, \code{print.ifit()}, and \code{print.pfit()}. \item \code{plotPImap()} patched by Julian Gilbey: length of \code{item.subset} did not match the documentation, warning stars did not all appear, pre-calculated person.parameter data can be passed to the function via pp, mis-ordered items can be coloured. some minor bugs fixed. \item the optimizer can be changed to \code{optim()} using \code{fitctrl <- "optim"} and reset to \code{nlm()} (the default) with \code{fitctrl <- "nlm"} \item value of \code{LRtest()} now contains the list \code{fitobj} which contains the model objects according to the subgroups specified by \code{splitcr} \item \code{MLoef()} no longer supports missing values } } \section{Changes in eRm version 0.12-1}{ \itemize{ \item function invalid from package \pkg{gtools} integrated into \pkg{eRm}. \pkg{eRm} no longer depends on \pkg{gtools}. } } \section{Changes in eRm version 0.12-0}{ \itemize{ \item for \code{RM()}, \code{RSM()}, and \code{PCM()}: eta parameters are now displayed as difficulty parameters; \code{print()} and \code{summary()} methods changed accordingly. \item new labeling of eta parameters in \code{RM()}, \code{RSM()}, and \code{PCM()}. they now are labeled according to the estimated parameters for items (\code{RM()}), items + categories (\code{RSM()}), items x categories (\code{PCM()}) \item function \code{MLoef()} for Martin-Löf-Test added \item \code{df} in \code{personfit()} and \code{itemfit()} corrected \item the \code{logLik()} functions now extract the log-likelhood and df into objects of class \code{"logLik.eRm"} and \code{"loglik.ppar"} with elements \code{loglik} and \code{df}. the corresponding print methods have been modified accordingly. \item method \code{coef.ppar()} to extract person parameter estimates added \item option for beta parameters added to coef.eRm \item in confint.eRm: default \code{parm = "beta"} \item minor modifications in the help file for \code{IC()} \item \code{plotPImap()}: revised rug added, bug concerning \code{item.subset} fixed, minor modifications to enhance readability \item minor modifications in \code{plotjointICC()}: allows for main title and colors, option \code{legpos = FALSE} suppresses legends, dev.new removed, \code{legend = FALSE} produced incorrect labeling \item minor modifications in \code{plotICC()}: allows for main title and colors, default coloring with \code{col = NULL} instead of \code{NA} for compatibility, option \code{legpos = FALSE} suppresses legends, \code{mplot} is now \code{FALSE} if only one item is specified \item plot.ppar: dev.new removed \item option \dQuote{visible} in print.ifit und print.pfit to allow for avoiding overly long output and for extraction of infit and outfit values (maybe changed to a coef method later) \item \code{strwrap()} for NPtest print methods to break long lines \item new methods \code{IC.default()} and \code{pmat.default()} for enhanced error messages \item lazy loading package and datafiles } }